如果我正确理解,对于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
发行版可以处理的数字数量是否有一定限制?
答案 0 :(得分:2)
内部计算期间缺少浮点精度。尽管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
。