webentwicklung-frage-antwort-db.com.de

Wie berechnet man die Inverse der normalen kumulativen Verteilungsfunktion in Python?

Wie berechne ich die Inverse der kumulativen Verteilungsfunktion (CDF) der Normalverteilung in Python?

Welche Bibliothek soll ich benutzen? Möglicherweise scipy?

52
Yueyoum

NORMSINV (in einem Kommentar erwähnt) ist die Inverse der CDF der Standardnormalverteilung. Mit scipy können Sie dies mit der ppf -Methode des scipy.stats.norm Objekt. Das Akronym ppf steht für Prozentpunktfunktion , was ein anderer Name für Quantilfunktion .

In [20]: from scipy.stats import norm

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

Stellen Sie sicher, dass es sich um die Umkehrung der CDF handelt:

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

Standardmäßig, norm.ppf verwendet mean = 0 und stddev = 1, was die "Standard" -Normalverteilung ist. Sie können einen anderen Mittelwert und eine andere Standardabweichung verwenden, indem Sie die Argumente loc und scale angeben.

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

Wenn Sie sich den Quellcode für scipy.stats.norm, Sie werden feststellen, dass die ppf -Methode letztendlich scipy.special.ndtri . Um also die Inverse der CDF der Standardnormalverteilung zu berechnen, können Sie diese Funktion direkt verwenden:

In [43]: from scipy.special import ndtri

In [44]: ndtri(0.95)
Out[44]: 1.6448536269514722
96
# 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)
10

Beginnend Python 3.8, die Standardbibliothek stellt das Objekt NormalDist als Teil des Moduls statistics bereit.

Es kann verwendet werden, um die inverse kumulative Verteilungsfunktion zu erhalten ( - inv_cdf - Inverse der cdf ), auch bekannt als Quantilfunktion oder die Prozentpunktfunktion für einen gegebenen Mittelwert (mu) und Standardabweichung (sigma):

from statistics import NormalDist

NormalDist(mu=10, sigma=2).inv_cdf(0.95)
# 13.289707253902943

Was für die Standardnormalverteilung vereinfacht werden kann (mu = 0 und sigma = 1):

NormalDist().inv_cdf(0.95)
# 1.6448536269514715
2
Xavier Guihot