2012-02-25 265 views
5

如果给出的平均值和标准差定义为normal distribution,那么如何计算纯Python中的以下概率(即没有Numpy/Scipy或其他包不在标准库中)?在Python中分布随机变量的概率计算

  1. 随机变量r的概率r < x或r < = x。
  2. 随机变量r的概率,其中r> x或r> = x。
  3. 随机变量r的概率,其中x> r> y。

我发现了一些库,例如Pgnumerics,它们提供了计算这些函数的函数,但底层数学对我来说还不清楚。

编辑:为了表明这不是作业,下面发布的是我的工作代码Python < = 2.6,尽管我不确定它是否能正确处理边界条件。

from math import * 
import unittest 

def erfcc(x): 
    """ 
    Complementary error function. 
    """ 
    z = abs(x) 
    t = 1./(1. + 0.5*z) 
    r = t * exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+ 
     t*(.09678418+t*(-.18628806+t*(.27886807+ 
     t*(-1.13520398+t*(1.48851587+t*(-.82215223+ 
     t*.17087277))))))))) 
    if (x >= 0.): 
     return r 
    else: 
     return 2. - r 

def normcdf(x, mu, sigma): 
    t = x-mu; 
    y = 0.5*erfcc(-t/(sigma*sqrt(2.0))); 
    if y>1.0: 
     y = 1.0; 
    return y 

def normpdf(x, mu, sigma): 
    u = (x-mu)/abs(sigma) 
    y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2) 
    return y 

def normdist(x, mu, sigma, f): 
    if f: 
     y = normcdf(x,mu,sigma) 
    else: 
     y = normpdf(x,mu,sigma) 
    return y 

def normrange(x1, x2, mu, sigma, f=True): 
    """ 
    Calculates probability of random variable falling between two points. 
    """ 
    p1 = normdist(x1, mu, sigma, f) 
    p2 = normdist(x2, mu, sigma, f) 
    return abs(p1-p2) 
+0

这就是分配的累积分配函数给你的。你链接的文章给出了这个正态分布 – 2012-02-25 21:34:15

回答

8

所有这些都非常相似:如果您可以使用功能cdf(x)计算#1,然后解决#2是简单1 - cdf(x),和#3是cdf(x) - cdf(y)

因为Python包括自2.7版本内置的(高斯)误差函数可以通过从the article you linked to计算用公式正态分布的CDF做到这一点:

import math 
print 0.5 * (1 + math.erf((x - mean)/math.sqrt(2 * standard_dev**2))) 

其中mean是均值和standard_dev是标准偏差。

既然你问什么似乎相对简单的给出的文章中的信息的一些注意事项:

  • CDF随机变量(比如X)是X在于-infinity和一些限制之间的概率,例如x (小写)。 CDF是连续分发pdf的组成部分。 cdf正如你在#1中所描述的那样,你希望一些正态分布的RV在-infinity和x之间(< = x)。
  • <和< =以及>和> =对于连续随机变量是相同的,因为rv是任意单点的概率是0.因此,在计算x时是否包含x本身并不重要连续分布的概率。
  • 概率之和是1,如果它不是< x那么它是> = x所以如果你有cdf(x)。那么1 - cdf(x)是随机变量X> = x的概率。因为> =对于连续随机变量>是等价的,所以这也是概率X> x。
+0

边界是如何解释的?你说cdf(x)解决了#1,但是我有两个单独的案例来处理#1。小于和小于或等于。哪个cdf(x)解决,我将如何找到其他情况? – Cerin 2012-02-25 22:04:18

+0

嗨,对于连续的正态分布,小于和小于等于是相等的,所以这只是一种情况。我已经添加了一些笔记。 – ameer 2012-02-25 22:05:48

+1

'1 - cdf(x)'可以通过'math.erfc()'表示。它可能会提高'1d附近的cdf(x)的精度。 – jfs 2012-02-25 22:15:02