C 为什么这样实现log_sum更有效?
根据这条线索: 有时log_sum的实现方式如下:C 为什么这样实现log_sum更有效?,c,math,optimization,numerical-methods,logarithm,C,Math,Optimization,Numerical Methods,Logarithm,根据这条线索: 有时log_sum的实现方式如下: log(a+b)=log(a*(1+b/a))=log a+log(1+b/a) 我不明白为什么这种方法更有效。。有人对此有想法吗?当a是常数时(至少对于某些b值),以及b
log(a+b)=log(a*(1+b/a))=log a+log(1+b/a)
我不明白为什么这种方法更有效。。有人对此有想法吗?当
a
是常数时(至少对于某些b
值),以及b<扩展速度快且精度高(log1p
函数在某些数学库中),这种方法可能有用。当a
是常数时,这种方法可能有用(至少对于一些b
值)和b<扩展速度快且精度高(log1p
函数在一些数学库中,)我见过这种事情的一个地方是在处理高维空间上的概率或似然性时
p1 + p2 + ..
然而,这样的概率往往太小,无法用双倍来表示,所以我们通常用概率的对数来代替
log( exp(l1) + exp( l2) + ..)
其中l是p1等的对数。
问题是,如果只对表达式求值,很可能得到0,然后表达式变得不确定。但是你提到的技巧是为了解围,我们可以求值
l1 + log( 1 + exp(l2-l1) + ...)
这将合理地评估(至少如果l1是l中最大的)
因此,这不是效率的问题,而是绕开有限的双倍精度。我见过这种情况的一个地方是在处理高维空间的概率或可能性时。人们有时想计算这样的和
p1 + p2 + ..
然而,这样的概率往往太小,无法用双倍来表示,所以我们通常用概率的对数来代替
log( exp(l1) + exp( l2) + ..)
其中l是p1等的对数。
问题是,如果只对表达式求值,很可能得到0,然后表达式变得不确定。但是你提到的技巧是为了解围,我们可以求值
l1 + log( 1 + exp(l2-l1) + ...)
这将合理地评估(至少如果l1是l中最大的)
因此,这不是效率的问题,而是绕过双打的有限精度。与什么备选方案相反?它不是,在相反的方向上(在尖锐的回答中没有提到)。与什么备选方案相反?它不是,在相反的方向上(在尖锐的回答中没有提到)。