标准C或Python库,用于计算正态分布的标准偏差

时间:2008-11-25 16:25:35

标签: python c algorithm math probability

假设我们有正态分布n(x):mean = 0和\ int _ { - a} ^ {a} n(x)= P.

计算此类分布的标准偏差的最简单方法是什么?可能有适用于该任务的python或C的标准库吗?

4 个答案:

答案 0 :(得分:7)

如果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是具有均值0和stddev 1的正常变量的累积分布函数(cdf)。现在我们需要正常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,这确实是标准偏差。

答案 1 :(得分:5)

具有Pr(-a

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

这是你正在寻找的表达式,其中inverseErf是误差函数的反函数(通常称为erf)。

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

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

对于Python,inverseErf在SciPy库中以erfinv形式提供,因此以下给出了标准偏差:

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

PS:Stackoverflow的URL渲染中存在某种错误,它不允许我链接到上面的GSL:http://www.gnu.org/software/gsl。 当我使用pdf作为正确的链接制作上面的URL时,它也会出错。

答案 2 :(得分:3)

SciPy有一个stats子包。

答案 3 :(得分:1)

看看sciPy Project,它应该有你需要的东西。