回答:
次に例を示します。
>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435
言い換えると、標準正規間隔の約95%は、0の標準平均を中心とした2つの標準偏差内にあります。
逆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))
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
以降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
アレックスの答えは、標準正規分布の解決策を示しています(平均= 0、標準偏差= 1)。mean
and 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
グーグルが検索netlogo pdfに対してこの答えを与えるので、ここに上記のpythonコードのnetlogoバージョンがあります
;; 正規分布累積密度関数 to-report normcdf [x mu sigma] tx-muとしましょう y 0.5 * erfcc [-t /(sigma * sqrt 2.0)]とします。 if(y> 1.0)[set y 1.0] レポートy 終わり ;; 正規分布確率密度関数 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) レポートy 終わり ;; 相補誤差関数 報告するerfcc [x] z、ab、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] 終わり