Почему более эффективно реализовать log_sum, как это?

Согласно этой теме: Вычислить журнал (a+b)

Иногда log_sum реализован так:

log(a + b) = log(a * (1 + b/a)) = log a + log(1 + b/a)

Я не понимаю, почему этот подход более эффективен. У кого-нибудь есть идеи по этому поводу?

2 ответа

Решение

Этот подход может быть полезен, когда a является постоянным (по крайней мере, для некоторых b ценности) и b<<a (значительно меньше). В этом случае log(1 + b/a) можно быстро и с хорошей точностью вычислить с помощью расширения ряда Тейлора (log1p функция в некоторых математических библиотеках, другой метод)

Одно из мест, где я видел подобные вещи, - это когда мы имеем дело с вероятностями или вероятностями в пространствах больших измерений. Иногда хочется вычислить такие суммы, как

p1 + p2 + ..

Однако такие вероятности часто могут быть слишком малы, чтобы быть представленными в двойных числах, поэтому вместо этого часто используют журнал вероятностей. Тогда мы хотим вычислить

log( exp(l1) + exp( l2) + ..)

где l - логарифм p1 и т. д. Проблема в том, что, если просто оценить exps, можно получить 0, а затем выражение станет неопределенным. Но уловка, которую вы намекаете, приходит на помощь, мы можем оценить

l1 + log( 1 + exp(l2-l1) + ...)

и это будет оценивать (по крайней мере, если l1 является наибольшим из l) разумно.

Так что дело не в эффективности, а в том, чтобы обойти ограниченную точность удвоений.

Другие вопросы по тегам