【问题标题】:Standard C or Python libraries to compute standard deviation of normal distribution用于计算正态分布标准差的标准 C 或 Python 库
【发布时间】:2010-09-23 23:53:39
【问题描述】:

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

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

【问题讨论】:

  • 平均值为0的正态分布的标准差不总是1.0吗?这不是定义吗?
  • 我认为这仅适用于标准正态分布。
  • P=\int_{-a}^{a} n(x) 应该为 1,否则不是概率分布。不过,标准分布(或方差)可以是任何值。
  • 单变量正态密度定义在整条实线上。从-infinity 到+infinity 的积分应该是1,从-a 到a 的积分应该不是。
  • 对,对不起。不知道为什么我把“a”读成“∞”:P

标签: python c algorithm math probability


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    SciPy 有一个stats 子包。

    【讨论】:

      【解决方案3】:

      如果 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)。现在我们需要 inverse 正态 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,这确实是标准偏差。

      【讨论】:

        【解决方案4】:

        Pr(-a

        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,inverseErf 在 SciPy 库中以 erfinv 的形式提供,因此以下给出了标准偏差:

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

        PS:* 的 URL 呈现中存在某种错误,它不允许我链接到上面的 GSL:http://www.gnu.org/software/gsl。 当我使用 pdf 将上面的 URL 设置为正确的链接时,它也会呈现错误。

        【讨论】: