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

Python Numpy如何从非均匀分布中抽样随机数?,python,numpy,random,distribution,sampling,Python,Numpy,Random,Distribution,Sampling,我一直在学习随机抽样方法,我知道Numpy使用Mersenne Twister生成均匀随机数,然后它如何传递这些来生成非均匀分布 例如: np.random.normal(mu,sigma,n) 这里使用什么算法对正态分布的数字进行采样?谢谢。你的问题太宽泛了,它可能(而且确实)会填补你的空白 这就是说,一个非常快速的概述是,生成非均匀随机数的技术属于几个常见的类别。这些措施包括: 累积分布函数(CDF)的逆变换 卷积(随机变量的和本身是随机的 具有不同分布的变量) 合成(分解a 使用条件分布

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

例如:

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

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

你的问题太宽泛了,它可能(而且确实)会填补你的空白

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

  • 累积分布函数(CDF)的逆变换
  • 卷积(随机变量的和本身是随机的 具有不同分布的变量)
  • 合成(分解a 使用条件分布将复杂分布划分为更简单的部分 概率)
  • 接受/拒绝技术(产生随机“猜测”、拒绝和 如果违反了目标分发的约束,请重试);及
  • “特殊关系”(认识到某些 分布与其他分布有着密切的关系 它们更容易生成)
  • 关于1-3和5中每一项的简单示例,请参见本手册第4.3节

    在实践中,经常使用这些技术的组合

    例如,正态分布无法通过反演解析找到,因为这需要能够为CDF编写一个封闭形式的方程

    查看极坐标中的法线对,即表示为方向和距离。基本的Box-Muller算法指出,方向在0到2π之间是一致的,毕达哥拉斯告诉我们,距离是基于平方法线的和,具有卡方(2)分布(卷积)。“特殊关系”告诉我们卡方(2)是指数(2),很容易通过反转生成。把所有的部分放在一起,再转换回笛卡尔坐标,就得到了维基百科文章中的一对公式

    第二个变体是,似乎是。它通过在一个正方形中随机生成点,并拒绝任何不包含在外接圆内的点(接受/拒绝),避免了正弦/余弦超越函数的计算。然后,它使用相同的卡方/指数距离计算来缩放结果,因此它还利用卷积、“特殊关系”和反演


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

    可能的相关部分(当前)问题的源代码不一定是生成正常随机数的算法,而是NumPy使用什么算法生成这样的数。由于向后兼容,NumPy的
    NumPy.random.normal
    算法多年来没有改变,但将来可能不会改变(见新版本)。@PeterO。关键是NumPy必须使用一种或多种基本技术,对于法线,它使用Marsaglia的极坐标方法(如答案中所述)。这个问题特别问“…它如何通过这些来生成非均匀分布?”然后是“例如”的正态分布。我解释为想知道所涉及的技术。如果不是的话,没有一个单一的答案可以涵盖NumPy提供的整个RV系列,您最好的选择是查看所有这些版本的来源。这个问题对SO来说太宽泛了。重读这个问题,我发现它适用于所有由NumPy支持的“非均匀分布”,而不仅仅是正态分布。在这种情况下,NumPy源代码是记录它们的最佳方式。