scipy stats binom cdf返回nan

时间:2018-11-07 22:48:28

标签: python scipy

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

因此,scipy.stats.binom(7000000000, 0.5).cdf(6999999999)应该返回几乎正好为1的数字,因为在70亿次试验中,以50/50的机会获得成功的可能性是在70亿次减去1次或更少的概率。相反,我得到np.nan。实际上,对于提供给.cdf的任何价值(本身价值不超过70亿美元),我都会收回np.nan

这是怎么回事? scipy.stats发行版可以处理的数字数量是否有一定限制?

1 个答案:

答案 0 :(得分:2)

TL; DR

内部计算期间缺少浮点精度。尽管scipy是一个Python库,但它的核心是用C编写的,并使用C数字类型。


让我给你看一个例子:

"Person's_ID": "Test"

输出为:

<input type="password" id="inputPassword" class="form-control" placeholder="Password" required>

原因在于二项式分布的CDF公式(我无法嵌入图像,因此此处是指向Wiki的链接:https://en.wikipedia.org/wiki/Binomial_distribution

在scipy来源中,我们会看到对此实现的引用:http://www.netlib.org/cephes/doubldoc.html#bdtr

在内部深处涉及除以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)}") i: 0 probability: 0.5 i: 1 probability: 0.9990234375 i: 2 probability: 0.9999999999999999 i: 3 probability: 0.9999999999999999 i: 4 probability: 0.9999999999999999 i: 5 probability: 0.9999999999999999 i: 6 probability: 0.9999999999999999 i: 7 probability: 0.9999999999999999 i: 8 probability: 0.9999999999999999 i: 9 probability: 0.9999999999999999 i: 10 probability: nan i: 11 probability: nan i: 12 probability: nan 在这里称为trials,但称为nwm)。而且如果您的incbet.c, line 375: ai = 1.0 / a;太大,则除法运算的结果将很小,以至于当我们将此小数加到另一个而不是小数上时,它实际上并不会改变,因为我们这里缺乏浮点精度(仅到目前为止为64位)。然后,在进行更多的算术运算后,我们尝试从一个数字中获取对数,但是它等于零,因为它在应该改变的时候没有变化。并且a未定义,等于trials