根据这个帖子:To Compute log(a+b)
有时log_sum的实现方式如下:
log(a + b) = log(a * (1 + b/a)) = log a + log(1 + b/a)
我很困惑为什么这种方法更有效率。有没有人对此有想法?
答案 0 :(得分:3)
当a
为常量(至少对于某些b
值)和b<<a
(明显更小)时,此方法可能很有用。在这种情况下,log(1 + b/a)
可以通过Taylor series扩展快速计算并具有良好的精度(log1p
函数在某些数学库中another method)
答案 1 :(得分:2)
在我看到这种事情的一个地方是处理高维空间的概率或可能性。人们有时想要计算总和,如
p1 + p2 + ..
然而,这些概率通常太小而无法用双精度表示,因此人们常常使用概率的对数来处理。然后我们要计算
log( exp(l1) + exp( l2) + ..)
其中l是p1等的日志 问题是,如果只是评估exps,那么很可能得到0,然后表达式变得不确定。但是你提到的诀窍是救援,我们可以评估
l1 + log( 1 + exp(l2-l1) + ...)
这将合理地评估(至少l1是l中最大的)。
所以这不是效率的问题,而是绕过双打的有限精度。