Szukam funkcji w Numpy lub Scipy (lub jakiejkolwiek rygorystycznej bibliotece Pythona), która da mi skumulowaną funkcję rozkładu normalnego w Pythonie.Jak obliczyć skumulowaną normalną dystrybucję w Pythonie
Odpowiedz
adaptowany stąd 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))
Oto przykład:
>>> from scipy.stats import norm
>>> norm.cdf(1.96)
array(0.97500210485177952)
Jeśli potrzebujesz CDF odwrotny:
>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)
Można również określić średnią (loc) i wariancję (skalę) jako parametry. np. d = norma (loc = 10,0, skala = 2,0); d.cdf (12,0); Szczegóły tutaj: http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.norm.html – Irvan
@Irvan, parametr skali jest w rzeczywistości odchyleniem standardowym, a NIE wariancją. – qkhhly
Dlaczego scipy nazywają je 'loc' i' scale'? Użyłem 'help (norm.ppf)' ale co do cholery są 'loc' i' scale' - potrzebuję pomocy dla pomocy .. – javadba
budować na przykład Bezimiennego, odpowiednik Python od funkcja normdist() zastosowana w wielu bibliotekach będzie następująca:
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
Jak Google daje taką odpowiedź na poszukiwanie NetLogo pdf, oto NetLogo wersja powyższego kodu Pythona
;; 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
Pytanie dotyczy Pythona, a nie NetLogo. Ta odpowiedź nie powinna tu być. I nie edytuj pytania, aby zmienić jego znaczenie. – interjay
Jestem świadomy, że nie jest to preferowany sposób, ale myślę, że jest to najbardziej pomocne w ten sposób, ponieważ ludzie są kierowani na tę stronę przez google (obecnie ...) – platipodium
może być za późno, aby odpowiedzieć na pytanie, ale ponieważ Google nadal prowadzi tutaj ludzie, postanawiam napisać tutaj moje rozwiązanie.
To jest, ponieważ Python 2.7, biblioteka math
zintegrował funkcję błędu math.erf(x)
Funkcja erf()
mogą być wykorzystane do obliczenia tradycyjne funkcje statystyczne, takie jak skumulowanego rozkładu normalnego:
from math import *
def phi(x):
#'Cumulative distribution function for the standard normal distribution'
return (1.0 + erf(x/sqrt(2.0)))/2.0
Ref:
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?
To było dokładnie to, czego szukałem. Jeśli ktoś inny niż ja zastanawia się, w jaki sposób można to wykorzystać do obliczenia "odsetka danych, które leży w standardowej dystrybucji", dobrze: 1 - (1 - phi (1)) * 2 = 0,6827 ("68% danych w ramach 1 standardu odchylenie") –
Alexa odpowiedź pokazuje rozwiązanie dla standardowego rozkładu normalnego (średnia = 0, odchylenie standardowe = 1). Jeśli masz rozkład normalny z mean
i std
(co jest sqr(var)
) i chcesz obliczyć:
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)
Więcej o cdf here i scipy realizację rozkładu normalnego z wieloma wzorami here.
- 1. Jak obliczyć skumulowaną sumę użyciu Spark
- 2. obliczyć normalną wartość dla każdego wierzchołka OpenGL
- 3. Jak uzyskać skumulowaną sumę
- 4. Jak obliczyć średnią ruchomą w Pythonie 3?
- 5. Jak obliczyć następny piątek w Pythonie?
- 6. Jak zunifikować normalną orientację?
- 7. Jak mogę obliczyć sygnaturę interfejsu AWS (v4) w pythonie?
- 8. Jak obliczyć łączną średnią ruchomą w Pythonie/SQLAlchemy/Flask
- 9. Jak obliczyć sumę kontrolną md5 pliku w Pythonie?
- 10. Jak obliczyć odwrotność normalnej funkcji rozkładu skumulowanego w pythonie?
- 11. Jak poprawnie utworzyć normalną mapę w THREE.js?
- 12. Mysql stworzyć dystrybucję Freqency
- 13. Jak uzyskać dystrybucję logarytmiczną w Pythonie za pomocą Mu i Sigmy?
- 14. Nie można dokładnie obliczyć pi na Pythonie
- 15. Jak zdobyć dystrybucję fanów stron według kraju?
- 16. Jak poznać dystrybucję Linuksa, której używam?
- 17. Python scipy - określ niestandardową dystrybucję dyskretną
- 18. Jak zmienić normalną kolumnę na "obliczoną" kolumnę
- 19. Jak wydrukować pełną dystrybucję słów w temacie LDA w gensim?
- 20. Wykonaj odwrotną sumę skumulowaną na tablicy numpy
- 21. jak zadeklarować zdefiniowaną przez użytkownika dystrybucję w R
- 22. ggplot2: histogramu z krzywą normalną
- 23. R- Jak wykonać sumę skumulowaną z unikatowymi identyfikatorami?
- 24. Jak generować liczby z normalną dystrybucją w SQL Server
- 25. Jak odróżnić normalną instalację od aktualizacji w WIX?
- 26. Jak obliczyć nachylenie w SQL
- 27. Jak obliczyć sumę w JSTL
- 28. Jak obliczyć gl_FragCoord w glsl
- 29. Jak obliczyć rowSums w rcpp
- 30. Jak zmodyfikować datetime.datetime.hour w Pythonie?
Ponieważ biblioteka standardowa implementuje program math.erf(), nie ma potrzeby implementacji sep. – Marc