124

我正在 Numpy 或 Scipy(或任何严格的 Python 库)中寻找一个函数,它会给我 Python 中的累积正态分布函数。

4

8 回答 8

149

这是一个例子:

>>> 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)
于 2009-04-30T22:24:02.590 回答
52

回答这个问题可能为时已晚,但由于谷歌仍然在这里引领人们,我决定在这里写下我的解决方案。

即从Python 2.7开始,该math库已经集成了error函数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

https://docs.python.org/3/library/math.html

误差函数和标准正态分布函数有什么关系?

于 2015-03-26T07:40:44.443 回答
39

开始Python 3.8,标准库将NormalDist对象作为statistics模块的一部分提供。

它可用于获取给定均值( ) 和标准差( ) 的累积分布函数( cdf- 随机样本 X 小于或等于 x 的概率):musigma

from statistics import NormalDist

NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796

可以简化为标准正态分布(mu = 0sigma = 1):

NormalDist().cdf(1.96)
# 0.9750021048517796

NormalDist().cdf(-1.96)
# 0.024997895148220428
于 2019-02-28T19:50:14.893 回答
18

改编自这里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))
于 2009-04-30T22:23:28.830 回答
17

以 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
于 2010-08-19T19:35:08.430 回答
13

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)

在此处阅读有关cdf 的更多信息,并在此处阅读具有许多公式的正态分布的 scipy 实现。

于 2015-11-20T10:24:57.540 回答
2

从上面拍摄:

from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435

对于双尾测试:

Import numpy as np
z = 1.96
p_value = 2 * norm.cdf(-np.abs(z))
0.04999579029644087
于 2019-02-06T22:17:18.240 回答
0

像这样简单:

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

于 2020-05-30T14:55:18.013 回答