2013-12-17 12 views
35

Jak obliczyć odwrotność skumulowanej funkcji rozkładu (CDF) rozkładu normalnego w języku Python?Jak obliczyć odwrotność normalnej funkcji rozkładu skumulowanego w pythonie?

Jakiej biblioteki mam użyć? Być może scipy?

+1

masz na myśli odwrotny rozkład Gaussa (http://en.wikipedia.org/wiki/ Inverse_Gaussian_distribution) lub odwrotność dystrybuanty rozkładu normalnego (http://en.wikipedia.org/wiki/Normal_distribution) lub coś innego? –

+0

@WarrenWeckesser drugi: odwrotność dystrybuanty rozkładu normalnego – Yueyoum

+0

@WarrenWeckesser Mam na myśli wersję pythonową funkcji "normsinv" w programie excel. – Yueyoum

Odpowiedz

69

NORMSINV (wymieniony w komentarzu) jest odwrotnością CDF standardowego rozkładu normalnego. Używając scipy, można obliczyć to przy pomocy metody ppf obiektu scipy.stats.norm. Akronim ppf oznacza percent point function, co jest inną nazwą dla quantile function.

In [20]: from scipy.stats import norm 

In [21]: norm.ppf(0.95) 
Out[21]: 1.6448536269514722 

Sprawdź, czy jest to odwrotność CDF:

In [34]: norm.cdf(norm.ppf(0.95)) 
Out[34]: 0.94999999999999996 

Domyślnie norm.ppf wykorzystuje średni = 0 i OdchStd = 1, która jest "standardowy" rozkład normalny. Możesz użyć innej średniej i odchylenia standardowego, podając odpowiednio argumenty loc i scale.

In [35]: norm.ppf(0.95, loc=10, scale=2) 
Out[35]: 13.289707253902945 

Jeśli spojrzeć na kodzie źródłowym scipy.stats.norm, przekonasz się, że metoda ppf ostatecznie nazywa scipy.special.ndtri. Więc obliczyć odwrotność CDF standardowego rozkładu normalnego, można użyć tej funkcji bezpośrednio:

In [43]: from scipy.special import ndtri 

In [44]: ndtri(0.95) 
Out[44]: 1.6448536269514722 
+10

Zawsze uważam, że "funkcja punktu procentowego" (ppf) to straszne imię. Większość ludzi w statystykach używa właśnie "funkcji kwantylowej". –

5
# given random variable X (house price) with population muy = 60, sigma = 40 
import scipy as sc 
import scipy.stats as sct 
sc.version.full_version # 0.15.1 

#a. Find P(X<50) 
sct.norm.cdf(x=50,loc=60,scale=40) # 0.4012936743170763 

#b. Find P(X>=50) 
sct.norm.sf(x=50,loc=60,scale=40) # 0.5987063256829237 

#c. Find P(60<=X<=80) 
sct.norm.cdf(x=80,loc=60,scale=40) - sct.norm.cdf(x=60,loc=60,scale=40) 

#d. how much top most 5% expensive house cost at least? or find x where P(X>=x) = 0.05 
sct.norm.isf(q=0.05,loc=60,scale=40) 

#e. how much top most 5% cheapest house cost at least? or find x where P(X<=x) = 0.05 
sct.norm.ppf(q=0.05,loc=60,scale=40) 
+1

PS: Można przyjąć, że "loc" oznacza "średnia" i "skala" jako "odchylenie standardowe" – Suresh2692

Powiązane problemy