2012-02-25 14 views
5

Data una deviazione standard e standard che definisce uno normal distribution, come si calcola le seguenti probabilità in puro Python (ovvero nessun Numpy/Scipy o altri pacchetti non nella libreria standard)?Calcolo della probabilità di una variabile casuale in una distribuzione in Python

  1. La probabilità di una variabile casuale r dove r < xor < = x.
  2. La probabilità di una variabile casuale r dove r> xor> = x.
  3. La probabilità di una variabile casuale r dove x> r> y.

Ho trovato alcune librerie, come Pgnumerics, che forniscono funzioni per il calcolo di queste, ma la matematica sottostante non è chiara per me.

Modifica: per mostrare che non si tratta di compiti a casa, pubblicato di seguito è il mio codice di lavoro per Python < = 2.6, anche se non sono sicuro se gestisce correttamente le condizioni al contorno.

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

Ecco cosa offre la funzione di distribuzione cumulativa per la distribuzione. L'articolo a cui ti colleghi fornisce questo per le normali distribuzioni –

risposta

8

Tutti questi sono molto simili: Se si può calcolare 1 # utilizzando una funzione cdf(x), allora la soluzione al 2 # è semplicemente 1 - cdf(x), e per 3 # è cdf(x) - cdf(y).

Dal Python comprende il (Gauss) funzione di errore costruita nel partire dalla versione 2.7 è possibile fare questo calcolando il cdf della distribuzione normale utilizzando l'equazione da the article you linked to:

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

dove mean è la media e standard_dev è la deviazione standard.

Alcune note da quello che hai chiesto sembrava relativamente semplice dato le informazioni in questo articolo:

  • CDF di una variabile casuale (ad esempio X) è la probabilità che X si trova tra -infinito e qualche limite, dicono x (minuscolo). CDF è l'integrale del pdf per le distribuzioni continue. Il cdf è esattamente quello che hai descritto per # 1, vuoi che un RV normalmente distribuito sia compreso tra -infinity e x (< = x).
  • < e < = così come> e> = sono uguali per variabili casuali continue poiché la probabilità che il rv sia qualsiasi singolo punto è 0. Quindi, se x stesso è incluso o meno, non importa nel calcolo del probabilità per le distribuzioni continue.
  • La somma delle probabilità è 1, se non è < x allora è> = x quindi se si dispone dello cdf(x). quindi 1 - cdf(x) è la probabilità che la variabile casuale X> = x. Poiché> = è equivalente per variabili casuali continue a>, questa è anche la probabilità X> x.
+0

Come vengono interpretati i limiti? Dici che cdf (x) risolve il problema # 1, ma ho due casi separati per il # 1. Meno di e minore o uguale a Che cosa risolve cdf (x) e come trovo l'altro caso? – Cerin

+0

Salve, per una distribuzione normale che è continua, inferiore o uguale a equivalente sono quindi un solo caso. Ho aggiunto alcune note. – ameer

+1

'1 - cdf (x)' potrebbe essere espresso tramite 'math.erfc()'.Potrebbe migliorare la precisione per 'cdf (x) vicino a 1'. – jfs

Problemi correlati