隱馬爾科夫模型HMM(四)維特比算法解碼隱藏狀態序列 隱馬爾科夫模型HMM(二)前向後向算法評估觀察序列機率 隱馬爾科夫模型HMM(二)前向後向算法評估觀察序列機率

    隱馬爾科夫模型HMM(一)HMM模型html

    隱馬爾科夫模型HMM(二)前向後向算法評估觀察序列機率算法

    隱馬爾科夫模型HMM(三)鮑姆-韋爾奇算法求解HMM參數post

    隱馬爾科夫模型HMM(四)維特比算法解碼隱藏狀態序列url

    在本篇咱們會討論HMM模型最後一個問題的求解,即即給定模型和觀測序列,求給定觀測序列條件下,最可能出現的對應的隱藏狀態序列。在閱讀本篇前,建議先閱讀這個系列的第一篇以熟悉HMM模型。htm

    HMM模型的解碼問題最經常使用的算法是維特比算法,固然也有其餘的算法能夠求解這個問題。同時維特比算法是一個通用的求序列最短路徑的動態規劃算法,也能夠用於不少其餘問題,好比以前講到的文本挖掘的分詞原理中咱們講到了單獨用維特比算法來作分詞。blog

    本文關注於用維特比算法來解碼HMM的的最可能隱藏狀態序列。get

1. HMM最可能隱藏狀態序列求解概述

    在HMM模型的解碼問題中,給定模型$\lambda = (A, B, \Pi)$和觀測序列$O =\{o_1,o_2,...o_T\}$,求給定觀測序列O條件下,最可能出現的對應的狀態序列$I^*= \{i_1^*,i_2^*,...i_T^*\}$,即$P(I^*|O)$要最大化。it

    一個可能的近似解法是求出觀測序列$O$在每一個時刻$t$最可能的隱藏狀態$i_t^*$而後獲得一個近似的隱藏狀態序列$I^*= \{i_1^*,i_2^*,...i_T^*\}$。要這樣近似求解不難,利用隱馬爾科夫模型HMM(二)前向後向算法評估觀察序列機率中第五節的定義:在給定模型$\lambda$和觀測序列$O$時,在時刻$t$處於狀態$q_i$的機率是$\gamma_t(i)$,這個機率能夠經過HMM的前向算法與後向算法計算。這樣咱們有:$$i_t^* = arg \max_{1 \leq i \leq N}[\gamma_t(i)], \; t =1,2,...T$$class

    近似算法很簡單,可是卻不能保證預測的狀態序列是總體是最可能的狀態序列,由於預測的狀態序列中某些相鄰的隱藏狀態可能存在轉移機率爲0的狀況。原理

    而維特比算法能夠將HMM的狀態序列做爲一個總體來考慮,避免近似算法的問題,下面咱們來看看維特比算法進行HMM解碼的方法。

2. 維特比算法概述

    維特比算法是一個通用的解碼算法,是基於動態規劃的求序列最短路徑的方法。在文本挖掘的分詞原理中咱們已經講到了維特比算法的一些細節。

    既然是動態規劃算法,那麼就須要找到合適的局部狀態,以及局部狀態的遞推公式。在HMM中,維特比算法定義了兩個局部狀態用於遞推。

    第一個局部狀態是在時刻$t$隱藏狀態爲$i$全部可能的狀態轉移路徑$i_1,i_2,...i_t$中的機率最大值。記爲$\delta_t(i)$:$$\delta_t(i) = \max_{i_1,i_2,...i_{t-1}}\;P(i_t=i, i_1,i_2,...i_{t-1},o_t,o_{t-1},...o_1|\lambda),\; i =1,2,...N$$

    由$\delta_t(i)$的定義能夠獲得$\delta$的遞推表達式:$$\begin{align} \delta_{t+1}(i) & =  \max_{i_1,i_2,...i_{t}}\;P(i_{t+1}=i, i_1,i_2,...i_{t},o_{t+1},o_{t},...o_1|\lambda) \\ & = \max_{1 \leq j \leq N}\;[\delta_t(j)a_{ji}]b_i(o_{t+1})\end{align}$$

    第二個局部狀態由第一個局部狀態遞推獲得。咱們定義在時刻$t$隱藏狀態爲$i$的全部單個狀態轉移路徑$(i_1,i_2,...,i_{t-1},i)$中機率最大的轉移路徑中第$t-1$個節點的隱藏狀態爲$\Psi_t(i)$,其遞推表達式能夠表示爲:$$\Psi_t(i) = arg \; \max_{1 \leq j \leq N}\;[\delta_{t-1}(j)a_{ji}]$$

    有了這兩個局部狀態,咱們就能夠從時刻0一直遞推到時刻$T$,而後利用$\Psi_t(i)$記錄的前一個最可能的狀態節點回溯,直到找到最優的隱藏狀態序列。

