python - scipy 的 randint(0, 2) 的 ppf(0) 为 -1.0

标签 python statistics scipy

也许我不明白 .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/

相关文章:

python - 使用正则表达式获取匹配字符串的百分比

python - 在 HTML 中显示一个 python 文件,保留空格等

java - Java 中的夏皮罗威尔克斯

R : How to find data only within 1 standard deviation

algorithm - 生成随机列联表的有效方法?

python - fmin_l_bfgs_b 返回 NaN 作为函数值,但我不明白

macos - 在 Mac OS Lion 上为 Python3 构建 numpy/scipy

python - 如何使用 Paramiko 传递命令行 ssh 参数?

python - 如何使用 python 自动更改 html &lt;input&gt; 标签?

python - 创建大小为 2e5 的随机数组时 VisibleDeprecationWarning