Python 使用scipy ERFIV绘制高斯随机变量

Python 使用scipy ERFIV绘制高斯随机变量,python,numpy,random,scipy,scientific-computing,Python,Numpy,Random,Scipy,Scientific Computing,我想画出NPT随机变量分布为高斯分布,平均μ和色散σ。我知道在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) 然而,我不知道如何获得正确的缩放。以前有人这样做过吗?

我想画出NPT随机变量分布为高斯分布,平均μ和色散σ。我知道在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)

然而,我不知道如何获得正确的缩放。以前有人这样做过吗?

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

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

试试这个:

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到正态分布的转换来自。

什么是NPT?我是否理解正确,您只需要参数化法线距离的样本?如果是这样的话,为什么不使用numpy方法呢?我的用例要求从u开始。NPT只是从发行版“我的用例要求从u开始”中提取的次数。你能解释一下你的动机吗?当然,阿里。我将使用x的百分位数,我的模型中感兴趣的物理量,作为数组u。高斯变量是建模量y的分布。这样,x和y是单调对应的,y是高斯分布的。完美答案:正是我所需要的,即使是大数组也非常快。谢谢sascha。这是一个有趣的解决方案,但比透明的erfinv方法清晰一点,对于非常大的阵列,速度要慢约3倍。@aph在我看来,这更清晰。这只是使用ppf函数进行的逆变换采样(使用要从中采样的分布)。我还认为,如果erfinv可以通过线性变换实现这一点,那么它的反函数也不能用封闭形式表示,也需要近似(内部)。上述算法中的一种,在几行中实现,如果做得正确,应该快100倍(所有快速rng库都使用它们是有原因的)。但我同意,ayhan更准确地回答了您的问题,因为您需要一些基于ERFIV的方法。:-)好的,sascha,我会检查你建议的链接,并在检查接受的答案之前尝试调整它们。我只喜欢基于erfinv的答案,因为与逆变换采样的连接直接在语法层面上是简单而明确的。我认为,你应该首先使用这两种简单的方法中的一种。如果速度对您来说太慢,只需实现上面的一个(或者获取一些numpy/scipy内部)。
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)