有效地汇总日志数量

Mik*_*e B 7 c++ algorithm math sum probability

在C++中工作,我想找到一些数量的总和,然后记录总和的日志:

log(a_1 + a_2 + a_3 + ... + a_n)
Run Code Online (Sandbox Code Playgroud)

但是,我自己没有数量,我只有他们的日志值:

l_1 = log(a_1), l_2 = log(a_2), ... , l_n = log(a_n)
Run Code Online (Sandbox Code Playgroud)

有没有有效的方法来获取日志a_i的总和?我想避免

log(s) = log(exp(l_1) + exp(l_2) + ... + exp(l_n))
Run Code Online (Sandbox Code Playgroud)

如果可能的话 - exp会成为瓶颈,因为计算会多次完成.

Yar*_*tov 3

n 有多大?

这个量被称为 log-sum-exp,Lieven Vandenberghe 在他的的第 72 页上谈到了它。他还有一个使用此操作的优化包,从简短的外观来看,似乎他没有做任何特别的事情,只是求幂和加法。当 n 小到足以让向量适合内存时,求幂也许不是一个严重的瓶颈。

此操作经常出现在建模中,并且瓶颈在于术语数量过多。n=2^100 的大小很常见,其中的项是隐式表示的。在这种情况下,有多种技巧可以根据 log-sum-exp 的凸性来近似该数量。最简单的技巧——将 log(s) 近似为 max(l1,l2,....,ln)