基本要素
HMM三大問題
給定觀測序列 \(O=O_1O_2...O_T\),模型 \(\lambda (A,B,\pi)\),計算 \(P(O|\lambda)\),即計算觀測序列的機率spa
給定觀測序列 \(O=O_1O_2...O_T\),模型 \(\lambda (A,B,\pi)\),找到對應的狀態序列 \(S\).net
給定觀測序列 \(O=O_1O_2...O_T\),找到模型參數 \(\lambda (A,B,\pi)\),以最大化 \(P(O|\lambda)\),code
機率計算問題
給定模型 \(\lambda\) 和觀測序列 \(O\),如何計算\(P(O| \lambda)\)?htm
暴力枚舉每個可能的狀態序列 \(S\)blog
-
對每個給定的狀態序列
\[P(O|S,\lambda) = \prod^T_{t=1} P(O_t|s_t,\lambda) =\prod^T_{t=1} b_{s_tO_t} \]
-
一個狀態序列的產生機率
\[P(S|\lambda) = P(s_1)\prod^T_{t=2}P(s_t|s_{t-1})=\pi_1\prod^T_{t=2}a_{s_{t-1}s_t} \]
-
聯合機率
\[P(O,S|\lambda) = P(S|\lambda)P(O|S,\lambda) =\pi_1\prod^T_{t=2}a_{s_{t-1}s_t}\prod^T_{t=1} b_{s_tO_t} \]
-
考慮全部的狀態序列
\[P(O|\lambda)=\sum_S\pi_1b_{s_1O_1}\prod^T_{t=2}a_{s_{t-1}s_t}b_{s_tO_t} \]
\(O\) 可能由任意一個狀態獲得,因此須要將每一個狀態的可能性相加。
這樣作什麼問題?時間複雜度高達 \(O(2TN^T)\)。每一個序列須要計算 \(2T\) 次,一共 \(N^T\) 個序列。
前向算法
在時刻 \(t\),狀態爲 \(i\) 時,前面的時刻觀測到 \(O_1,O_2, ..., O_t\) 的機率,記爲 \(\alpha _i(t)\) :
\[\alpha_{i}(t)=P\left(O_{1}, O_{2}, \ldots O_{t}, s_{t}=i | \lambda\right) \]
當 \(t=1\) 時,輸出爲 \(O_1\),假設有三個狀態,\(O_1\) 多是任意一個狀態發出,即
\[P(O_1|\lambda) = \pi_1b_1(O_1)+\pi_2b_2(O_1)+\pi_2b_3(O_1) = \alpha_1(1)+\alpha_2(1)+\alpha_3(1) \]

當 \(t=2\) 時,輸出爲 \(O_1O_2\) ,\(O_2\) 可能由任一個狀態發出,同時產生 \(O_2\) 對應的狀態能夠由 \(t=1\) 時刻任意一個狀態轉移獲得。假設 \(O_2\) 由狀態 1
發出,以下圖

\[P(O_1O_2,s_2=q_1|\lambda) = \pi_1b_1(O_1)a_{11}b_1(O_2)+\pi_2b_2(O_1)a_{21}b_1(O_2)+\pi_2b_3(O_1)a_{31}b_1(O_2) \\=\bold{\alpha_1(1)}a_{11}b_1(O_2)+\bold{\alpha_2(1)}a_{21}b_1(O_2)+\bold{\alpha_3(1)}a_{31}b_1(O_2) = \bold{\alpha_1(2)} \]
同理可得 \(\alpha_2(2),\alpha_3(2)\)
\[\bold{\alpha_2(2)} = P(O_1O_2,s_2=q_2|\lambda) =\bold{\alpha_1(1)}a_{12}b_1(O_2)+\bold{\alpha_2(1)}a_{22}b_1(O_2)+\bold{\alpha_3(1)}a_{32}b_1(O_2)\\\bold{\alpha_3(2)} = P(O_1O_2,s_2=q_3|\lambda) =\bold{\alpha_1(1)}a_{13}b_1(O_2)+\bold{\alpha_2(1)}a_{23}b_1(O_2)+\bold{\alpha_3(1)}a_{33}b_1(O_2) \]
因此
\[P(O_1O_2|\lambda) =P(O_1O_2,s_2=q_1|\lambda)+ P(O_1O_2,s_2=q_2|\lambda) +P(O_1O_2,s_2=q_3|\lambda)\\= \alpha_1(2)+\alpha_2(2)+\alpha_3(2) \]
因此前向算法過程以下:
step1:初始化 \(\alpha_i(1)= \pi_i*b_i(O_1)\)
step2:計算 \(\alpha(t) = (\sum^{N}_{i=1} \alpha_i(t-1)a_{ij})b_j(O_{t})\)
step3:\(P(O|\lambda) = \sum^N_{i=1}\alpha_i(t)\)
相比暴力法,時間複雜度下降了嗎?
當前時刻有 \(N\) 個狀態,每一個狀態可能由前一時刻 \(N\) 個狀態中的任意一個轉移獲得,因此單個時刻的時間複雜度爲 \(O(N^2)\),總時間複雜度爲 \(O(TN^2)\)
後向算法
在時刻 \(t\),狀態爲 \(i\) 時,觀測到 \(O_{t+1},O_{t+2}, ..., O_T\) 的機率,記爲 \(\beta _i(t)\) :
\[\beta_{i}(t)=P\left(O_{t+1},O_{t+2}, ..., O_T | s_{t}=i, \lambda\right) \]
當 \(t=T\) 時,因爲 \(T\) 時刻以後爲空,沒有觀測,因此 \(\beta_i(t)=1\)
當 \(t = T-1\) 時,觀測 \(O_T\) ,\(O_T\) 可能由任意一個狀態產生
\[\beta_i(T-1) = P(O_T|s_{t}=i,\lambda) = a_{i1}b_1(O_T)\beta_1(T)+a_{i2}b_2(O_T)\beta_2(T)+a_{i3}b_3(O_T)\beta_3(T) \]

