Numpy veya Scipy'de (veya herhangi bir titiz Python kitaplığında) bana Python'daki kümülatif normal dağılım işlevini verecek bir işlev arıyorum.
Yanıtlar:
İşte bir örnek:
>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435
Diğer bir deyişle, standart normal aralığın yaklaşık% 95'i, standart bir sıfır ortalamasına odaklanan iki standart sapma dahilindedir.
Ters CDF'ye ihtiyacınız varsa:
>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)
loc
ve olarak adlandırıyor scale
? help(norm.ppf)
Ama sonra ne olduğunu kullandım loc
ve scale
- yardım için yardıma ihtiyacım var ..
Soruyu cevaplamak için çok geç olabilir, ancak Google hala insanları buraya yönlendirdiği için çözümümü buraya yazmaya karar verdim.
Yani, Python 2.7'den beri, math
kütüphane hata fonksiyonunu entegre ettimath.erf(x)
erf()
Fonksiyonu, toplam standart normal dağılım olarak geleneksel istatistiksel fonksiyonlar hesaplamak için kullanılabilir:
from math import *
def phi(x):
#'Cumulative distribution function for the standard normal distribution'
return (1.0 + erf(x / sqrt(2.0))) / 2.0
Referans:
https://docs.python.org/2/library/math.html
https://docs.python.org/3/library/math.html
Hata İşlevi ve Standart Normal dağılım işlevi nasıl ilişkilidir?
def phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2
.
Başlangıç olarak Python 3.8
, standart kütüphane NormalDist
nesneyi statistics
modülün bir parçası olarak sağlar .
Belirli bir ortalama ( ) ve standart sapma ( ) için kümülatif dağılım fonksiyonunu ( cdf
- rastgele bir X örneğinin x'e eşit veya daha küçük olma olasılığı) elde etmek için kullanılabilir :mu
sigma
from statistics import NormalDist
NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796
Standart normal dağılım için basitleştirilebilir ( mu = 0
ve sigma = 1
):
NormalDist().cdf(1.96)
# 0.9750021048517796
NormalDist().cdf(-1.96)
# 0.024997895148220428
Buradan uyarlanmıştır 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))
Bilinmeyen örneğine dayanarak, normdist () işlevinin birçok kitaplıkta uygulanan Python eşdeğeri şöyle olacaktır:
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
Alex'in cevabı size standart normal dağılım için bir çözüm gösteriyor (ortalama = 0, standart sapma = 1). mean
Ve ile std
(olan sqr(var)
) normal dağılımınız varsa ve hesaplamak istiyorsanız:
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)
Hakkında daha fazla bilgi okuyun burada cdf birçok formüllerle ve normal dağılımın scipy uygulanması burada .
Yukarıdan alınmıştır:
from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435
İki kuyruklu bir test için:
Import numpy as np
z = 1.96
p_value = 2 * norm.cdf(-np.abs(z))
0.04999579029644087
Bunun gibi basit:
import math
def my_cdf(x):
return 0.5*(1+math.erf(x/math.sqrt(2)))
Formülü bu sayfada buldum https://www.danielsoper.com/statcalc/formulas.aspx?id=55
Google netlogo pdf araması için bu cevabı verirken , işte yukarıdaki python kodunun netlogo sürümü.
;; Normal dağılım kümülatif yoğunluk işlevi normcdf [x mu sigma] bildirmek let tx - mu let y 0.5 * erfcc [- t / (sigma * sqrt 2.0)] eğer (y> 1.0) [y 1.0'ı ayarlayın] rapor y son ;; Normal dağılım olasılığı yoğunluk işlevi normpdf [x mu sigma] rapor etmek let u = (x - mu) / abs sigma let y = 1 / (sqrt [2 * pi] * abs sigma) * exp (- u * u / 2.0) rapor y son ;; Tamamlayıcı hata işlevi erfcc [x] bildirmek izin ver z abs x let t 1.0 / (1.0 + 0.5 * z) let 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) [rapor r] [rapor 2.0 - r] son