Sto cercando una funzione in Numpy o Scipy (o qualsiasi libreria Python rigorosa) che mi fornirà la funzione di distribuzione normale cumulativa in Python.Come calcolare la distribuzione normale cumulativa in Python
risposta
Adattato da qui 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))
Ecco un esempio:
>>> from scipy.stats import norm
>>> norm.cdf(1.96)
array(0.97500210485177952)
Se avete bisogno della CDF inversa:
>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)
Inoltre, è possibile specificare la media (loc) e la varianza (scala) come parametri. per esempio, d = norma (loc = 10.0, scale = 2.0); d.cdf (12.0); Dettagli qui: http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.norm.html – Irvan
@Irvan, il parametro di scala è in realtà la deviazione standard, NON la varianza. – qkhhly
Perché scipy le chiama "loc" e "scale"? Ho usato 'help (norm.ppf)' ma poi cosa diamine sono 'loc' e' scale' - ho bisogno di un aiuto per l'aiuto .. – javadba
Per sviluppare l'esempio di Unknown, l'equivalente Python la funzione normdist() implementata in molte librerie sarebbe:
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
Come Google dà questa risposta per la ricerca NetLogo pdf, ecco la versione NetLogo del codice Python sopra
;; 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
La domanda riguarda Python, non NetLogo. Questa risposta non dovrebbe essere qui. E per favore non modificare la domanda per cambiarne il significato. – interjay
Sono consapevole che questo non è il modo preferito, ma immagino che sia molto utile in questo modo dato che le persone sono indirizzate a questa pagina da google (attualmente ...) – platipodium
Potrebbe essere troppo tardi per rispondere alla domanda, ma dal momento che Google ancora contatti gente qui, decido di scrivere la mia soluzione qui.
Cioè, dato che Python 2.7, la libreria math
ha integrato la funzione di errore math.erf(x)
La funzione erf()
può essere usato per calcolare funzioni statistiche tradizionali come la cumulativa della distribuzione normale standard:
from math import *
def phi(x):
#'Cumulative distribution function for the standard normal distribution'
return (1.0 + erf(x/sqrt(2.0)))/2.0
Rif:
https://docs.python.org/2/library/math.html
https://docs.python.org/3/library/math.html
How are the Error Function and Standard Normal distribution function related?
Questo era esattamente quello che stavo cercando. Se qualcun altro oltre a me si chiede come questo possa essere utilizzato per calcolare "la percentuale di dati che si trova all'interno della distribuzione standard", beh: 1 - (1 - phi (1)) * 2 = 0,6827 ("68% dei dati all'interno di 1 standard deviazione") –
risposta di Alex mostra una soluzione per la distribuzione normale standard (media = 0, deviazione standard = 1). Se si dispone di una distribuzione normale con mean
e std
(che è sqr(var)
) e si vuole calcolare:
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)
Per saperne di più cdf here e SciPy implementazione di distribuzione normale con molte formule here.
- 1. Calcola la funzione di distribuzione cumulativa (CDF) in Python
- 2. Come calcolare la media mobile cumulativa in Python/SQLAlchemy/Flask
- 3. Funzione di distribuzione normale cumulativa in C/C++
- 4. python pylab trama distribuzione normale
- 5. Come ottenere la funzione di distribuzione cumulativa con NumPy?
- 6. trame di distribuzione cumulativa di pitone
- 7. Trama logaritmica di una funzione di distribuzione cumulativa in matplotlib
- 8. Come posso calcolare la massima stima di probabilità in Python
- 9. calcolare normale per vertice OpenGL
- 10. Come calcolare la somma cumulativa per un vettore di doppi in C++?
- 11. pitone 3.1 - Creazione di distribuzione normale
- 12. Come calcolare skipgram in python?
- 13. Come generare numeri con una distribuzione normale in SQL Server
- 14. Come disegnare una distribuzione normale standard in R
- 15. Funzione standard di distribuzione normale z in C#
- 16. Fare una distribuzione normale standard R
- 17. Un modo più semplice per tracciare la distribuzione della frequenza cumulativa in ggplot?
- 18. multivariata normale CDF in Python utilizzando SciPy
- 19. PHP: numero casuale da una distribuzione normale
- 20. Somma cumulativa condizionale in R
- 21. Somma cumulativa di array in Ruby
- 22. Come calcolare la media mobile in Python 3?
- 23. Come calcolare la differenza tra due date in python
- 24. Densità normale multivariata in Python?
- 25. Numero casuale in una distribuzione normale obliqua (equivalente a NORMINV())
- 26. Distribuzione esponenziale in Python
- 27. Come calcolare il prossimo venerdì in Python?
- 28. Dato 3 punti, come faccio a calcolare il vettore normale?
- 29. Calcolare le modalità in una distribuzione multimodale in R
- 30. Calcolo della derivata della funzione di densità cumulativa in Python
Poiché la std lib implementa math.erf(), non è necessaria un'implementazione sep. – Marc