Python에서 누적 정규 분포 함수를 제공하는 Numpy 또는 Scipy (또는 엄격한 Python 라이브러리)의 함수를 찾고 있습니다.
답변:
예를 들면 다음과 같습니다.
>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435
즉, 표준 정규 구간의 약 95 %는 표준 평균 0을 중심으로 두 표준 편차 내에 있습니다.
역 CDF가 필요한 경우 :
>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)
loc
and 로 명명 scale
합니까? 나는를 사용 help(norm.ppf)
하지만 도대체 무엇을 loc
하고 scale
.. 도움에 대한 도움이 필요 -
질문에 답하기에는 너무 늦었을지 모르지만 Google이 여전히 사람들을 여기에서 이끌 기 때문에 여기에 솔루션을 작성하기로 결정했습니다.
즉, Python 2.7부터 math
라이브러리는 오류 기능을 통합했습니다.math.erf(x)
이 erf()
함수는 누적 표준 정규 분포와 같은 기존 통계 함수를 계산하는 데 사용할 수 있습니다.
from math import *
def phi(x):
#'Cumulative distribution function for the standard normal distribution'
return (1.0 + erf(x / sqrt(2.0))) / 2.0
참고 :
https://docs.python.org/2/library/math.html
def phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2
.
여기 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))
시작 Python 3.8
하면 표준 라이브러리 NormalDist
가 statistics
모듈의 일부로 객체를 제공합니다 .
주어진 평균 ( ) 및 표준 편차 ( )에 대해 누적 분포 함수 ( cdf
-임의 표본 X가 x보다 작거나 같을 확률) 를 얻는 데 사용할 수 있습니다 .mu
sigma
from statistics import NormalDist
NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796
표준 정규 분포 ( mu = 0
및 sigma = 1
)에 대해 단순화 할 수 있습니다 .
NormalDist().cdf(1.96)
# 0.9750021048517796
NormalDist().cdf(-1.96)
# 0.024997895148220428
Unknown의 예제를 기반으로 빌드하기 위해 많은 라이브러리에 구현 된 normdist () 함수에 해당하는 Python은 다음과 같습니다.
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의 대답은 표준 정규 분포에 대한 해를 보여줍니다 (평균 = 0, 표준 편차 = 1). mean
및 std
()를 사용하는 정규 분포가 있고 sqr(var)
계산하려는 경우 :
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)
다음과 같이 간단합니다.
import math
def my_cdf(x):
return 0.5*(1+math.erf(x/math.sqrt(2)))
이 페이지에서 공식을 찾았습니다 https://www.danielsoper.com/statcalc/formulas.aspx?id=55
Google이 netlogo pdf 검색에 대한 답변을 제공 하므로 위의 Python 코드의 netlogo 버전이 있습니다.
;; 정규 분포 누적 밀도 함수 보고 할 normcdf [x mu sigma] let tx-mu let y 0.5 * erfcc [-t / (시그마 * sqrt 2.0)] if (y> 1.0) [set y 1.0] 보고 y 종료 ;; 정규 분포 확률 밀도 함수 보고 할 normpdf [x mu sigma] let u = (x-mu) / abs 시그마 let y = 1 / (sqrt [2 * pi] * abs sigma) * exp (-u * u / 2.0) 보고 y 종료 ;; 보완 오류 기능 보고 할 erfcc [x] 하자 z abs x 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 * (.27886807 + t * (-1.13520398 + t * (1.48851587 + t * (-0.82215223 + t * .17087277))))))))) ifelse (x> = 0) [보고서 r] [보고서 2.0-r] 종료