3. 維特比算法流程總結

    如今咱們來總結下維特比算法的流程:

    輸入:HMM模型$\lambda = (A, B, \Pi)$,觀測序列$O=(o_1,o_2,...o_T)$

    輸出:最有可能的隱藏狀態序列$I^*= \{i_1^*,i_2^*,...i_T^*\}$

    1)初始化局部狀態:$$\delta_1(i) = \pi_ib_i(o_1),\;i=1,2...N$$$$\Psi_1(i)=0,\;i=1,2...N$$

    2) 進行動態規劃遞推時刻$t=2,3,...T$時刻的局部狀態:$$\delta_{t}(i) = \max_{1 \leq j \leq N}\;[\delta_{t-1}(j)a_{ji}]b_i(0_{t}),\;i=1,2...N$$$$\Psi_t(i) = arg \; \max_{1 \leq j \leq N}\;[\delta_{t-1}(j)a_{ji}],\;i=1,2...N$$

    3) 計算時刻$T$最大的$\delta_{T}(i)$,即爲最可能隱藏狀態序列出現的機率。計算時刻$T$最大的$\Psi_t(i)$,即爲時刻$T$最可能的隱藏狀態。$$P* = \max_{1 \leq j \leq N}\delta_{T}(i)$$$$i_T^* = arg \; \max_{1 \leq j \leq N}\;[\delta_{T}(i)]$$

    4) 利用局部狀態$\Psi(i)$開始回溯。對於$t=T-1,T-2,...,1$:$$i_t^* = \Psi_{t+1}(i_{t+1}^*)$$

    最終獲得最有可能的隱藏狀態序列$I^*= \{i_1^*,i_2^*,...i_T^*\}$

4. HMM維特比算法求解實例

    下面咱們仍然用隱馬爾科夫模型HMM(一)HMM模型中盒子與球的例子來看看HMM維特比算法求解。

    咱們的觀察集合是:$$V=\{紅,白\},M=2$$

    咱們的狀態集合是:$$Q =\{盒子1,盒子2,盒子3\}, N=3 $$

    而觀察序列和狀態序列的長度爲3.

    初始狀態分佈爲:$$\Pi = (0.2,0.4,0.4)^T$$

    狀態轉移機率分佈矩陣爲:

$$A = \left( \begin{array} {ccc} 0.5 & 0.2 & 0.3 \\ 0.3 & 0.5 & 0.2 \\ 0.2 & 0.3 &0.5 \end{array} \right) $$

     觀測狀態機率矩陣爲:

$$B = \left( \begin{array} {ccc} 0.5 & 0.5 \\ 0.4 & 0.6 \\ 0.7 & 0.3 \end{array} \right) $$

    球的顏色的觀測序列:$$O=\{紅,白,紅\}$$

    按照咱們上一節的維特比算法,首先須要獲得三個隱藏狀態在時刻1時對應的各自兩個局部狀態,此時觀測狀態爲1:

