给定定义normal distribution的均值和标准偏差,您将如何计算纯Python中的以下概率(即没有Numpy / Scipy或其他不在标准库中的包)?
我找到了一些库,比如Pgnumerics,它们提供了计算这些函数的函数,但基础数学对我来说还不清楚。
编辑:为了表明这不是作业,下面发布的是我的Python工作代码< = 2.6,虽然我不确定它是否正确处理边界条件。
from math import *
import unittest
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 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
def normrange(x1, x2, mu, sigma, f=True):
"""
Calculates probability of random variable falling between two points.
"""
p1 = normdist(x1, mu, sigma, f)
p2 = normdist(x2, mu, sigma, f)
return abs(p1-p2)
答案 0 :(得分:9)
所有这些非常相似:如果您可以使用函数cdf(x)
计算#1,那么#2的解决方案只是1 - cdf(x)
,而#3则是cdf(x) - cdf(y)
。
由于Python包含自2.7版本以来内置的(高斯)错误函数,您可以通过使用the article you linked to中的等式计算正态分布的cdf来实现此目的:
import math
print 0.5 * (1 + math.erf((x - mean)/math.sqrt(2 * standard_dev**2)))
其中mean
是平均值,standard_dev
是标准偏差。
根据文章中的信息,您提出的一些注意事项似乎相对简单:
cdf(x)
。然后1 - cdf(x)
是随机变量X> = x的概率。由于> =对于连续随机变量等于>,这也是概率X> 1。 X