用Python计算分布中随机变量的概率

Cer*_*rin 7 python math probability probability-theory

给定定义正态分布的均值和标准偏差,您将如何计算纯Python中的以下概率(即没有Numpy/Scipy或其他不在标准库中的包)?

  1. 随机变量r的概率r其中r <x或r <= x.
  2. 随机变量r的概率r其中r> x或r> = x.
  3. 随机变量r的概率,其中x> r> y.

我发现一些库,比如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)
Run Code Online (Sandbox Code Playgroud)

ame*_*eer 9

所有这些都非常相似:如果你可以使用函数计算#1 cdf(x),那么#2的解决方案就是简单的1 - cdf(x),而对于#3则是cdf(x) - cdf(y).

由于Python包含自2.7版本以来内置的(高斯)错误函数,您可以使用您链接到的文章中的等式计算正态分布的cdf来完成此操作:

import math
print 0.5 * (1 + math.erf((x - mean)/math.sqrt(2 * standard_dev**2)))
Run Code Online (Sandbox Code Playgroud)

mean平均值在哪里,standard_dev是标准偏差.

鉴于文章中的信息,您提出的一些注意事项似乎相对简单:

  • 随机变量(比如X)的CDF是X位于-infinity和某个极限之间的概率,比如x(小写).CDF是连续分发的pdf的组成部分.cdf正是您为#1所描述的,您希望某些正态分布的RV介于-infinity和x(<= x)之间.
  • <和<=以及>和> =对于连续随机变量是相同的,因为rv是任何单个点的概率是0.因此,在计算连续分布的概率时,是否包含x本身并不重要.
  • 概率之和为1,如果不是<x那么它> = x所以如果你有cdf(x).然后1 - cdf(x)是随机变量X> = x的概率.由于> =等于连续随机变量>,这也是概率X> x.