计算正态分布标准差的标准C或Python库

2024-04-25 13:42:48 发布

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

假设我们有正态分布n(x):平均值=0和{-a}^{a}n(x)=p

计算这种分布的标准差最简单的方法是什么?可能有适合于python或C的标准库吗?


Tags: 方法标准平均值标准差正态分布
3条回答

Pr(-a<;X<;a)=p的平均零高斯分布的标准差是

a/(sqrt(2)*inverseErf(P))

这是您要查找的表达式,其中inverse erf是错误函数(通常称为erf)的逆函数。

对于C来说,Gnu科学图书馆(GSL)是一个很好的资源。但是它只有erf,而不是inverseErf,所以您必须自己反转它(简单的二进制搜索就可以做到这一点)。或者,这里有一个很好的方法来近似erf和inverseErf:

http://homepages.physik.uni-muenchen.de/~Winitzki/erf-approx.pdf

对于Python,inverseErf作为erfinv在SciPy库中可用,因此下面给出了标准偏差:

a/(math.sqrt(2)*erfinv(P))

注意:Stackoverflow的URL呈现中存在某种错误,它不允许我链接到上面的GSL:http://www.gnu.org/software/gsl。 当我把上面带有pdf的URL变成一个正确的链接时,它也会呈现错误。

如果X是正态的,平均值为0,标准差为sigma,则它必须保持

P = Prob[ -a <= X <= a ] = Prob[ -a/sigma <= N <= a/sigma ]
  = 2 Prob[ 0 <= N <= a/sigma ]
  = 2 ( Prob[ N <= a/sigma ] - 1/2 )

其中N为正态分布,平均值为0,标准差为1。因此

P/2 + 1/2 = Prob[ N <= a/sigma ] = Phi(a/sigma)

其中Phi是正态变量的累积分布函数(cdf),均值为0,stddev为1。现在我们需要正态cdf(或“百分点函数”),在Python中是scipy.stats.norm.ppf()。示例代码:

from scipy.stats import norm
P = 0.3456
a = 3.0

a_sigma = float(norm.ppf(P/2 + 0.5))   # a/sigma
sigma = a/a_sigma   # Here is the standard deviation

例如,我们知道N(0,1)变量在区间[-1.1]内下降的概率是~0.682(在this figure中的深蓝色区域)。如果设置P=0.682和a=1.0,则得到sigma~1.0,这确实是标准差。

SciPy有一个stats子包。

相关问题 更多 >