【问题标题】:How does Numpy sample random numbers from a non-uniform distribution?Numpy 如何从非均匀分布中采样随机数?
【发布时间】:2019-04-03 14:46:17
【问题描述】:

我一直在学习随机抽样方法,并且知道 Numpy 使用 Mersenne-Twister 生成均匀随机数,然后它如何传递这些以生成非均匀分布?

例如:

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

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

【问题讨论】:

标签: python numpy random distribution sampling


【解决方案1】:

您的整体问题过于宽泛,它可以(并且确实)填写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,它将法线分解为层(组合),对某些层使用特殊关系,并使用接受/拒绝来处理层的尾部。

【讨论】:

  • 问题不一定是存在的算法来生成正常的随机数,而是NumPy使用什么算法来生成这样的数字。虽然由于向后兼容性,NumPy 的 numpy.random.normal 算法多年来一直没有改变,但未来可能不会发生这种情况(请参阅新的 Numpy RNG policy)。
  • @PeterO。关键是 NumPy 必须使用一种或多种基本技术,对于法线,它使用 Marsaglia 的 Polar 方法(如答案中所述)。这个问题特别问“......然后它如何通过这些来生成非均匀分布?”后面跟正常的作“例如”。我将其解释为想了解所涉及的技术。如果没有,没有单一的答案可以涵盖 NumPy 提供的整个 RV 生成套件,最好的办法是查看所有这些的来源。这对 SO 来说太宽泛了。
  • 重新阅读问题,我发现它适用于 NumPy 支持的所有“非均匀分布”,而不仅仅是正态分布。在这种情况下,NumPy 源代码是记录它们的最佳方式。
猜你喜欢
  • 2014-07-26
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2021-12-28
  • 2011-08-08
  • 2014-06-06
  • 1970-01-01
相关资源
最近更新 更多