$$\delta_1(1) = \pi_1b_1(o_1) = 0.2 \times 0.5 = 0.1$$

$$\delta_1(2) = \pi_2b_2(o_1) = 0.4 \times 0.4 = 0.16$$

$$\delta_1(3) = \pi_3b_3(o_1) = 0.4 \times 0.7 = 0.28$$

$$\Psi_1(1)=\Psi_1(2) =\Psi_1(3) =0$$

    如今開始遞推三個隱藏狀態在時刻2時對應的各自兩個局部狀態,此時觀測狀態爲2:

$$\delta_2(1) = \max_{1\leq j \leq 3}[\delta_1(j)a_{j1}]b_1(o_2) = \max_{1\leq j \leq 3}[0.1 \times 0.5, 0.16 \times 0.3, 0.28\times 0.2] \times 0.5 = 0.028$$

$$\Psi_2(1)=3$$

$$\delta_2(2) = \max_{1\leq j \leq 3}[\delta_1(j)a_{j2}]b_2(o_2) = \max_{1\leq j \leq 3}[0.1 \times 0.2, 0.16 \times 0.5, 0.28\times 0.3] \times 0.6 = 0.0504$$

$$\Psi_2(2)=3$$

$$\delta_2(3) = \max_{1\leq j \leq 3}[\delta_1(j)a_{j3}]b_3(o_2) = \max_{1\leq j \leq 3}[0.1 \times 0.3, 0.16 \times 0.2, 0.28\times 0.5] \times 0.3 = 0.042$$

$$\Psi_2(3)=3$$

    繼續遞推三個隱藏狀態在時刻3時對應的各自兩個局部狀態,此時觀測狀態爲1:

$$\delta_3(1) = \max_{1\leq j \leq 3}[\delta_2(j)a_{j1}]b_1(o_3) = \max_{1\leq j \leq 3}[0.028 \times 0.5, 0.0504 \times 0.3, 0.042\times 0.2] \times 0.5 = 0.00756$$

$$\Psi_3(1)=2$$

$$\delta_3(2) = \max_{1\leq j \leq 3}[\delta_2(j)a_{j2}]b_2(o_3) = \max_{1\leq j \leq 3}[0.028  \times 0.2, 0.0504\times 0.5, 0.042\times 0.3] \times 0.4 = 0.01008$$

$$\Psi_3(2)=2$$

$$\delta_3(3) = \max_{1\leq j \leq 3}[\delta_2(j)a_{j3}]b_3(o_3) = \max_{1\leq j \leq 3}[0.028  \times 0.3, 0.0504 \times 0.2, 0.042\times 0.5] \times 0.7 = 0.0147$$

$$\Psi_3(3)=3$$

    此時已經到最後的時刻,咱們開始準備回溯。此時最大機率爲$\delta_3(3)$,從而獲得$i_3^* =3$

    因爲$\Psi_3(3)=3$,因此$i_2^* =3$, 而又因爲$\Psi_2(3)=3$,因此$i_1^* =3$。從而獲得最終的最可能的隱藏狀態序列爲:$(3,3,3)$

5. HMM模型維特比算法總結

    若是你們看過以前寫的文本挖掘的分詞原理中的維特比算法,就會發現這兩篇之中的維特比算法稍有不一樣。主要緣由是在中文分詞時,咱們沒有觀察狀態和隱藏狀態的區別,只有一種狀態。可是維特比算法的核心是定義動態規劃的局部狀態與局部遞推公式,這一點在中文分詞維特比算法和HMM的維特比算法是相同的,也是維特比算法的精華所在。

    維特比算法也是尋找序列最短路徑的一個通用方法,和dijkstra算法有些相似,可是dijkstra算法並無使用動態規劃,而是貪心算法。同時維特比算法僅僅侷限於求序列最短路徑,而dijkstra算法是通用的求最短路徑的方法。

 (歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

相關文章
相關標籤/搜索