Pergunta

Dada a média e o desvio-padrão da definição de uma distribuição normal, como você a calcular as seguintes probabilidades em puro Python (i.e.não Numpy/Scipy ou outros pacotes que não estejam na biblioteca padrão)?

  1. A probabilidade de uma variável aleatória r onde r < x ou r <= x.
  2. A probabilidade de uma variável aleatória r, onde r > x ou r >= x.
  3. A probabilidade de uma variável aleatória r, onde x > r > y.

Eu encontrei algumas bibliotecas, como Pgnumerics, que fornece funções para o cálculo desses, mas subjacente a matemática é clara para mim.

Editar:Para mostrar que não é esse o dever de casa, postado abaixo é o meu código de trabalho para o Python<=2.6, embora eu não tenho certeza se ele lida com as condições de contorno corretamente.

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)
Foi útil?

Solução

Todos estes são muito semelhantes:Se você pode calcular #1, usando uma função cdf(x), e , em seguida, a solução para o #2 é simplesmente 1 - cdf(x), e para #3 cdf(x) - cdf(y).

Desde Python inclui o (gauss) função de erro construído em desde a versão 2.7 você pode fazer isso através do cálculo da cdf da distribuição normal utilizando a equação de o artigo vinculada à:

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

onde mean é a média e standard_dev é o desvio padrão.

Algumas notas, já que você perguntou, parecia relativamente simples, dado as informações do artigo:

  • CDF de uma variável aleatória (digamos X) é a probabilidade de que X fica entre o infinito e algumas limite, digamos x (em minúsculas).O CDF é a integral de pdf para distribuições contínuas.O cdf é exatamente o que você descreveu para #1, você quer alguma normalmente distribuído RV para estar entre infinito e x (<= x).
  • < e <= assim como > e >= são mesmo para variáveis aleatórias contínuas como a probabilidade de que a rv é qualquer ponto é 0.Então, se ou não o x é incluído na verdade, não importa quando calcular as probabilidades para distribuições contínuas.
  • Soma das probabilidades é 1, se a sua não < x então é >= x então, se você tem o cdf(x).em seguida, 1 - cdf(x) é a probabilidade de que a variável aleatória X >= x.Desde >= é equivalente contínuo de variáveis aleatórias a >, esta é também a probabilidade de X > x.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top