python - 逆概率密度函数

标签 python numpy statistics scipy

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

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

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

最佳答案

不可能存在从概率密度到分位数的 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)

关于python - 逆概率密度函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22264046/

相关文章:

python - Numpy:二维数组,删除奇数索引并保持相同的数组格式

r - 在 R 中构建一个循环,将所有行写入单独的文件中,每个文件一行

Python:没有机器学习的网格搜索?

python - 如何从 SonarQube 测试覆盖范围中排除 `if __name__ == ' __main_ _':` 下的代码

python - 将 Numpy 数组按列转换为 Pandas DataFrame(作为单行)

algorithm - 协方差矩阵计算

python - 从噪声值列表中计算 "near multiplicity"的度量

php - Python-ModuleNotFoundError : No module named 'selenium'

python Pandas : Assign Last Value of DataFrame Group to All Entries of That Group

python - Numpy 矩阵减法混淆