倒数概率密度函数

5

我应该使用什么方法来计算正态分布的反概率密度函数?我正在使用scipy来计算正态分布的概率密度函数:

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

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


4
0.0018不是概率,它是概率密度。你想要使用反向概率密度函数做什么?我从未见过在统计学中它被使用过。更常见的事情是寻找累积密度函数(cdf)的反函数,它可以返回概率。你可以使用norm.ppf来得到反向cdf。 - Jaime
2个回答

5

概率密度与分位数之间不存在1:1的映射关系。

enter image description here

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

更新

实际上,解析地找到根并不难。正态分布的概率密度函数为:

enter image description here

稍加整理即可得:

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

如果右侧的判别式小于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
为什么不可能找到所有的分位数? - Soid
当然,你可以解出 此处PDF方程 中的x,只要你选择的密度值至少有一个实根。我从你提问的措辞中理解到,你想要从概率密度到分位数的一对一映射,这是不可能的。 - ali_m
这两个答案真的很棒。一个通过解析方法解决了这个问题,另一个通过 optimize.fsolve 数值优化方法解决了这个问题。但是我决定将这个解析方法的答案标记为“已接受”,因为解析方法对于确定给定精度的根更有效。 - Soid

4
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 并不能保证找到所有满足 pdf(x) 等于某个特定值的 x,但它可能会帮助您找到 一些 根。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接