使用 scipy erfinv 绘制高斯随机变量
drawing gaussian random variables using scipy erfinv
我想绘制 npts 分布为均值 mu 和分散 sigma[= 的高斯分布的随机变量22=]。我知道如何在 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)
但是,我不知道如何正确缩放。有人做过吗?
最好的方法可能是自己实现高度优化的高斯采样器,例如:
但这里有一些简单的东西(我很久以前就看过 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)
试试这个:
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)
从erf到正态分布的转换来自John D. Cook's blog。
我想绘制 npts 分布为均值 mu 和分散 sigma[= 的高斯分布的随机变量22=]。我知道如何在 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)
但是,我不知道如何正确缩放。有人做过吗?
最好的方法可能是自己实现高度优化的高斯采样器,例如:
但这里有一些简单的东西(我很久以前就看过 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)
试试这个:
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)
从erf到正态分布的转换来自John D. Cook's blog。