scipy stats binom cdf返回nan

2024-05-29 06:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我理解正确,对于scipy.stats离散分布的cdf应该返回到给定参数的值的概率之和。在

因此,scipy.stats.binom(7000000000, 0.5).cdf(6999999999)应该返回几乎精确到1的值,因为在70亿次的试验中,有50/50的机会,在70亿次试验中成功的概率是非常确定的。相反,我得到np.nan。事实上,对于提供给.cdf的任何值,除了70亿本身(或更多),我得到np.nan。在

这是怎么回事?{cd2>中有不能处理^个数的分布?在


Tags: 参数statsnpscipynan概率机会cdf
1条回答
网友
1楼 · 发布于 2024-05-29 06:28:47

TL;DR

内部计算过程中缺少浮点精度。尽管scipy是一个Python库,但它的核心是用C编写的,并且使用C数值类型。在


我给你举个例子:

import scipy.stats

for i in range (13):
    trials = 10 ** i
    print(f"i: {i}\tprobability: {scipy.stats.binom(trials, 0.5).cdf(trials - 1)}")

输出为:

^{pr2}$

原因在于二项分布的CDF公式(我不能嵌入图像,所以这里是wiki的链接:https://en.wikipedia.org/wiki/Binomial_distribution

在scipy源代码中,我们可以看到这个实现的引用:http://www.netlib.org/cephes/doubldoc.html#bdtr

它的深层次涉及到trialsincbet.c, line 375: ai = 1.0 / a;这里称为a,但nwm)。如果你的trials太大,这个除法的结果就很小,当我们把这个小数字加到另一个不是那么小的数字上时,它实际上并没有改变,因为我们这里缺少浮点精度(到目前为止只有64位)。然后,经过更多的运算,我们试着从一个数中得到对数,但它等于零,因为它在应该改变的时候没有变化。并且log(0)未定义,等于np.nan。在

相关问题 更多 >

    热门问题