隱馬爾科夫模型HMM(二)前向後向算法評估觀察序列機率算法
隱馬爾科夫模型HMM(三)鮑姆-韋爾奇算法求解HMM參數post
在隱馬爾科夫模型HMM(一)HMM模型中,咱們講到了HMM模型的基礎知識和HMM的三個基本問題,本篇咱們就關注於HMM第一個基本問題的解決方法,即已知模型和觀測序列,求觀測序列出現的機率。htm
首先咱們回顧下HMM模型的問題一。這個問題是這樣的。咱們已知HMM模型的參數$\lambda = (A, B, \Pi)$。其中$A$是隱藏狀態轉移機率的矩陣,$B$是觀測狀態生成機率的矩陣, $\Pi$是隱藏狀態的初始機率分佈。同時咱們也已經獲得了觀測序列$O =\{o_1,o_2,...o_T\}$,如今咱們要求觀測序列$O$在模型$\lambda$下出現的條件機率$P(O|\lambda)$。blog
乍一看,這個問題很簡單。由於咱們知道全部的隱藏狀態之間的轉移機率和全部從隱藏狀態到觀測狀態生成機率,那麼咱們是能夠暴力求解的。get
咱們能夠列舉出全部可能出現的長度爲$T$的隱藏序列$I = \{i_1,i_2,...,i_T\}$,分佈求出這些隱藏序列與觀測序列$O =\{o_1,o_2,...o_T\}$的聯合機率分佈$P(O,I|\lambda)$,這樣咱們就能夠很容易的求出邊緣分佈$P(O|\lambda)$了。it
具體暴力求解的方法是這樣的:首先,任意一個隱藏序列$I = \{i_1,i_2,...,i_T\}$出現的機率是:$$P(I|\lambda) = \pi_{i_1} a_{i_1i_2} a_{i_2i_3}... a_{i_{T-1}\;\;i_T}$$class
對於固定的狀態序列$I = \{i_1,i_2,...,i_T\}$,咱們要求的觀察序列$O =\{o_1,o_2,...o_T\}$出現的機率是:$$P(O|I, \lambda) = b_{i_1}(o_1)b_{i_2}(o_2)...b_{i_T}(o_T)$$基礎
則$O$和$I$聯合出現的機率是:$$P(O,I|\lambda) = P(I|\lambda)P(O|I, \lambda) = \pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2)...a_{i_{T-1}\;\;i_T}b_{i_T}(o_T)$$
而後求邊緣機率分佈,便可獲得觀測序列$O$在模型$\lambda$下出現的條件機率$P(O|\lambda)$:$$P(O|\lambda) = \sum\limits_{I}P(O,I|\lambda) = \sum\limits_{i_1,i_2,...i_T}\pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2)...a_{i_{T-1}\;\;i_T}b_{i_T}(o_T)$$
雖然上述方法有效,可是若是咱們的隱藏狀態數$N$很是多的那就麻煩了,此時咱們預測狀態有$N^T$種組合,算法的時間複雜度是$O(TN^T)$階的。所以對於一些隱藏狀態數極少的模型,咱們能夠用暴力求解法來獲得觀測序列出現的機率,可是若是隱藏狀態多,則上述算法太耗時,咱們須要尋找其餘簡潔的算法。
前向後向算法就是來幫助咱們在較低的時間複雜度狀況下求解這個問題的。
前向後向算法是前向算法和後向算法的統稱,這兩個算法均可以用來求HMM觀測序列的機率。咱們先來看看前向算法是如何求解這個問題的。
前向算法本質上屬於動態規劃的算法,也就是咱們要經過找到局部狀態遞推的公式,這樣一步步的從子問題的最優解拓展到整個問題的最優解。
在前向算法中,經過定義「前向機率」來定義動態規劃的這個局部狀態。什麼是前向機率呢, 其實定義很簡單:定義時刻$t$時隱藏狀態爲$q_i$, 觀測狀態的序列爲$o_1,o_2,...o_t$的機率爲前向機率。記爲:$$\alpha_t(i) = P(o_1,o_2,...o_t, i_t =q_i | \lambda)$$
既然是動態規劃,咱們就要遞推了,如今咱們假設咱們已經找到了在時刻$t$時各個隱藏狀態的前向機率,如今咱們須要遞推出時刻$t+1$時各個隱藏狀態的前向機率。
從下圖能夠看出,咱們能夠基於時刻$t$時各個隱藏狀態的前向機率,再乘以對應的狀態轉移機率,即$\alpha_t(j)a_{ji}$就是在時刻$t$觀測到$o_1,o_2,...o_t$,而且時刻$t$隱藏狀態$q_j$, 時刻$t+1$隱藏狀態$q_i$的機率。若是將想下面全部的線對應的機率求和,即$\sum\limits_{j=1}^N\alpha_t(j)a_{ji}$就是在時刻$t$觀測到$o_1,o_2,...o_t$,而且時刻$t+1$隱藏狀態$q_i$的機率。繼續一步,因爲觀測狀態$o_{t+1}$只依賴於$t+1$時刻隱藏狀態$q_i$, 這樣$[\sum\limits_{j=1}^N\alpha_t(j)a_{ji}]b_i(o_{t+1})$就是在在時刻$t+1$觀測到$o_1,o_2,...o_t,o_{t+1}$,而且時刻$t+1$隱藏狀態$q_i$的機率。而這個機率,偏偏就是時刻$t+1$對應的隱藏狀態$i$的前向機率,這樣咱們獲得了前向機率的遞推關係式以下:$$\alpha_{t+1}(i) = \Big[\sum\limits_{j=1}^N\alpha_t(j)a_{ji}\Big]b_i(o_{t+1})$$
咱們的動態規劃從時刻1開始,到時刻$T$結束,因爲$\alpha_T(i)$表示在時刻$T$觀測序列爲$o_1,o_2,...o_T$,而且時刻$T$隱藏狀態$q_i$的機率,咱們只要將全部隱藏狀態對應的機率相加,即$\sum\limits_{i=1}^N\alpha_T(i)$就獲得了在時刻$T$觀測序列爲$o_1,o_2,...o_T$的機率。
下面總結下前向算法。
輸入:HMM模型$\lambda = (A, B, \Pi)$,觀測序列$O=(o_1,o_2,...o_T)$
輸出:觀測序列機率$P(O|\lambda)$
1) 計算時刻1的各個隱藏狀態前向機率:$$\alpha_1(i) = \pi_ib_i(o_1),\; i=1,2,...N$$
2) 遞推時刻$2,3,...T$時刻的前向機率:$$\alpha_{t+1}(i) = \Big[\sum\limits_{j=1}^N\alpha_t(j)a_{ji}\Big]b_i(o_{t+1}),\; i=1,2,...N$$
3) 計算最終結果:$$P(O|\lambda) = \sum\limits_{i=1}^N\alpha_T(i)$$
從遞推公式能夠看出,咱們的算法時間複雜度是$O(TN^2)$,比暴力解法的時間複雜度$O(TN^T)$少了幾個數量級。
這裏咱們用隱馬爾科夫模型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是紅色球,隱藏狀態是盒子1的機率爲:$$\alpha_1(1) = \pi_1b_1(o_1) = 0.2 \times 0.5 = 0.1$$
隱藏狀態是盒子2的機率爲:$$\alpha_1(2) = \pi_2b_2(o_1) = 0.4 \times 0.4 = 0.16$$
隱藏狀態是盒子3的機率爲:$$\alpha_1(3) = \pi_3b_3(o_1) = 0.4 \times 0.7 = 0.28$$
如今咱們能夠開始遞推了,首先遞推時刻2三個狀態的前向機率:
時刻2是白色球,隱藏狀態是盒子1的機率爲:$$\alpha_2(1) = \Big[\sum\limits_{i=1}^3\alpha_1(i)a_{i1}\Big]b_1(o_2) = [0.1*0.5+0.16*0.3+0.28*0.2 ] \times 0.5 = 0.077$$
隱藏狀態是盒子2的機率爲:$$\alpha_2(2) = \Big[\sum\limits_{i=1}^3\alpha_1(i)a_{i2}\Big]b_2(o_2) = [0.1*0.2+0.16*0.5+0.28*0.3 ] \times 0.6 = 0.1104$$
隱藏狀態是盒子3的機率爲:$$\alpha_2(3) = \Big[\sum\limits_{i=1}^3\alpha_1(i)a_{i3}\Big]b_3(o_2) = [0.1*0.3+0.16*0.2+0.28*0.5 ] \times 0.3 = 0.0606$$
繼續遞推,如今咱們遞推時刻3三個狀態的前向機率:
時刻3是紅色球,隱藏狀態是盒子1的機率爲:$$\alpha_3(1) = \Big[\sum\limits_{i=1}^3\alpha_2(i)a_{i1}\Big]b_1(o_3) = [0.077*0.5+0.1104*0.3+0.0606*0.2 ] \times 0.5 = 0.04187$$
隱藏狀態是盒子2的機率爲:$$\alpha_3(2) = \Big[\sum\limits_{i=1}^3\alpha_2(i)a_{i2}\Big]b_2(o_3) = [0.077*0.2+0.1104*0.5+0.0606*0.3 ] \times 0.4 = 0.03551$$
隱藏狀態是盒子3的機率爲:$$\alpha_3(3) = \Big[\sum\limits_{i=1}^3\alpha_3(i)a_{i3}\Big]b_3(o_3) = [0.077*0.3+0.1104*0.2+0.0606*0.5 ] \times 0.7 = 0.05284$$
最終咱們求出觀測序列:$O=\{紅,白,紅\}$的機率爲:$$P(O|\lambda) = \sum\limits_{i=1}^3\alpha_3(i) = 0.13022 $$
熟悉了用前向算法求HMM觀測序列的機率,如今咱們再來看看怎麼用後向算法求HMM觀測序列的機率。
後向算法和前向算法很是相似,都是用的動態規劃,惟一的區別是選擇的局部狀態不一樣,後向算法用的是「後向機率」,那麼後向機率是如何定義的呢?
定義時刻$t$時隱藏狀態爲$q_i$, 從時刻$t+1$到最後時刻$T$的觀測狀態的序列爲$o_{t+1},o_{t+2},...o_T$的機率爲後向機率。記爲:$$\beta_t(i) = P(o_{t+1},o_{t+2},...o_T| i_t =q_i , \lambda)$$
後向機率的動態規劃遞推公式和前向機率是相反的。如今咱們假設咱們已經找到了在時刻$t+1$時各個隱藏狀態的後向機率$\beta_{t+1}(j)$,如今咱們須要遞推出時刻$t$時各個隱藏狀態的後向機率。以下圖,咱們能夠計算出觀測狀態的序列爲$o_{t+2},o_{t+3},...o_T$, $t$時隱藏狀態爲$q_i$, 時刻$t+1$隱藏狀態爲$q_j$的機率爲$a_{ij}\beta_{t+1}(j)$, 接着能夠獲得觀測狀態的序列爲$o_{t+1},o_{t+2},...o_T$, $t$時隱藏狀態爲$q_i$, 時刻$t+1$隱藏狀態爲$q_j$的機率爲$a_{ij}b_j(o_{t+1})\beta_{t+1}(j)$, 則把下面全部線對應的機率加起來,咱們能夠獲得觀測狀態的序列爲$o_{t+1},o_{t+2},...o_T$, $t$時隱藏狀態爲$q_i$的機率爲$\sum\limits_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j)$,這個機率即爲時刻$t$的後向機率。
這樣咱們獲得了後向機率的遞推關係式以下:$$\beta_{t}(i) = \sum\limits_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j)$$
如今咱們總結下後向算法的流程,注意下和前向算法的相同點和不一樣點:
輸入:HMM模型$\lambda = (A, B, \Pi)$,觀測序列$O=(o_1,o_2,...o_T)$
輸出:觀測序列機率$P(O|\lambda)$
1) 初始化時刻$T$的各個隱藏狀態後向機率:$$\beta_T(i) = 1,\; i=1,2,...N$$
2) 遞推時刻$T-1,T-2,...1$時刻的後向機率:$$\beta_{t}(i) = \sum\limits_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j),\; i=1,2,...N$$
3) 計算最終結果:$$P(O|\lambda) = \sum\limits_{i=1}^N\pi_ib_i(o_1)\beta_1(i)$$
此時咱們的算法時間複雜度仍然是$O(TN^2)$。
利用前向機率和後向機率,咱們能夠計算出HMM中單個狀態和兩個狀態的機率公式。
1)給定模型$\lambda$和觀測序列$O$,在時刻$t$處於狀態$q_i$的機率記爲:$$\gamma_t(i) = P(i_t = q_i | O,\lambda) = \frac{P(i_t = q_i ,O|\lambda)}{P(O|\lambda)} $$
利用前向機率和後向機率的定義可知:$$P(i_t = q_i ,O|\lambda) = \alpha_t(i)\beta_t(i)$$
因而咱們獲得:$$\gamma_t(i) = \frac{ \alpha_t(i)\beta_t(i)}{\sum\limits_{j=1}^N \alpha_t(j)\beta_t(j)}$$
2)給定模型$\lambda$和觀測序列$O$,在時刻$t$處於狀態$q_i$,且時刻$t+1$處於狀態$q_j$的機率記爲:$$\xi_t(i,j) = P(i_t = q_i, i_{t+1}=q_j | O,\lambda) = \frac{ P(i_t = q_i, i_{t+1}=q_j , O|\lambda)}{P(O|\lambda)} $$
而$P(i_t = q_i, i_{t+1}=q_j , O|\lambda)$能夠由前向後向機率來表示爲:$$P(i_t = q_i, i_{t+1}=q_j , O|\lambda) = \alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)$$
從而最終咱們獲得$\xi_t(i,j)$的表達式以下:$$\xi_t(i,j) = \frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum\limits_{r=1}^N\sum\limits_{s=1}^N\alpha_t(r)a_{rs}b_s(o_{t+1})\beta_{t+1}(s)}$$
3) 將$\gamma_t(i)$和$\xi_t(i,j)$在各個時刻$t$求和,能夠獲得:
在觀測序列$O$下狀態$i$出現的指望值$\sum\limits_{t=1}^T\gamma_t(i)$
在觀測序列$O$下由狀態$i$轉移的指望值$\sum\limits_{t=1}^{T-1}\gamma_t(i)$
在觀測序列$O$下由狀態$i$轉移到狀態$j$的指望值$\sum\limits_{t=1}^{T-1}\xi_t(i,j)$
上面這些經常使用的機率值在求解HMM問題二,即求解HMM模型參數的時候須要用到。咱們在這個系列的第三篇來討論求解HMM參數的問題和解法。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)