2012-11-15 8 views
5

私は、与えられた観測シーケンスを放出する特定のHMMの確率を計算するために、HMMのフォワードアルゴリズムを実装しています。私のアルゴリズムをアンダーフローに強くしたい。フォワードアルゴリズムは、乗算と確率の加算を必要とするため、ログ空間では作業できません。アンダーフローを避ける最良の方法は何ですか?HMMのフォワードアルゴリズムのアンダーフロー

私はこれに関するいくつかの情報源を読んだことがありますが、私が得る最良の提案は各時間ステップで確率をスケーリングすることですSection 6 Here。アルゴリズムの終わりまでに、(観察シーケンスの)あなたが望む正確な確率を残すことはありません。また、私が間違っていない限り、上記の参考文献で提案されているように各時間ステップで確率をスケーリングすると、2つの異なるHMMから得られた観測シーケンスの確率を有意に比較することはできません。 1つはシーケンスを出力する可能性が高い)。助言がありますか?

答えて

8

参考文献の最後の数式32では、すべての確率値alpha_t(i)にC_tを掛けます。最終的には、最終的な確率をすべてのC_tの積で乗算しました。ログ(C_t)の合計を記録することで、このすべてを追跡することができます。最後に、最終的なalpha_t(i)、またはlog(SUM_t alpha_t(i))のログ確率を与えるログ(alpha_t(i)) - SUM_(j < = ) - SUM_(j < = t)log(C_j)これはシーケンス全体のログ確率を与えます。

+0

完璧 - 私は今それを見る。私はそれが動作すると思う、ありがとう! – akobre01

+0

私はここで死者を復活させているかもしれませんが、順誘導ステップは 'i'に依存していますので、ダイナミックプログラミングマトリックスでは' t + i * sequnece'のところにアルファ[i] [t] $ C_t $を計算することが不可能な 'alpha [i + 1] [t]'をまだ持っていないのですか? –

+0

alpha [i] [t](すべてi)と時刻tで計算された他の情報を使って、alpha [i] [t + 1](iのすべての値に対して)を計算します。ここでのalpha [i] [t]の値は、オーバーフローが心配であるときにC_tでスケーリングされます。 alpha [i] [t + 1]を計算した後、これらの値を使ってC_ {t + 1}を計算し、それを使ってalpha [i] [t + 1]のスケーリングされた値を計算することができます。 C_ {t + 1}は計算されたスケーリングされていない値の最後であり、アルファ値のスケーリングに使用されるまでは必要ありません。 (私は内側のループで変化し、外側のループでは変化することを忘れないでください)。 – mcdowella

関連する問題