2009-04-30 23 views

Odpowiedz

18

adaptowany stąd http://mail.python.org/pipermail/python-list/2000-June/039873.html

from math import * 
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 ncdf(x): 
    return 1. - 0.5*erfcc(x/(2**0.5)) 
+1

Ponieważ biblioteka standardowa implementuje program math.erf(), nie ma potrzeby implementacji sep. – Marc

85

Oto przykład:

>>> from scipy.stats import norm 
>>> norm.cdf(1.96) 
array(0.97500210485177952) 

Jeśli potrzebujesz CDF odwrotny:

>>> norm.ppf(norm.cdf(1.96)) 
array(1.9599999999999991) 
+4

Można również określić średnią (loc) i wariancję (skalę) jako parametry. np. d = norma (loc = 10,0, skala = 2,0); d.cdf (12,0); Szczegóły tutaj: http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.norm.html – Irvan

+5

@Irvan, parametr skali jest w rzeczywistości odchyleniem standardowym, a NIE wariancją. – qkhhly

+1

Dlaczego scipy nazywają je 'loc' i' scale'? Użyłem 'help (norm.ppf)' ale co do cholery są 'loc' i' scale' - potrzebuję pomocy dla pomocy .. – javadba

12

budować na przykład Bezimiennego, odpowiednik Python od funkcja normdist() zastosowana w wielu bibliotekach będzie następująca:

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 
-5

Jak Google daje taką odpowiedź na poszukiwanie NetLogo pdf, oto NetLogo wersja powyższego kodu Pythona

 

    ;; Normal distribution cumulative density function 
    to-report normcdf [x mu sigma] 
     let t x - mu 
     let y 0.5 * erfcc [ - t/(sigma * sqrt 2.0)] 
     if (y > 1.0) [ set y 1.0 ] 
     report y 
    end 

    ;; Normal distribution probability density function 
    to-report normpdf [x mu sigma] 
     let u = (x - mu)/abs sigma 
     let y = 1/(sqrt [2 * pi] * abs sigma) * exp (- u * u/2.0) 
     report y 
    end 

    ;; Complementary error function 
    to-report erfcc [x] 
     let z abs x 
     let t 1.0/(1.0 + 0.5 * z) 
     let r t * exp (- z * z -1.26551223 + t * (1.00002368 + t * (0.37409196 + 
      t * (0.09678418 + t * (-0.18628806 + t * (.27886807 + 
      t * (-1.13520398 +t * (1.48851587 +t * (-0.82215223 + 
      t * .17087277))))))))) 
     ifelse (x >= 0) [ report r ] [report 2.0 - r] 
    end 

+5

Pytanie dotyczy Pythona, a nie NetLogo. Ta odpowiedź nie powinna tu być. I nie edytuj pytania, aby zmienić jego znaczenie. – interjay

+0

Jestem świadomy, że nie jest to preferowany sposób, ale myślę, że jest to najbardziej pomocne w ten sposób, ponieważ ludzie są kierowani na tę stronę przez google (obecnie ...) – platipodium

22

może być za późno, aby odpowiedzieć na pytanie, ale ponieważ Google nadal prowadzi tutaj ludzie, postanawiam napisać tutaj moje rozwiązanie.

To jest, ponieważ Python 2.7, biblioteka math zintegrował funkcję błędu math.erf(x)

Funkcja erf() mogą być wykorzystane do obliczenia tradycyjne funkcje statystyczne, takie jak skumulowanego rozkładu normalnego:

from math import * 
def phi(x): 
    #'Cumulative distribution function for the standard normal distribution' 
    return (1.0 + erf(x/sqrt(2.0)))/2.0 

Ref:

https://docs.python.org/2/library/math.html

https://docs.python.org/3/library/math.html

How are the Error Function and Standard Normal distribution function related?

+1

To było dokładnie to, czego szukałem. Jeśli ktoś inny niż ja zastanawia się, w jaki sposób można to wykorzystać do obliczenia "odsetka danych, które leży w standardowej dystrybucji", dobrze: 1 - (1 - phi (1)) * 2 = 0,6827 ("68% danych w ramach 1 standardu odchylenie") –

7

Alexa odpowiedź pokazuje rozwiązanie dla standardowego rozkładu normalnego (średnia = 0, odchylenie standardowe = 1). Jeśli masz rozkład normalny z mean i std (co jest sqr(var)) i chcesz obliczyć:

from scipy.stats import norm 

# cdf(x < val) 
print norm.cdf(val, m, s) 

# cdf(x > val) 
print 1 - norm.cdf(val, m, s) 

# cdf(v1 < x < v2) 
print norm.cdf(v2, m, s) - norm.cdf(v1, m, s) 

Więcej o cdf here i scipy realizację rozkładu normalnego z wieloma wzorami here.

Powiązane problemy