首页 文章

逆概率密度函数

提问于
浏览
2

我需要用什么来计算正态分布的逆概率密度函数?我正在使用scipy来找出正态分布概率密度函数:

from scipy.stats import norm
norm.pdf(1000, loc=1040, scale=210)
0.0018655737107410499

如何判断在给定的正态分布中0.0018概率对应于1000?

2 回答

  • 3

    从概率密度到分位数不存在1:1的映射 .

    enter image description here

    因为正态分布的PDF是二次的,所以可以存在具有特定概率密度的2,1或0个分位数 .

    更新

    实际上,从分析上找到根源并不困难 . 正态分布的PDF由下式给出:

    enter image description here

    通过一些重新排列,我们得到:

    (x - mu)**2 = -2 * sigma**2 * log( pd * sigma * sqrt(2 * pi))
    

    如果RHS上的判别式<0,则没有真正的根 . 如果它等于零,则有一个根(其中x = mu),并且它> 0时有两个根 .

    将它们组合成一个函数:

    import numpy as np
    
    def get_quantiles(pd, mu, sigma):
    
        discrim = -2 * sigma**2 * np.log(pd * sigma * np.sqrt(2 * np.pi))
    
        # no real roots
        if discrim < 0:
            return None
    
        # one root, where x == mu
        elif discrim == 0:
            return mu
    
        # two roots
        else:
            return mu - np.sqrt(discrim), mu + np.sqrt(discrim)
    

    这给出了所需的分位数,在舍入误差范围内:

    from scipy.stats import norm
    pd = norm.pdf(1000, loc=1040, scale=210)
    print get_quantiles(pd, 1040, 210)
    # (1000.0000000000001, 1079.9999999999998)
    
  • 2
    import scipy.stats as stats
    import scipy.optimize as optimize
    norm = stats.norm(loc=1040, scale=210)
    y = norm.pdf(1000)
    print(y)
    # 0.00186557371074
    
    print(optimize.fsolve(lambda x:norm.pdf(x)-y, norm.mean()-norm.std()))
    # [ 1000.]
    print(optimize.fsolve(lambda x:norm.pdf(x)-y, norm.mean()+norm.std()))
    # [ 1080.]
    

    存在无限次地获得任何值的分布 . (例如,在长度为1 / 2,1 / 4,1 / 8等的无限序列间隔上,值为1的简单函数无限次地获得值1.并且它是自1的分布2 1/4 1/8 ... = 1)

    所以上面的 fsolve 的使用并不能保证找到 x 的所有值,其中 pdf(x) 等于某个值,但它可能会帮助你找到一些根 .

相关问题