2012-11-15 13 views
5

Sto implementando l'algoritmo di inoltro per HMM per calcolare la probabilità di un dato HMM che emette una data sequenza di osservazione. Mi piacerebbe che il mio algoritmo fosse robusto da underflow. Non posso lavorare nel log-space perché l'algoritmo forward richiede la moltiplicazione e l'aggiunta di probabilità. Qual è il modo migliore per evitare l'underflow?Underflow in Algoritmo di inoltro per HMM

Ho letto alcune fonti su questo, ma il miglior suggerimento che ottengo è ridimensionamento delle probabilità in ogni momento passo Section 6 Here. Alla fine dell'algoritmo non rimarrai con la probabilità esatta che desideri (della sequenza di osservazione). Inoltre, a meno che non mi sbagli, se scala le probabilità ad ogni passo temporale come proposto nel riferimento precedente, non puoi fare un confronto significativo della probabilità che una data sequenza di osservazione provenga da due HMM differenti (per capire quale uno è più probabile che abbia emesso la sequenza). Eventuali suggerimenti?

risposta

8

Nell'equazione 32 alla fine del riferimento si moltiplica ogni valore di probabilità alpha_t (i) di C_t. Quindi alla fine hai moltiplicato le tue probabilità finali per il prodotto di tutti i C_t. Puoi tenere traccia di tutto ciò tenendo traccia della somma del log (C_t). Quindi alla fine puoi elaborare il log (alpha_t (i)) - SUM_ (j < = t) log (C_j) che ti darà la probabilità di log dell'alfa_t finale (i), o log (SUM_t alpha_t (i)) - SUM_ (j < = t) log (C_j) che fornirà la probabilità di log dell'intera sequenza.

+0

Perfetto - lo vedo ora. Penso che funzioni, grazie! – akobre01

+0

Potrei resuscitare qui il morto, ma il passaggio di induzione in avanti dipende da 'i', quindi nella matrice di programmazione dinamica, si ha 'alpha [i] [t]' alla lunghezza 't + i * di sequnece' Questo passo, ma non ho ancora il 'alpha [i + 1] [t]', il che rende impossibile calcolare $ C_t $, o usi semplicemente l'algoritmo forward e alla fine lo scala? –

+0

I calcoli risolvono alpha [i] [t + 1] (per tutti i valori di i) usando alpha [i] [t] (per tutti i) e altre informazioni calcolate per il tempo t. I valori alpha [i] [t] qui verranno ridimensionati da C_t quando l'overflow è una preoccupazione. Dopo aver calcolato alpha [i] [t + 1] possiamo usare questi valori per calcolare C_ {t + 1} e quindi usarlo per calcolare i valori in scala di alfa [i] [t + 1]. C_ {t + 1} è l'ultimo dei valori non graduati calcolato e non è necessario fino a quando non viene utilizzato per ridimensionare i valori alfa. (Ricorda che io varia in un anello interno e t in un anello esterno). – mcdowella