Scipy stats 概率大于 1

Scr*_*die 1 python precision distribution scipy.stats

我正在计算二项式概率质量函数的值,发现当将极端参数传递给 pmf 时,它们的总和超过 1。

参见示例:

from scipy.stats import binom
n = 1541096362225563.0
p = 1.0477878413173978e-18
vals = [binom.pmf(n=n, p=p, k=i) for i in range(3)]
print(vals)  # -> [0.9983865609638467, 1.0, 0.060730098812886574]
Run Code Online (Sandbox Code Playgroud)

我可以看到如何将 1.0 作为错误过滤掉,但即使其余值的总和也超过 1。就我的目的而言,我不介意 之类的数值不精确性np.finfo(np.float16).eps,但该示例显然更加极端。有没有好的办法来处理这个问题呢?

pjs*_*pjs 5

对于如此极小p和极大的n情况,我建议尝试二项式 的泊松近似,其中速率 \xce\xbb 为n*p。这将参数化提升到一个水平,您无需强调浮点运算的限制。

\n
from scipy.stats import poisson\nn = 1541096362225563.0\np = 1.0477878413173978e-18\nlmbd = n * p\nvals = [poisson.pmf(k=i, mu=lmbd) for i in range(3)]\nprint(vals)  # -> [0.9983865609638467, 0.0016121367428128667, 1.3015924788782268e-06]\n
Run Code Online (Sandbox Code Playgroud)\n

我能看到的唯一的其他选择是用有理数自己实现二项式计算,但这在计算上会变得非常昂贵。

\n