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?La réponse d'Alex vous montre une solution pour une distribution normale standard (moyenne = 0, écart-type = 1). Si vous avez une distribution normale avec mean
y std
(qui est sqr(var)
) et vous voulez 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)
Plus d'informations sur cdf ici et implémentation scipy de la distribution normale avec de nombreuses formules ici .
C'est simple comme bonjour :
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.
;; Normal distribution cumulative density function
to-report normcdf \[x mu sigma\]
let t x - mu
let y 0.5 \* erfcc \[ - t / ( sigma \* sqrt 2.0)\]
if ( y > 1.0 ) \[ set y 1.0 \]
report y
end
;; Normal distribution probability density function
to-report normpdf \[x mu sigma\]
let u = (x - mu) / abs sigma
let y = 1 / ( sqrt \[2 \* pi\] \* abs sigma ) \* exp ( - u \* u / 2.0)
report y
end
;; Complementary error function
to-report erfcc \[x\]
let z abs x
let t 1.0 / (1.0 + 0.5 \* z)
let r t \* exp ( - z \* z -1.26551223 + t \* (1.00002368 + t \* (0.37409196 +
t \* (0.09678418 + t \* (-0.18628806 + t \* (.27886807 +
t \* (-1.13520398 +t \* (1.48851587 +t \* (-0.82215223 +
t \* .17087277 )))))))))
ifelse (x >= 0) \[ report r \] \[report 2.0 - r\]
end
- Réponses précédentes
- Plus de réponses