逆概率密度函数

时间:2014-03-08 02:01:55

标签: python numpy statistics scipy

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

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

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

2 个答案:

答案 0 :(得分:3)

从概率密度到分位数不能有1:1的映射。

enter image description here

由于正态分布的PDF是二次的,因此可能存在具有特定概率密度的2,1或零分位数。

更新

分析上找到根源并不难。正态分布的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)

答案 1 :(得分: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)等于某个值,但它可以帮助您找到某些 root。

相关问题