Bardzo częstym problemem w Markov Chain Monte Carlo jest obliczanie prawdopodobieństw, które są sumą dużych terminów wykładniczych,
gdzie składniki może wahać się od bardzo małych do bardzo dużych. Moje podejście na uwzględnieniu największego wykładniczego terminu , aby:
e ' ≡ e się 1 + wiadomości e się 2 + . . .
Takie podejście jest uzasadnione, jeżeli wszystkie elementy są duże, ale nie taki dobry pomysł, jeśli nie są. Oczywiście, mniejsze elementy i tak nie przyczyniają się do sumy zmiennoprzecinkowej, ale nie jestem pewien, jak sobie z nimi poradzić. W kodzie R moje podejście wygląda następująco:
if ( max(abs(a)) > max(a) )
K <- min(a)
else
K <- max(a)
ans <- log(sum(exp(a-K))) + K
Wydaje się dość powszechnym problemem, że powinno istnieć standardowe rozwiązanie, ale nie jestem pewien, co to jest. Dziękuję za wszelkie sugestie.
źródło
Odpowiedzi:
Istnieje proste rozwiązanie z dwoma przejściami danych:
Najpierw oblicz
co mówi ci, że jeśli nie ma terminów, to Σ i e i ≤ n e K .n
Ponieważ prawdopodobnie nie masz tak blisko jak nawet , nie powinieneś się martwić przepełnieniem obliczeń z podwójną precyzją .10 20 τ : = ∑ i e a i - K ≤ nn 1020
Zatem oblicz / a wtedy twoim rozwiązaniem jest .e K ττ eKτ
źródło
Aby zachować precyzję podczas sumowania podwójnego, musisz użyć Kahan Summation , jest to oprogramowanie równoważne z rejestrem przenoszenia.
Jest to w porządku dla większości wartości, ale jeśli dostajesz przepełnienie, to osiągasz limit podwójnej precyzji IEEE 754, co byłoby około . W tym momencie potrzebujesz nowej reprezentacji. Możesz wykryć przepełnienie w czasie dodawania, a także wykryć duże wykładniki do oceny . W tym momencie możesz zmodyfikować interpretację podwójnego, przesuwając wykładnik i śledząc tę zmianę.e709.783
doubleMax - sumSoFar < valueToAdd
exponent > 709.783
To w przeważającej części jest podobne do twojego podejścia wykładniczego, ale ta wersja jest przechowywana w bazie 2 i nie wymaga wstępnego wyszukiwania w celu znalezienia największego wykładnika. Stąd .value×2shift
źródło
Twoje podejście jest solidne.
Nie musisz dokładnie znać , wystarczy, aby uniknąć przepełnienia. Być może będziesz w stanie oszacować analitycznie przed wykonaniem próbkowania MCMC.KK K
źródło
Istnieje pakiet R, który zapewnia szybką i wydajną implementację „sztuczki log-sum-exp”
http://www.inside-r.org/packages/cran/matrixStats/docs/logSumExp
Funkcja logSumExp akceptuje wektor numeryczny lX i log danych wyjściowych (suma (exp (lX))), unikając problemów z przepełnieniem i przepełnieniem przy użyciu opisanej metody.
źródło