Numpy如何从非均匀分布中抽样随机数?

问题描述 投票:0回答:1

我一直在学习随机抽样方法,并且我知道Numpy使用Mersenne-Twister生成统一的随机数,然后如何通过它们来生成非均匀分布?

例如:

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

这里使用什么算法来采样正态分布的数字?谢谢。

python numpy random distribution sampling
1个回答
2
投票

你的整体问题太宽泛了,它可能(并且确实)填补了entire textbook

也就是说,非常快速的概述是用于生成非均匀随机数的技术属于几个常见类别。这些包括:

  1. 累积分布函数(CDF)的逆变换;
  2. 卷积(随机变量的总和本身是具有不同分布的随机变量);
  3. 组合(使用条件概率将复杂分布分解为更容易的部分);
  4. 接受/拒绝技术(如果违反目标分布的约束,则生成随机“猜测”,拒绝并重试);和
  5. “特殊关系”(认识到某些分布与其他易于生成的分布有密切关系)。

可以在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,它将法线分解为层(组合),对某些层使用特殊关系,并使用接受/拒绝来处理层的尾部。

© www.soinside.com 2019 - 2024. All rights reserved.