我一直在学习随机抽样方法,并且知道Numpy使用Mersenne-Twister生成统一的随机数,然后如何将其传递给生成不均匀的分布?
例如:
np.random.normal(mu,sigma,n)
这里使用什么算法对正态分布的数字进行采样?谢谢。
答案 0 :(得分:2)
您的总体问题过于笼统,它可能(也确实)填补了entire textbook。
也就是说,快速概述是用于生成非均匀随机数的技术属于几种常见类别。这些包括:
在this tutorial paper的第4.3节中可以找到1-3和5的每一个的简单示例。
在实践中,经常使用这些技术的组合。
例如,正态分布无法通过反演来分析找到,因为这将需要能够为CDF编写一个封闭形式的方程。
Two popular variants for generating normals查看极坐标中的法线对,即以方向和距离表示。基本的Box-Muller算法指出,方向是从0到2π均匀的,毕达哥拉斯告诉我们,距离是基于平方法线的总和得出的,该法线具有卡方(2)分布(卷积)。 “特殊关系”告诉我们,卡方(2)是指数(2),易于通过求逆生成。将所有部分放在一起,然后转换回笛卡尔坐标,就可以在Wikipedia文章中找到这对公式。
第二个变量是Marsaglia's Polar method,它似乎是method used by NumPy。通过在一个正方形中随机生成点,并拒绝外接圆中不包含的任何点(接受/拒绝),可以避免对正弦/余弦先验函数的求值。然后,它使用相同的卡方/指数距离计算来缩放结果,因此还利用了卷积,“特殊关系”和反演。
最快的方法基于ziggurat algorithm,该方法将法线分解为层(合成),对某些层使用特殊关系,并使用接受/拒绝来处理层的尾部。 / p>