Почему более эффективно реализовать 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) разумно.
Так что дело не в эффективности, а в том, чтобы обойти ограниченную точность удвоений.