scipy的randint(0,2)的ppf(0)是-1.0

时间:2014-09-05 14:42:36

标签: python statistics scipy

也许我不太了解.ppf()的功能,但根据wikipediappf(q)应该返回所有实数x的下限q <= cdf(x) {1}}。由于任何分布的每个x cdf都是非负数,因此我希望ppf(0)返回-inf。但是,似乎

scipy.stats.randint(0, 2).ppf(0)  ## returns -1.0 ..?

有关此行为原因的任何想法吗?

1 个答案:

答案 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时没有意义。