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

时间:2019-04-03 14:46:18

标签: python numpy random distribution sampling

我一直在学习随机抽样方法,并且知道Numpy使用Mersenne-Twister生成统一的随机数,然后如何将其传递给生成不均匀的分布?

例如:

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

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

1 个答案:

答案 0 :(得分: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),易于通过求逆生成。将所有部分放在一起,然后转换回笛卡尔坐标,就可以在Wikipedia文章中找到这对公式。

第二个变量是Marsaglia's Polar method,它似乎是method used by NumPy。通过在一个正方形中随机生成点,并拒绝外接圆中不包含的任何点(接受/拒绝),可以避免对正弦/余弦先验函数的求值。然后,它使用相同的卡方/指数距离计算来缩放结果,因此还利用了卷积,“特殊关系”和反演。

最快的方法基于ziggurat algorithm,该方法将法线分解为层(合成),对某些层使用特殊关系,并使用接受/拒绝来处理层的尾部。 / p>