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

ele*_*tum 4 c python algorithm math probability

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

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

Fed*_*oni 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 )
Run Code Online (Sandbox Code Playgroud)

其中N是正常的,平均值为0,标准差为1

P/2 + 1/2 = Prob[ N <= a/sigma ] = Phi(a/sigma)
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

例如,我们知道N(0,1)变量落入区间[-1.1]的概率是~0.682(该图中的深蓝色区域).如果设置P = 0.682且a = 1.0,则获得sigma~1.0,这确实是标准偏差.


dre*_*ves 5

具有Pr(-a <X <a)= P的平均零高斯分布的标准偏差是

a/(sqrt(2)*inverseErf(P))
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

a/(math.sqrt(2)*erfinv(P))
Run Code Online (Sandbox Code Playgroud)

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