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

2024-05-13 22:16:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在学习随机抽样方法,并且知道Numpy使用Mersenne Twister来生成均匀的随机数,那么它是如何通过这些来生成非均匀分布的呢?在

例如:

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

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


Tags: 方法numpy算法np数字randomsigmanormal
1条回答
网友
1楼 · 发布于 2024-05-13 22:16:55

你的整个问题太宽泛了,它可能(而且确实)填充了一个entire textbook。在

也就是说,一个非常简单的概述是,生成非均匀随机数的技术可分为几个常见的类别。其中包括:

  1. 累积分布函数(CDF)的反变换
  2. 卷积(随机变量的总和本身就是随机的 具有不同分布的变量)
  3. 成分(分解a 使用更简单的条件分布 概率)
  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,它将法线分成层(组合),对某些层使用特殊关系,并使用接受/拒绝来处理层的尾部。在

相关问题 更多 >