使用scipy erfinv绘制高斯随机变量

时间:2016-08-03 22:05:57

标签: python numpy random scipy scientific-computing

我想绘制 npts 随机变量,分布为高斯分布,均值为 mu 和色散 sigma 。我知道如何在Numpy中做到这一点:

x = np.random.normal(loc=mu, scale=sigma, size=npts)
print(np.std(x), np.mean(x))
0.1998, 0.3997

这也应该可以通过逆变换使用scipy.special.erfinv,从均匀分布开始:

u = np.random.uniform(0, 1, npts)

但是,我无法弄清楚如何正确缩放比例。有人曾经这样做过吗?

2 个答案:

答案 0 :(得分:6)

试试这个:

mean = 100
sigma = 7
x = mean + 2**0.5 * sigma * erfinv(np.random.uniform(size=10**5) * 2 - 1)
x.mean(), x.std()
Out: (99.965915366042381, 7.0062395839075107)

enter image description here

从erf到正态分布的转换来自John D. Cook's blog

答案 1 :(得分:2)

最好的方法可能是高度优化的高斯采样器的自己实现,如:

但这里有一些简单的东西(我很久以前就看到了here)。这将比上述方法效率低(因为它使用分位数函数/百分点函数,它没有正态分布的闭合表示并且将被近似):

import numpy as np
from scipy.stats.distributions import norm

uniform_samples = np.random.rand(100000)
gaussian_samples = norm(loc=0, scale=1).ppf(uniform_samples)