Je recherche une fonction en Numpy ou Scipy (ou toute bibliothèque Python rigoureuse) qui me donnera la fonction de distribution normale cumulative en Python.
Réponses:
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 du CDF inverse:
>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)
locet scale? J'ai utilisé le help(norm.ppf)mais alors qu'est-ce que diable sont locet scale- j'ai besoin d'aide pour l'aide ..
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.
Autrement dit, depuis Python 2.7, la mathbibliothèque a intégré la fonction d'erreurmath.erf(x)
La erf()fonction 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?
def phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2.
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))
Au départ Python 3.8, la bibliothèque standard fournit l' NormalDistobjet dans le cadre du statisticsmodule.
Il peut être utilisé pour obtenir la fonction de distribution cumulative ( cdf- probabilité qu'un échantillon aléatoire X soit inférieur ou égal à x) pour une moyenne ( mu) et un écart type ( sigma) donnés :
from statistics import NormalDist
NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796
Ce qui peut être simplifié pour la distribution normale standard ( mu = 0et sigma = 1):
NormalDist().cdf(1.96)
# 0.9750021048517796
NormalDist().cdf(-1.96)
# 0.024997895148220428
Pour construire sur l'exemple de Unknown, 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
La réponse d'Alex vous montre une solution pour la distribution normale standard (moyenne = 0, écart-type = 1). Si vous avez une distribution normale avec meanet std(qui est sqr(var)) et que vous souhaitez calculer:
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)
En savoir plus sur cdf ici et l'implémentation scipy de la distribution normale avec de nombreuses formules ici .
Prise d'en haut:
from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435
Pour un test bilatéral:
Import numpy as np
z = 1.96
p_value = 2 * norm.cdf(-np.abs(z))
0.04999579029644087
Simple comme ça:
import math
def my_cdf(x):
return 0.5*(1+math.erf(x/math.sqrt(2)))
J'ai trouvé la formule dans cette page https://www.danielsoper.com/statcalc/formulas.aspx?id=55
Comme Google donne cette réponse pour la recherche netlogo pdf , voici la version netlogo du code python ci-dessus
;; Fonction de densité cumulative de distribution normale
to-report normcdf [x mu sigma]
laissez tx - mu
soit y 0.5 * erfcc [- t / (sigma * sqrt 2.0)]
if (y> 1.0) [set y 1.0]
signaler y
fin
;; Fonction de densité de probabilité de distribution normale
to-report normpdf [x mu sigma]
soit u = (x - mu) / abs sigma
soit y = 1 / (sqrt [2 * pi] * abs sigma) * exp (- u * u / 2.0)
signaler y
fin
;; Fonction d'erreur complémentaire
rapporter erfcc [x]
laissez z abs x
soit t 1,0 / (1,0 + 0,5 * z)
soit 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) [rapport r] [rapport 2.0 - r]
fin