[英]How does Numpy sample random numbers from a non-uniform distribution?
我一直在學習隨機采樣方法,並且知道Numpy使用Mersenne-Twister生成統一的隨機數,然后如何將其傳遞給生成不均勻的分布?
例如:
np.random.normal(mu,sigma,n)
這里使用什么算法對正態分布的數字進行采樣? 謝謝。
您的總體問題過於籠統,可能(並且確實)填滿了整個教科書 。
也就是說,快速概述是用於生成非均勻隨機數的技術屬於幾種常見類別。 這些包括:
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.