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