也许我不太了解.ppf()
的功能,但根据wikipedia,ppf(q)
应该返回所有实数x
的下限q <= cdf(x)
{1}}。由于任何分布的每个x
cdf
都是非负数,因此我希望ppf(0)
返回-inf
。但是,似乎
scipy.stats.randint(0, 2).ppf(0) ## returns -1.0 ..?
有关此行为原因的任何想法吗?
答案 0 :(得分:2)
你是对的 - 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时没有意义。