2012-02-25 101 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