小能豆

Python 中的对数计算

py

我正在寻找计算类似的东西:

1.gif

其中f(i)是一个函数,它对 中的任意 都返回一个实[-1,1]数。i``{1,2,...,5000}

显然,总和的结果在 的某个地方[-1,1],但是当我似乎无法使用直接编码在 Python 中计算它时,因为变成并且变成,这导致计算出的总和变成。0.55000``0``comb(5000,2000)``inf``NaN

所需的解决方案是在两侧使用日志。

那就是使用恒等式,如果我可以计算并且我就可以计算出总和,即使很大并且几乎是。a × b = 2log(a) + log(b)``log(a)``log(b)``a``b``0

所以我想我要问的是是否有一种简单的方法来计算

log2(scipy.misc.comb(5000,2000))

所以我可以用简单的方法计算总和

sum([2**(log2comb(5000,i)-5000) * f(i) for i in range(1,5000) ])

@abarnert 的解决方案虽然适用于 5000 个数字,但通过提高计算梳状的精度解决了该问题。这适用于此示例,但无法扩展,因为如果我们使用 1e7 而不是 5000,则所需的内存将显著增加。

目前,我正在使用一种不太好但可以保持较低内存消耗的解决方法:

log2(comb(5000,2000)) = sum([log2 (x) for x in 1:5000])-sum([log2 (x) for x in 1:2000])-sum([log2 (x) for x in 1:3000])

有没有一种用可读的表达方式来做到这一点?


阅读 15

收藏
2024-12-05

共1个答案

小能豆

总和

1.gif

f是关于二项分布的期望,其中n = 5000p = 0.5

您可以使用scipy.stats.binom.expect来计算:

import scipy.stats as stats

def f(i):
    return i
n, p = 5000, 0.5
print(stats.binom.expect(f, (n, p), lb=0, ub=n))
# 2499.99999997

还要注意,当n趋向无穷大时,p固定时,二项分布趋近于均值和方差为的正态分布。因此,对于较大的,你可以计算:np``np*(1-p)``n

import math
print(stats.norm.expect(f, loc=n*p, scale=math.sqrt((n*p*(1-p))), lb=0, ub=n))
# 2500.0
2024-12-05