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

时间:2012-02-25 21:29:23

标签: python math probability probability-theory

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

  1. 随机变量r的概率,其中r <1。 x或r&lt; = x。
  2. 随机变量r的概率,其中r> 1。 x或r&gt; = x。
  3. 随机变量r的概率,其中x> r>收率
  4. 我找到了一些库,比如Pgnumerics,它们提供了计算这些函数的函数,但基础数学对我来说还不清楚。

    编辑:为了表明这不是作业,下面发布的是我的Python工作代码&lt; = 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)
    

1 个答案:

答案 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是标准偏差。

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

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