假设我们有正态分布n(x):mean = 0和\ int _ { - a} ^ {a} n(x)= P.
计算此类分布的标准偏差的最简单方法是什么?可能有python或C的标准库,适合该任务吗?
如果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(该图中的深蓝色区域).如果设置P = 0.682且a = 1.0,则获得sigma~1.0,这确实是标准偏差.
具有Pr(-a 这是你正在寻找的表达式,其中inverseErf是误差函数的反函数(通常称为erf). 对于C,Gnu科学图书馆(GSL)是一个很好的资源.然而它只有erf,而不是inverseErf,所以你必须自己反转它(一个简单的二进制搜索就可以了).或者,这是一个近似erf和inverseErf的好方法: http://homepages.physik.uni-muenchen.de/~Winitzki/erf-approx.pdf 对于Python,可以 PS:Stackoverflow的URL渲染中存在某种错误,它不允许我链接到上面的GSL:http: //www.gnu.org/software/gsl.当我使用pdf正确的链接制作上面的URL时,它也会出错.a/(sqrt(2)*inverseErf(P))
erfinv
在SciPy库中使用inverseErf ,因此以下给出了标准偏差:a/(math.sqrt(2)*erfinv(P))