簡體   English   中英

Numpy如何從非均勻分布中采樣隨機數?

[英]How does Numpy sample random numbers from a non-uniform distribution?

我一直在學習隨機采樣方法,並且知道Numpy使用Mersenne-Twister生成統一的隨機數,然后如何將其傳遞給生成不均勻的分布?

例如:

np.random.normal(mu,sigma,n)

這里使用什么算法對正態分布的數字進行采樣? 謝謝。

您的總體問題過於籠統,可能(並且確實)填滿了整個教科書

也就是說,快速概述是用於生成非均勻隨機數的技術屬於幾種常見類別。 這些包括:

  1. 累積分布函數(CDF)的逆變換;
  2. 卷積(隨機變量的總和本身就是具有不同分布的隨機變量);
  3. 組合(使用條件概率將復雜的分布分解為更容易的部分);
  4. 接受/拒絕技術(生成隨機的“猜測”,如果違反了目標分布的約束條件,則拒絕並重試);
  5. “特殊關系”(認識到某些分布與易於生成的其他分布具有密切關系)。

1-3和5中的每一個的簡單示例可以在本教程的 4.3節中找到。

在實踐中,經常使用這些技術的組合。

例如,無法通過反演解析找到正態分布 ,因為這將需要能夠為CDF編寫一個封閉形式的方程式。

用於生成法線的兩種流行變體在極坐標中查看法線對,即表示為方向和距離。 基本的Box-Muller算法指出,方向是從0到2π均勻的,畢達哥拉斯告訴我們,距離是基於平方法線的總和得出的,該法線具有卡方(2)分布(卷積)。 “特殊關系”告訴我們,卡方(2)是指數(2),易於通過求逆生成。 將所有部分放在一起,然后轉換回笛卡爾坐標,就可以在Wikipedia文章中找到這對公式。

第二種是Marsaglia的Polar方法 ,這似乎是NumPy使用方法 通過在一個正方形中隨機生成點,並拒絕外接圓中不包含的任何點(接受/拒絕),可以避免對正弦/余弦先驗函數的求值。 然后,它使用相同的卡方/指數距離計算來縮放結果,因此還利用了卷積,“特殊關系”和反演。

最快的方法基於ziggurat算法 ,該算法將法線分解為層(合成),對某些層使用特殊關系,並使用接受/拒絕來處理層的尾部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM