假设我们有正态分布 n(x):mean=0 和 \int_{-a}^{a} n(x) = P。
计算这种分布的标准差的最简单方法是什么?可能有适合该任务的python或C标准库吗?
假设我们有正态分布 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 且标准偏差为 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 < X < a) = P 的均值零高斯分布的标准差为
a/(sqrt(2)*inverseErf(P))
这是您要查找的表达式,其中 inverseErf 是误差函数的倒数(通常称为 erf)。
对于 C,Gnu Scientific Library (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))
PS:Stackoverflow 的 URL 呈现中存在某种错误,它不允许我链接到上面的 GSL: http ://www.gnu.org/software/gsl 。当我使用 pdf 将上面的 URL 设为正确的链接时,它也会呈现错误。
看看sciPy Project,它应该有你需要的东西。