Очень распространенная проблема в цепочке Маркова Монте-Карло включает вычисление вероятностей, которые являются суммой больших экспоненциальных членов,
е ' ≡ е в 1 + Ē в 2 + . , ,
Такой подход является разумным , если все элементы велики, но не такая хорошая идея , если они не являются. Конечно, меньшие элементы в любом случае не влияют на сумму с плавающей запятой, но я не уверен, как с ними надежно справиться. В коде R мой подход выглядит так:
if ( max(abs(a)) > max(a) )
K <- min(a)
else
K <- max(a)
ans <- log(sum(exp(a-K))) + K
Это кажется достаточно распространенной проблемой, что должно быть стандартное решение, но я не уверен, что это такое. Спасибо за любые предложения.
monte-carlo
floating-point
statistics
cboettig
источник
источник
Ответы:
Существует простое решение только с двумя проходами через данные:
Сначала вычислите
который говорит вам, что, если есть терминов, то Σ я е я ≤ п е К .N
Так как вы, вероятно, не имеете столь же большого, как даже , вам не нужно беспокоиться о переполнении в вычислениях с двойной точностью ,N 1020
Таким образом, вычислите и тогда ваше решение будет .τ еКτ
источник
Чтобы сохранить точность при добавлении двойных чисел, вам необходимо использовать Kahan Summation , это программное обеспечение, эквивалентное наличию регистра переноса.
doubleMax - sumSoFar < valueToAdd
exponent > 709.783
источник
Ваш подход твердый.
источник
Существует пакет R, который обеспечивает быструю и эффективную реализацию "трюка log-sum-exp"
http://www.inside-r.org/packages/cran/matrixStats/docs/logSumExp
Функция logSumExp принимает числовой вектор lX и выводит log (sum (exp (lX))), избегая при этом проблем переполнения и переполнения, используя описанный вами метод.
источник