Pregunta

Dado un estándar y media-desviación de la definición de un distribución normal, ¿cómo podría usted calcular las siguientes probabilidades en pura-Python (es decir,no Numpy/Scipy u otros paquetes que no están en la biblioteca estándar)?

  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 el cálculo de estas, pero la matemática es claro para mí.

Editar:Para mostrar que esto no es la tarea, publicado a continuación es mi código de trabajo para Python<=2.6, aunque no estoy seguro de si se maneja con las condiciones de frontera 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)
¿Fue útil?

Solución

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

Dado que Python incluye la (gauss) función de error construido desde la versión 2.7 usted puede hacer esto mediante el cálculo de la cdf de la distribución normal utilizando la ecuación de el artículo que enlaza con:

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

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

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

  • CDF de una variable aleatoria (digamos X) es la probabilidad de que X se encuentra entre el infinito y algunos límite, digamos x (minúscula).CDF es la integral de la pdf para distribuciones continuas.El cdf es exactamente lo que se describe para la #1, usted quiere algunos distribuido normalmente RV a ser de entre el infinito y x (<= x).
  • < y <= así como > y >= son las mismas para variables aleatorias continuas como la probabilidad de que la rv es un único punto es 0.Así que si o no x sí se incluye en realidad no importa a la hora de calcular las probabilidades de las distribuciones continuas.
  • Suma de las probabilidades es 1, si no su < x, entonces es >= x así que si usted tiene la cdf(x).entonces 1 - cdf(x) es la probabilidad de que la variable aleatoria X >= x.Desde >= es equivalente continuo de variables aleatorias a >, esta es también la probabilidad de que X > x.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top