在上一篇博客http://www.cnblogs.com/tornadomeet/archive/2012/03/24/2415583.html中,我們已經從一個例子中學會了HMM的前向算法,解決了HMM算法的第一個問題,即模型評估問題。這一講中我們來解決第二個問題:HMM的解碼問題,即即給定觀測序列 O=O1O2O3…Ot和模型參數λ=(A,B,π),怎樣尋找滿足這種觀察序列意義上最優的隱含狀態序列S,這一步中最常用的算法就是Viterbi算法了。
同樣的,我們先引入3個符合:
:表示在觀察時刻t正處在狀態j,且沿一條路徑q1q2q3..qt,產生出的o1o2o3…ot最大概率。
:表示的是一個狀態值,該狀態值產生了上面的 ,也就是說計算時是由上一次那個狀態產生的。
:表示在觀察時刻t中所有的內最大的那個狀態,所以它也是一個狀態值。
由上面的解釋可以得出這3個符合的數學表達式如下:
所有說當已知觀察序列,要用viterbi算法求解最優狀態序列時與前面一講中的求最大觀察值概率的算法非常相似。只是在求 時不再是將其來源相加,而是取其中最大的那個。
廢話少說,還是看剛開始的那個題目:
HMM模型如下,試通過前向算法計算產生觀察符號序列O={ABAB}時用Viterbi算法求出最大可能的狀態序列。
當然初始概率矩陣π=(1,0,0),即開始處於狀態1。按照上面的公式理論,我們的遞推依次解出,
以及
。解法如下:
第一次觀察時:
第二次觀察時:
第三次觀察時:
第四次觀察時:
其遞推結果為:
所以最后的結果狀態序列為s1、s2、s2、s2.
其計算結果示意圖如下所示:
淺綠色的箭頭表示最有可能的狀態序列。寫得比較亂,大家隨便湊合着看。