逆概率密度函数

Soi*_*oid 5 python statistics numpy scipy

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

from scipy.stats import norm
norm.pdf(1000, loc=1040, scale=210)
0.0018655737107410499
Run Code Online (Sandbox Code Playgroud)

如何计算出 0.0018 概率对应于给定正态分布中的 1000?

ali*_*i_m 5

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

在此输入图像描述

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

更新

其实通过分析寻找根源并不难。正态分布的 PDF 由下式给出:

在此输入图像描述

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

(x - mu)**2 = -2 * sigma**2 * log( pd * sigma * sqrt(2 * pi))
Run Code Online (Sandbox Code Playgroud)

如果 RHS 上的判别式 < 0,则没有实根。如果它等于 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)
Run Code Online (Sandbox Code Playgroud)

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

from scipy.stats import norm
pd = norm.pdf(1000, loc=1040, scale=210)
print get_quantiles(pd, 1040, 210)
# (1000.0000000000001, 1079.9999999999998)
Run Code Online (Sandbox Code Playgroud)