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