也许我不太了解.ppf()的功能,但是根据wikipediappf(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/

10-12 14:55