接著上篇
隱馬爾可夫的三個問題,上文提了問題1的三種解決辦法,本文接著講問題2
問題2,即在給出一串觀測序列的情況下和已知hmm模型的情況下,找到最可能的隱性狀態序列
問題2的解決:
維特比演算法
維特比演算法是乙個特殊但應用最廣的動態規劃演算法,它是針對最短路徑問題而提出的。凡是使用隱含馬爾可夫模型描述的問題都可以用維特比演算法來解碼,包括今天的數字通訊、語音識別、機器翻譯、拼音轉漢字、分詞等。
下面舉乙個比較簡單的例子做說明:求s到e的最短路徑。如下圖(各點之間距離不相同):
我們知道,要找到s到e之間最短路徑,最容易想到的方法就是窮舉法。也就是把所有可能的路徑都例舉出來。從s走向a層共有4種走法,從a層走向b層又有4種走法,從b層走向c層又有4種走法,然後c層走向e點只有一種選擇。所以最終我們窮舉出了4x4x4=64種可能。
顯然,這種方法必定可行。但在實際的應用當中,對於數量極其龐大的結點數和邊數的圖,其計算複雜度也將會變得非常大,而計算效率也會隨之降低。
因此,這裡選擇使用一種基於動態規劃的方式來尋找最佳路徑。
所謂動態規劃。其核心就是「動態」的概念,把大的問題細分為多個小的問題,基於每一步的結果再去尋找下一步的策略,通過每一步走過之後的區域性最優去尋找全域性最優。這樣解釋比較抽象,下面直接用回剛剛的例子說明。如下圖:
首先,我們假設s到e之間存在一條最短路徑,且這條路徑經過c2點,那麼我們便一定能夠確定從s到c2的64條(4x4x4=64)子路徑當中,該子路徑一定最短。(證明:反證法。如果s到c2之間存在一條更短的子路徑,那麼便可以用它來代替原先的路徑,而原先的路徑顯然就不是最短了,這與原假設自相矛盾)。
同理,我們也可以得出從s到b2點為兩點間最短子路徑的結論。
這時候:既然如此,我們計算從s點出發到點c2的最短路徑,是不是只要考慮從s出發到b層所有節點的最短路徑就可以。因為,從s到e的「全域性最短」路徑必定經過在這些「區域性最短」子路徑。沒錯!這就是上面提及到的通過區域性最優的最優去尋找全域性最優,問題的規模被不斷縮小!
回顧之前的分析:我們計算從s起到c2點的最短路徑時候只需要考慮從s出發到b層所有節點的最短路徑,b層也如是。對b2來說,一共有4條路線可以到達,分別是a1→b2,a2→b2,a3→b2,a4→b2。我們需要做的就是把a2→b2這條最短路線保留,而其他3條刪除掉(因為根據以上的分析,它們不可能構成全程的最短路線)。ok,來到這裡,我們會發現乙個小「漏洞」,這段s→a2→b2→c2→e的路線只是我一廂情願的假設,最短路徑不一定是經過以上這些點。所以,我們要把每層的每個節點都考慮進來。
以下是具體的做法:
step1:從點s出發。對於第一層的3個節點,算出它們的距離d(s,a1),d(s,a2),d(s,a3),d(s,a4),因為只有一步,所以這些距離都是s到它們各自的最短距離。
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次計算!
這就是維特比演算法
隱馬爾科夫 維特比演算法
繼上篇貝葉斯 後,一直想完成隱馬爾科夫這篇,一是一直沒有時間完成python的示例實現 二是想找乙個區別於天氣的隱馬爾科夫例子。區別於貝葉斯,隱馬爾科夫模型是基於時序的概率模型,本文只關注於一階隱馬爾科夫模型,即某一時刻的狀態值只跟上一時刻的狀態值有關。該模型可以用三元組表示 a,b,其中 舉乙個例...
隱馬爾科夫 維特比演算法
繼上篇貝葉斯 後,一直想完成隱馬爾科夫這篇,一是一直沒有時間完成python的示例實現 二是想找乙個區別於天氣的隱馬爾科夫例子。區別於貝葉斯,隱馬爾科夫模型是基於時序的概率模型,本文只關注於一階隱馬爾科夫模型,即某一時刻的狀態值只跟上一時刻的狀態值有關。該模型可以用三元組表示 a,b,其中 舉乙個例...
隱馬爾可夫模型的Viterbi解碼演算法
前面在做自然語言處理時涉及到一些詞性標註的工作,一般會使用隱馬爾科夫模型 hmm 來實現詞性標註,而hmm模型的解碼實現演算法一般就會使用viterbi演算法。hmm模型有多種應用,這裡說的是其中乙個常見應用,即根據觀察序列找到最可能的隱含狀態序列。最樸素的想法就是直接窮舉所有可能的隱含狀態序列,並...