我需要使用什么来计算正态分布的逆概率密度函数?我正在使用scipy来找出正态分布概率密度函数:
from scipy.stats import norm
norm.pdf(1000, loc=1040, scale=210)
0.0018655737107410499
如何判断在给定的正态分布中0.0018概率对应于1000?
答案 0 :(得分:3)
从概率密度到分位数不能有1:1的映射。
由于正态分布的PDF是二次的,因此可能存在具有特定概率密度的2,1或零分位数。
分析上找到根源并不难。正态分布的PDF由下式给出:
我们得到了一些重新排列:
(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。