2012-11-15 11 views
5

Ich implementiere den Vorwärtsalgorithmus für HMMs, um die Wahrscheinlichkeit zu berechnen, mit der ein bestimmtes HMM eine bestimmte Beobachtungssequenz aussendet. Ich möchte, dass mein Algorithmus robust gegenüber Unterläufen ist. Ich kann nicht im Log-Space arbeiten, da der Forward-Algorithmus die Multiplikation UND Addition von Wahrscheinlichkeiten erfordert. Was ist der beste Weg, um Unterlauf zu vermeiden?Unterlauf im Vorwärtsalgorithmus für HMMs

Ich habe einige Quellen darüber gelesen, aber der beste Vorschlag, den ich bekomme, ist die Skalierung der Wahrscheinlichkeiten bei jedem Zeitschritt Section 6 Here. Am Ende des Algorithmus werden Sie nicht mit der genauen Wahrscheinlichkeit (der Beobachtungssequenz) belassen. Wenn Sie sich nicht irren, wenn Sie die Wahrscheinlichkeiten bei jedem Zeitschritt skalieren, wie in der obigen Referenz vorgeschlagen, können Sie auch keinen aussagekräftigen Vergleich der Wahrscheinlichkeit einer gegebenen Beobachtungssequenz von zwei verschiedenen HMMs durchführen (um herauszufinden, welche es ist wahrscheinlicher, dass die Sequenz ausgegeben wurde). Irgendwelche Vorschläge?

Antwort

8

In Gleichung 32 am Ende Ihrer Referenz multiplizieren Sie jeden Wahrscheinlichkeitswert alpha_t (i) mit C_t. Am Ende hast du deine letzten Wahrscheinlichkeiten mit dem Produkt aller C_t multipliziert. Sie können dies verfolgen, indem Sie die Summe des Protokolls (C_t) verfolgen. Dann können Sie am Ende Protokoll (alpha_t (i)) - SUM_ (j < = t) Protokoll (C_j) erarbeiten, die Ihnen die log Wahrscheinlichkeit des abschließenden alpha_t (i) geben wird, oder log (SUM_t alpha_t (i)) - SUM_ (j < = t) log (C_j), was Ihnen die Log-Wahrscheinlichkeit der gesamten Sequenz gibt.

+0

Perfekt - Ich sehe es jetzt. Ich denke, das funktioniert, danke! – akobre01

+0

Ich kann die Toten hier wieder auferstehen lassen, aber der Vorwärtsinduktionsschritt hängt von 'i' ab, also hast du in deiner dynamischen Programmiermatrix' alpha [i] [t] 'auf der' t + i * Länge von sequence' Schritt, aber haben Sie noch nicht das 'alpha [i + 1] [t]', was es unmöglich macht, das $ C_t $ zu berechnen, oder verwenden Sie einfach den Forward-Algorithmus und skalieren ihn am Ende? –

+0

Die Berechnungen berechnen Alpha [i] [t + 1] (für alle Werte von i) mit Alpha [i] [t] (für alle i) und andere für die Zeit t berechnete Informationen. Die Alpha [i] [t] -Werte werden hier um C_t skaliert, wenn der Überlauf ein Problem ist. Nach der Berechnung von Alpha [i] [t + 1] können wir diese Werte verwenden, um C_ {t + 1} zu berechnen und daraus die skalierten Werte von Alpha [i] [t + 1] zu berechnen. C_ {t + 1} ist der letzte der unskalierten Werte, die berechnet werden und wird nicht benötigt, bis er zur Skalierung der Alpha-Werte verwendet wird. (Denken Sie daran, dass ich in einer inneren Schleife und t in einer äußeren Schleife variiert). – mcdowella