4

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

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

4

4 回答 4

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 且标准偏差为 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,这确实是标准偏差。

于 2008-11-25T21:44:54.413 回答
5

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 设为正确的链接时,它也会呈现错误。

于 2008-11-26T06:05:02.670 回答
3

SciPy有一个stats子包。

于 2008-11-25T16:29:17.060 回答
1

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

于 2008-11-25T16:29:05.157 回答