我正在寻找计算类似的东西:
其中f(i)是一个函数,它对 中的任意 都返回一个实[-1,1]数。i``{1,2,...,5000}
f(i)
[-1,1]
i``{1,2,...,5000}
显然,总和的结果在 的某个地方[-1,1],但是当我似乎无法使用直接编码在 Python 中计算它时,因为变成并且变成,这导致计算出的总和变成。0.55000``0``comb(5000,2000)``inf``NaN
0.55000``0``comb(5000,2000)``inf``NaN
所需的解决方案是在两侧使用日志。
那就是使用恒等式,如果我可以计算并且我就可以计算出总和,即使很大并且几乎是。a × b = 2log(a) + log(b)``log(a)``log(b)``a``b``0
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])
有没有一种用可读的表达方式来做到这一点?
总和
f是关于二项分布的期望,其中n = 5000和p = 0.5。
f
n = 5000
p = 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
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