首页 文章

在Python中给出mean,std给出正态分布的概率

提问于
浏览
51

如何在Python中给出mean,std给出正态分布的概率?我总是可以根据像这个问题中的OP这样的定义显式编写我自己的函数:Calculating Probability of a Random Variable in a Distribution in Python

只是想知道是否有一个库函数调用将允许你这样做 . 在我的想象中它会这样:

nd = NormalDistribution(mu=100, std=12)
p = nd.prob(98)

Perl中有一个类似的问题:How can I compute the probability at a point given a normal distribution in Perl? . 但我没有在Python中看到一个 .

Numpyrandom.normal 功能,但它就像采样,不完全是我想要的 .

6 回答

  • 24

    scipy.stats中有一个:

    >>> import scipy.stats
    >>> scipy.stats.norm(0, 1)
    <scipy.stats.distributions.rv_frozen object at 0x928352c>
    >>> scipy.stats.norm(0, 1).pdf(0)
    0.3989422804014327
    >>> scipy.stats.norm(0, 1).cdf(0)
    0.5
    >>> scipy.stats.norm(100, 12)
    <scipy.stats.distributions.rv_frozen object at 0x928352c>
    >>> scipy.stats.norm(100, 12).pdf(98)
    0.032786643008494994
    >>> scipy.stats.norm(100, 12).cdf(98)
    0.43381616738909634
    >>> scipy.stats.norm(100, 12).cdf(100)
    0.5
    

    [要注意的一件事 - 只是一个提示 - 是参数传递有点宽泛 . 由于代码的设置方式,如果你不小心写了 scipy.stats.norm(mean=100, std=12) 而不是 scipy.stats.norm(100, 12)scipy.stats.norm(loc=100, scale=12) ,那么它会接受它,但是会默默地丢弃那些额外的关键字参数并给你默认值(0,1) .

  • 0

    Scipy.stats是一个很棒的模块 . 只是提供另一种方法,您可以直接使用它来计算

    import math
    def normpdf(x, mean, sd):
        var = float(sd)**2
        pi = 3.1415926
        denom = (2*pi*var)**.5
        num = math.exp(-(float(x)-float(mean))**2/(2*var))
        return num/denom
    

    这使用此处找到的公式:http://en.wikipedia.org/wiki/Normal_distribution#Probability_density_function

    去测试:

    >>>normpdf(7,5,5)  
    0.073654028688865794
    >>> norm(5,5).pdf(7)
    0.073654028060664664
    
  • 1

    这是more info . 首先,您正在处理冻结分布(在这种情况下冻结意味着其参数设置为特定值) . 要创建冻结分布:

    import scipy.stats
    scipy.stats.norm(loc=100, scale=12)
    #where loc is the mean and scale is the std dev
    #if you wish to pull out a random number from your distribution
    scipy.stats.norm.rvs(loc=100, scale=12)
    
    #To find the probability that the variable has a value LESS than or equal
    #let's say 113, you'd use CDF cumulative Density Function
    scipy.stats.norm.cdf(113,100,12)
    Output: 0.86066975255037792
    #or 86.07% probability
    
    #To find the probability that the variable has a value GREATER than or
    #equal to let's say 125, you'd use SF Survival Function 
    scipy.stats.norm.sf(125,100,12)
    Output: 0.018610425189886332
    #or 1.86%
    
    #To find the variate for which the probability is given, let's say the 
    #value which needed to provide a 98% probability, you'd use the 
    #PPF Percent Point Function
    scipy.stats.norm.ppf(.98,100,12)
    Output: 124.64498692758187
    
  • 7

    答案中提到的维基百科引用的公式不能用于计算正常概率 . 您必须使用该公式编写数值积分近似函数,以便计算概率 .

    该公式计算概率密度函数的值 . 由于正态分布是连续的,因此必须计算积分以获得概率 . 维基百科网站提到了CDF,它没有正常分发的封闭形式 .

  • 84

    我写了这个程序来为你做数学运算 . 只需输入摘要统计信息即可 . 无需提供数组:

    One-Sample Z-Test for a Population Proportion:

    要为平均值而不是比例执行此操作,请相应地更改z的公式

  • 1

    你可以使用内置于数学库的错误函数,如website所述 .

相关问题