當 \(t=1\) 時,觀測爲 \(O_{2},O_{3}, ..., O_T\)
\[\begin{aligned}\beta_1(1) &= P(O_{2},O_{3}, ..., O_T|s_1=1,\lambda)\\&=a_{11}b_1(O_2)\beta_1(2)+a_{12}b_2(O_2)\beta_2(2)+a_{13}b_3(O_2)\beta_3(2)\\\quad\\\beta_2(1) &= P(O_{2},O_{3}, ..., O_T|s_1=2,\lambda)\\&=a_{21}b_1(O_2)\beta_1(2)+a_{22}b_2(O_2)\beta_2(2)+a_{23}b_3(O_2)\beta_3(2)\\\quad\\\beta_3(1) &=P(O_{2},O_{3}, ..., O_T|s_1=3,\lambda)\\&=a_{31}b_1(O_2)\beta_1(2)+a_{32}b_2(O_2)\beta_2(2)+a_{33}b_3(O_2)\beta_3(2)\end{aligned} \]
因此
\[P(O_{2},O_{3}, ..., O_T|\lambda) = \beta_1(1)+\beta_2(1)+\beta_3(1) \]
後向算法過程以下:
step1:初始化 \(\beta_i(T=1)\)
step2:計算 \(\beta_i(t) = \sum^N_{j=1}a_{ij}b_j(O_{t+1})\beta_j(t+1)\)
step3:\(P(O|\lambda) = \sum^N_{i=1}\pi_ib_i(O_1)\beta_i(1)\)
前向-後向算法

回顧前向、後向變量:
- \(a_i(t)\) 時刻 \(t\),狀態爲 \(i\) ,觀測序列爲 \(O_1,O_2, ..., O_t\) 的機率
- \(\beta_i(t)\) 時刻 \(t\),狀態爲 \(i\) ,觀測序列爲 \(O_{t+1},O_{t+2}, ..., O_T\) 的機率
\[\begin{aligned}P(O,s_t=i|\lambda)&= P(O_1,O_2, ..., O_T,s_t=i|\lambda)\\&= P(O_1,O_2, ..., O_t,s_t=i,O_{t+1},O_{t+2}, ..., O_T|\lambda)\\&= P(O_1,O_2, ..., O_t,s_t=i|\lambda)*P(O_{t+1},O_{t+2}, ..., O_T|O_1,O_2, ..., O_t,s_t=i,\lambda) \\&= P(O_1,O_2, ..., O_t,s_t=i|\lambda)*P(O_{t+1},O_{t+2}, ..., O_T,s_t=i|\lambda)\\&= a_i(t)*\beta_i(t)\end{aligned} \]
即在給定的狀態序列中,\(t\) 時刻狀態爲 \(i\) 的機率。
使用先後向算法能夠計算隱狀態,記 \(\gamma_i(t) = P(s_t=i|O,\lambda)\) 表示時刻 \(t\) 位於隱狀態 \(i\) 的機率
\[P\left(s_{t}=i, O | \lambda\right)=\alpha_{i}(t) \beta_{i}(t) \]
\[\begin{aligned}\gamma_{i}(t)&=P\left(s_{t}={i} | O, \lambda\right)=\frac{P\left(s_{t}={i}, O | \lambda\right)}{P(O | \lambda)} \\&=\frac{\alpha_{i}(t) \beta_{i}(t)}{P(O | \lambda)}=\frac{\alpha_{i}(t) \beta_{i}(t)}{\sum_{i=1}^{N} \alpha_{i}(t) \beta_{i}(t)}\end{aligned} \]
未完待續。。。
Decoder
維特比算法
維特比算法的基礎能夠歸納爲下面三點(來源於吳軍:數學之美):
一、若是機率最大的路徑通過籬笆網絡的某點,則從開始點到該點的子路徑也必定是從開始到該點路徑中機率最大的。
二、假定第i時刻有k個狀態,從開始到i時刻的k個狀態有k條最短路徑,而最終的最短路徑必然通過其中的一條。
三、根據上述性質,在計算第i+1狀態的最短路徑時,只須要考慮從開始到當前的k個狀態值的最短路徑和當前狀態值到第i+1狀態值的最短路徑便可,如求t=3時的最短路徑,等於求t=2時的全部狀態結點x2i的最短路徑加上t=2到t=3的各節點的最短路徑。
references:
[1] https://www.cs.sjsu.edu/~stamp/RUA/HMM.pdf
[2] https://www.cnblogs.com/skyme/p/4651A331.html
[3] http://www.javashuo.com/article/p-wmvxlnjq-cn.html
[4] https://hmmlearn.readthedocs.io/en/latest/tutorial.html
[5] https://blog.csdn.net/xueyingxue001/article/details/52396494
[6] https://blog.csdn.net/hudashi/java/article/details/87875259
[7] https://www.zhihu.com/question/20136144
[8] http://www.javashuo.com/article/p-asqtxiud-mh.html
[9] https://blog.csdn.net/u014688145/article/details/53046765