也许我不明白 .ppf()
的功能好吧,但是根据wikipedia , ppf(q)
应该返回所有实数的下确界 x
其中q <= cdf(x)
。因为对于每个 x
cdf
任何分布的 都是非负的,我期望 ppf(0)
返回-inf
。然而,看起来
scipy.stats.randint(0, 2).ppf(0) ## returns -1.0 ..?
你知道这种行为的原因吗?
最佳答案
你是对的——randint.ppf是以一种不那么谨慎的方式实现的。以下是 scipy/stats/distributions.py 中 cdf 和 ppf 的代码(来自 scipy 0.9.0):
def _cdf(self, x, min, max):
k = floor(x)
return (k-min+1)*1.0/(max-min)
def _ppf(self, q, min, max):
vals = ceil(q*(max-min)+min)-1
vals1 = (vals-1).clip(min, max)
temp = self._cdf(vals1, min, max)
return where(temp >= q, vals1, vals)
如您所见,当 q = 0 时,将从 ppf 返回 -1。另请注意 ppf(0.01) = 0(应为 -inf)和 ppf(0.51) = 1(应为 0)。
这个 ppf 真的很糟糕——或者也许更宽容地说它是在没有考虑任何严格定义的情况下编写的。可用的文档说 ppf 是“cdf 的逆”,但是当 cdf 不是 1 比 1 时,当然这是没有意义的。
关于python - scipy 的 randint(0, 2) 的 ppf(0) 为 -1.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25688461/