Ein sehr verbreitetes Problem in der Markov-Kette von Monte Carlo ist die Berechnung von Wahrscheinlichkeiten, die sich aus großen Exponentialausdrücken zusammensetzen.
wobei die Komponenten Dose von sehr klein bis sehr groß reichen. Mein Ansatz war es, den größten exponentiellen Term so dass:
Dieser Ansatz ist sinnvoll, wenn alle Elemente von groß sind, aber keine so gute Idee, wenn sie nicht groß sind. Natürlich tragen die kleineren Elemente sowieso nicht zur Gleitkommasumme bei, aber ich bin mir nicht sicher, wie ich mit ihnen zuverlässig umgehen soll. In R-Code sieht mein Ansatz folgendermaßen aus:
if ( max(abs(a)) > max(a) )
K <- min(a)
else
K <- max(a)
ans <- log(sum(exp(a-K))) + K
Es scheint ein weit verbreitetes Problem zu sein, dass es eine Standardlösung geben sollte, aber ich bin mir nicht sicher, was es ist. Vielen Dank für alle Vorschläge.
quelle
Antworten:
Es gibt eine einfache Lösung mit nur zwei Durchgängen durch die Daten:
Berechne zuerst
die besagt, dass, wenn es Begriffe, dann Σ i e a i ≤ n e K .n
Da Sie vermutlich annähernd so groß wie 10 20 haben , sollten Sie sich keine Gedanken über ein Überlaufen bei der Berechnung von τ : = ∑ i e a i - K ≤ n mit doppelter Genauigkeit machen.n 1020
Berechne also und dann ist e K τ deine Lösung .τ eKτ
quelle
Um die Genauigkeit beim Addieren von Doppelwerten zu erhalten, müssen Sie Kahan Summation verwenden . Dies ist die Software, die einem Carry-Register entspricht.
doubleMax - sumSoFar < valueToAdd
exponent > 709.783
quelle
Ihr Ansatz ist solide.
quelle
Es gibt ein R-Paket, das eine schnelle und effiziente Implementierung des "Log-Sum-Exp-Tricks" liefert.
http://www.inside-r.org/packages/cran/matrixStats/docs/logSumExp
Die logSumExp-Funktion akzeptiert einen numerischen Vektor lX und gibt log (sum (exp (lX))) aus, wobei Unterlauf- und Überlaufprobleme mit der von Ihnen beschriebenen Methode vermieden werden.
quelle