【发布时间】:2015-01-12 08:52:17
【问题描述】:
我正在寻找类似的计算:
其中f(i) 是一个函数,它在[-1,1] 中为{1,2,...,5000} 中的任何i 返回一个实数。
显然,总和的结果在 [-1,1] 的某个位置,但是当我似乎无法使用 Python 使用直接编码计算它时,0.5<sup>5000</sup> 变为 0 和 comb(5000,2000) 变为inf,这导致计算的总和变成NaN。
需要的解决方案是两边都使用log。
这是使用身份a × b = 2<sup>log(a) + log(b)</sup>,如果我可以计算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])
有没有办法在可读的表达式中做到这一点?
【问题讨论】:
-
你认为整数占用多少内存?
comb(1000000, 200000)大约是2**721918,这意味着大约需要 720K 才能准确存储。而且,既然你只是暂时需要每一个,谁在乎呢?
标签: python scipy large-data