接着上篇html
隱馬爾可夫的三個問題,上文提了問題1的三種解決辦法,本文接着講問題2算法
問題2,即在給出一串觀測序列的狀況下和已知HMM模型的狀況下,找到最可能的隱性狀態序列post
問題2的解決:url
維特比算法spa
維特比算法是一個特殊但應用最廣的動態規劃算法,它是針對最短路徑問題而提出的。凡是使用隱含馬爾可夫模型描述的問題均可以用維特比算法來解碼,包括今天的數字通訊、語音識別、機器翻譯、拼音轉漢字、分詞等。翻譯
下面舉一個比較簡單的例子作說明:求S到E的最短路徑。以下圖(各點之間距離不相同):htm
所以,這裏選擇使用一種基於動態規劃的方式來尋找最佳路徑。
所謂動態規劃。其核心就是「動態」的概念,把大的問題細分爲多個小的問題,基於每一步的結果再去尋找下一步的策略,經過每一步走過以後的局部最優去尋找全局最優。這樣解釋比較抽象,下面直接用回剛剛的例子說明。以下圖:blog
回顧以前的分析:咱們計算從S起到C2點的最短路徑時候只須要考慮從S出發到B層全部節點的最短路徑,B層也如是。對B2來講,一共有4條路線能夠到達,分別是A1→B2,A2→B2,A3→B2,A4→B2。咱們須要作的就是把A2→B2這條最短路線保留,而其餘3條刪除掉(由於根據以上的分析,它們不可能構成全程的最短路線)。OK,來到這裏,咱們會發現一個小「漏洞」,這段S→A2→B2→C2→E的路線只是我一廂情願的假設,最短路徑不必定是通過以上這些點。因此,咱們要把每層的每一個節點都考慮進來。get
如下是具體的作法:
step1:從點S出發。對於第一層的3個節點,算出它們的距離d(S,A1),d(S,A2),d(S,A3),d(S,A4),由於只有一步,因此這些距離都是S到它們各自的最短距離。it
step2:對於B層的全部節點(B1,B2,B3,B4),要計算出S到它們的最短距離。咱們知道,對於特定的節點B2,從S到它的路徑能夠通過A層的任何一個節點(A1,A2,A3,A4)。對應的路徑長就是d(S,B2)=d(S,Ai)+d(Ai,B2)(其中i=1,2,3,4)。因爲A層有4個節點(即i有4個取值),咱們要一一計算,而後找到最小值。這樣,對於B層的每一個節點,都須要進行4次運算,而B層有4個節點,因此共有4X4=16次運算。
step3:這一步是該算法的核心。咱們從step2計算得出的結果只保留4個最短路徑值(每一個節點保留一個)。那麼,若從B層走向C層來講,該步驟的基數已經再也不是4X4,而是變成了4!也就是說,從B層到C層的最短路徑只須要基於B層得出的4個結果來計算。這種方法一直持續到最後一個狀態,每一步計算的複雜度爲相鄰兩層的計算複雜度爲4X4乘積的正比!再通俗點說,鏈接這兩兩相鄰層的計算符合變成了「+」號,取代了原先的「X」號。用這種方法,只需進行4X4X2=32次計算!
這就是維特比算法