Kümülatif normal dağılım nasıl hesaplanır?


101

Numpy veya Scipy'de (veya herhangi bir titiz Python kitaplığında) bana Python'daki kümülatif normal dağılım işlevini verecek bir işlev arıyorum.

Yanıtlar:


127

İşte bir örnek:

>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435

Diğer bir deyişle, standart normal aralığın yaklaşık% 95'i, standart bir sıfır ortalamasına odaklanan iki standart sapma dahilindedir.

Ters CDF'ye ihtiyacınız varsa:

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

10
Ayrıca, ortalama (loc) ve varyansı (ölçek) parametre olarak belirtebilirsiniz. örneğin, d = norm (loc = 10.0, ölçek = 2.0); d.cdf (12.0); Ayrıntılar burada: docs.scipy.org/doc/scipy-0.14.0/reference/generated/…
Irvan

7
@Irvan, ölçek parametresi aslında standart sapmadır, varyans DEĞİLDİR.
qkhhly

2
Scipy neden bunları locve olarak adlandırıyor scale? help(norm.ppf)Ama sonra ne olduğunu kullandım locve scale- yardım için yardıma ihtiyacım var ..
javadba

3
@javadba - konum ve ölçek, geniş bir dağılım yelpazesini parametreleştirmek için kullanılan istatistikte daha genel terimlerdir. Normal dağılım için, ortalama ve sd ile aynı hizadalar, ancak diğer dağılımlar için öyle değil.
Michael Ohlrogge

1
@MichaelOhlrogge. Teşekkürler! İşte ileri açıklayan NIST bir sayfadır itl.nist.gov/div898/handbook/eda/section3/eda364.htm
javadba

40

Soruyu cevaplamak için çok geç olabilir, ancak Google hala insanları buraya yönlendirdiği için çözümümü buraya yazmaya karar verdim.

Yani, Python 2.7'den beri, mathkütüphane hata fonksiyonunu entegre ettimath.erf(x)

erf()Fonksiyonu, toplam standart normal dağılım olarak geleneksel istatistiksel fonksiyonlar hesaplamak için kullanılabilir:

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

Referans:

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

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

Hata İşlevi ve Standart Normal dağılım işlevi nasıl ilişkilidir?


3
Bu tam olarak aradığım şeydi. Benden başka biri bunun "standart dağılımda yer alan veri yüzdesini" hesaplamak için nasıl kullanılabileceğini merak ederse: 1 - (1 - phi (1)) * 2 = 0,6827 ("1 standart içindeki verilerin% 68'i sapma ")
Hannes Landeholm

1
Genel bir normal dağılım için bu olurdu def phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2.
Bernhard Barker

20

Başlangıç ​​olarak Python 3.8, standart kütüphane NormalDistnesneyi statisticsmodülün bir parçası olarak sağlar .

Belirli bir ortalama ( ) ve standart sapma ( ) için kümülatif dağılım fonksiyonunu ( cdf- rastgele bir X örneğinin x'e eşit veya daha küçük olma olasılığı) elde etmek için kullanılabilir :musigma

from statistics import NormalDist

NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796

Standart normal dağılım için basitleştirilebilir ( mu = 0ve sigma = 1):

NormalDist().cdf(1.96)
# 0.9750021048517796

NormalDist().cdf(-1.96)
# 0.024997895148220428

18

Buradan uyarlanmıştır 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))

3
Std lib, math.erf () 'yi uyguladığından, sep uygulamasına gerek yoktur.
Marc

cevap bulamadım, bu rakamlar nereden geliyor?
TmSmth

15

Bilinmeyen örneğine dayanarak, normdist () işlevinin birçok kitaplıkta uygulanan Python eşdeğeri şöyle olacaktı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

10

Alex'in cevabı size standart normal dağılım için bir çözüm gösteriyor (ortalama = 0, standart sapma = 1). meanVe ile std(olan sqr(var)) normal dağılımınız varsa ve hesaplamak istiyorsanız:

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)

Hakkında daha fazla bilgi okuyun burada cdf birçok formüllerle ve normal dağılımın scipy uygulanması burada .


2

Yukarıdan alınmıştır:

from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435

İki kuyruklu bir test için:

Import numpy as np
z = 1.96
p_value = 2 * norm.cdf(-np.abs(z))
0.04999579029644087


-8

Google netlogo pdf araması için bu cevabı verirken , işte yukarıdaki python kodunun netlogo sürümü.

    ;; Normal dağılım kümülatif yoğunluk işlevi
    normcdf [x mu sigma] bildirmek
        let tx - mu
        let y 0.5 * erfcc [- t / (sigma * sqrt 2.0)]
        eğer (y> 1.0) [y 1.0'ı ayarlayın]
        rapor y
    son

    ;; Normal dağılım olasılığı yoğunluk işlevi
    normpdf [x mu sigma] rapor etmek
        let u = (x - mu) / abs sigma
        let y = 1 / (sqrt [2 * pi] * abs sigma) * exp (- u * u / 2.0)
        rapor y
    son

    ;; Tamamlayıcı hata işlevi
    erfcc [x] bildirmek
        izin ver z abs x
        let t 1.0 / (1.0 + 0.5 * z)
        let rt * exp (- z * z -1.26551223 + t * (1.00002368 + t * (0.37409196 +
            t * (0,09678418 + t * (-0,18628806 + t * (0,27886807 +
            t * (-1,13520398 + t * (1,48851587 + t * (-0,82215223 +
            t * .17087277))))))))
        ifelse (x> = 0) [rapor r] [rapor 2.0 - r]
    son


6
Soru NetLogo değil, Python ile ilgili. Bu cevap burada olmamalı. Ve lütfen anlamını değiştirmek için soruyu düzenlemeyin.
interjay

Bunun tercih edilen yol olmadığının farkındayım, ancak bu şekilde en çok yardımcı olacağını tahmin ediyorum çünkü insanlar bu sayfaya google (şu anda ...) tarafından yönlendiriliyor
platipodium
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.