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)
2 回答
从概率密度到分位数不存在1:1的映射 .
因为正态分布的PDF是二次的,所以可以存在具有特定概率密度的2,1或0个分位数 .
更新
实际上,从分析上找到根源并不困难 . 正态分布的PDF由下式给出:
通过一些重新排列,我们得到:
如果RHS上的判别式<0,则没有真正的根 . 如果它等于零,则有一个根(其中x = mu),并且它> 0时有两个根 .
将它们组合成一个函数:
这给出了所需的分位数,在舍入误差范围内:
存在无限次地获得任何值的分布 . (例如,在长度为1 / 2,1 / 4,1 / 8等的无限序列间隔上,值为1的简单函数无限次地获得值1.并且它是自1的分布2 1/4 1/8 ... = 1)
所以上面的
fsolve
的使用并不能保证找到x
的所有值,其中pdf(x)
等于某个值,但它可能会帮助你找到一些根 .