Je cherche une fonction dans Numpy ou Scipy (ou toute autre bibliothèque Python rigoureuse) qui me donnera la fonction de distribution normale cumulative en Python.
Réponses
Trop de publicités?Voici un exemple :
>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435
En d'autres termes, environ 95 % de l'intervalle normal standard se situe à l'intérieur de deux écarts types, centrés sur une moyenne standard de zéro.
Si vous avez besoin de la CDF inverse :
>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)
Il est peut-être trop tard pour répondre à la question, mais comme Google conduit toujours les gens ici, je décide d'écrire ma solution ici.
C'est-à-dire que, depuis Python 2.7, la fonction math
a intégré la fonction d'erreur math.erf(x)
El erf()
peut être utilisée pour calculer des fonctions statistiques traditionnelles telles que la distribution normale standard cumulative :
from math import *
def phi(x):
#'Cumulative distribution function for the standard normal distribution'
return (1.0 + erf(x / sqrt(2.0))) / 2.0
Réf :
https://docs.python.org/2/library/math.html
https://docs.python.org/3/library/math.html
Comment la fonction d'erreur et la fonction de distribution normale standard sont-elles liées ?
Démarrage Python 3.8
la bibliothèque standard fournit la fonction NormalDist
dans le cadre de la statistics
module.
Il peut être utilisé pour obtenir le fonction de distribution cumulative ( cdf
- la probabilité qu'un échantillon aléatoire X soit inférieur ou égal à x) pour une valeur donnée moyenne ( mu
) et écart type ( sigma
) :
from statistics import NormalDist
NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796
Ce qui peut être simplifié pour le distribution normale standard ( mu = 0
y sigma = 1
) :
NormalDist().cdf(1.96)
# 0.9750021048517796
NormalDist().cdf(-1.96)
# 0.024997895148220428
Adapté d'ici 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))
Pour reprendre l'exemple d'Inconnu, l'équivalent Python de la fonction normdist() implémentée dans de nombreuses bibliothèques serait :
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
- Réponses précédentes
- Plus de réponses