2012-02-25 20 views
5

Dada una media y una desviación estándar que define normal distribution, ¿cómo calcularía las siguientes probabilidades en Python puro (es decir, no Numpy/Scipy u otros paquetes que no estén en la biblioteca estándar))?Calculando probabilidad de una variable aleatoria en una distribución en Python

  1. La probabilidad de una variable aleatoria r donde r < x o R < = x.
  2. La probabilidad de una variable aleatoria r donde r> x o r> = x.
  3. La probabilidad de una variable aleatoria r donde x> r> y.

He encontrado algunas bibliotecas, como Pgnumerics, que proporcionan funciones para calcularlas, pero las matemáticas subyacentes no están claras para mí.

Editar: Para mostrar que esto no es tarea, publicado a continuación es mi código de trabajo para Python < = 2.6, aunque no estoy seguro de si maneja las condiciones de contorno correctamente.

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

Eso es lo que le ofrece la función de distribución acumulativa para la distribución. El artículo al que se vincula proporciona esto para las distribuciones normales –

Respuesta

8

Todos estos son muy similares: Si se puede calcular # 1 utilizando una función cdf(x), entonces la solución a # 2 es simplemente 1 - cdf(x), y para # 3 es cdf(x) - cdf(y).

Como Python incluye el (gauss) función de error construida en desde la versión 2.7 se puede hacer esto mediante el cálculo de la función de distribución de la distribución normal utilizando la ecuación de the article you linked to:

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

donde mean es la media y standard_dev es la desviación estándar.

Algunas notas desde lo que pidió parecía relativamente sencillo dada la información en el artículo:

  • CDF de una variable aleatoria (digamos x) es la probabilidad de que X se encuentra entre -infinity y algún límite, dicen x (minúscula). CDF es la integral del pdf para distribuciones continuas. El cdf es exactamente lo que describiste para # 1, quieres que algún RV normalmente distribuido esté entre -infinito y x (< = x).
  • < y < = así como> y> = son los mismos para las variables aleatorias continuas, ya que la probabilidad de que el rv sea un punto individual es 0. Por lo tanto, no se considera realmente x cuando se calcula probabilidades para distribuciones continuas.
  • Suma de probabilidades es 1, si no es < x entonces es> = x entonces si tiene el cdf(x). entonces 1 - cdf(x) es la probabilidad de que la variable aleatoria X> = x. Como> = es equivalente para las variables aleatorias continuas a>, esta también es la probabilidad X> x.
+0

¿Cómo se interpretan los límites? Usted dice que cdf (x) resuelve # 1, pero tengo dos casos separados para # 1. Menor que, menor que o igual a. ¿Qué soluciona cdf (x) y cómo encontraría el otro caso? – Cerin

+0

Hola, para la distribución normal que es continua, menos que y menos que equivale a son equivalentes, así que este es solo un caso. He agregado algunas notas. – ameer

+1

'1 - cdf (x)' podría expresarse mediante 'math.erfc()'.Podría mejorar la precisión para 'cdf (x) cerca de 1'. – jfs

Cuestiones relacionadas