隐马尔科夫模型(Hidden Markov Model, HMM)是建模序列数据的图模型
在HMM模型存在隐藏状态 { … , x ( t − 1 ) , x ( t ) , x ( t + 1 ) , … } \{\dots,x(t-1),x(t),x(t+1),\dots\} {…,x(t−1),x(t),x(t+1),…},以及观测状态 { … , y ( t − 1 ) , y ( t ) , y ( t + 1 ) , … } \{\dots,y(t-1),y(t),y(t+1),\dots\} {…,y(t−1),y(t),y(t+1),…}
设 Q Q Q为所有隐藏状态的集合, V V V为所有观测状态的集合,即
Q = { q 1 , q 2 , … , q N } , V = { v 1 , v 2 , … v M } Q=\{q_1,q_2,\ldots,q_N\},V=\{v_1,v_2,\ldots v_M\} Q={q1,q2,…,qN},V={v1,v2,…vM}
设存在长度为 T T T的序列,其中 I I I对应的状态序列, Q Q Q是对应的观察序列
I = { i 1 , i 2 , … , i T } , O = { o 1 , o 2 , … o T } i t ∈ Q , o t ∈ V I=\{i_1,i_2,\ldots,i_T\},O=\{o_1,o_2,\ldots o_T\}\quad i_t\in Q,o_t\in V I={i1,i2,…,iT},O={o1,o2,…oT}it∈Q,ot∈V
其中HMM满足齐次马尔科夫链假设,即即任意时刻的隐藏状态只依赖于它前一个隐藏状态,一般来说, 给定状态 q t q_t qt,对于时刻 s < t s
定义在 t t t时刻隐藏状态为 i t = q j i_t=q_j it=qj到 t + 1 t+1 t+1时刻隐藏状态为 i t + 1 = q i i_{t+1}=q_i it+1=qi的转移概率为 a i j a_{ij} aij,即
a i j = P ( i t + 1 = q j ∣ i t = q i ) a_{ij}=P(i_{t+1}=q_j|i_t=q_i) aij=P(it+1=qj∣it=qi)
同时 a i j a_{ij} aij可以组成马尔科夫链的状态转移矩阵 A A A
A = [ a i j ] N × N A=\begin{bmatrix}a_{ij}\end{bmatrix}_{N\times N} A=[aij]N×N
定义在 t t t时刻隐藏状态为 i t = q j i_t=q_j it=qj观测到 o t + 1 = v k o_{t+1}=v_k ot+1=vk的概率为 b j ( k ) b_j(k) bj(k),即
b j ( k ) = P ( o t = v k ∣ i t = q j ) b_j(k)=P(o_t=v_k|i_t=q_j) bj(k)=P(ot=vk∣it=qj)
同时 b j ( k ) b_j(k) bj(k)可以组成马尔科夫链的观测概率矩阵 B B B
B = [ b j ( k ) ] N × M B=\left[b_j(k)\right]_{N\times M} B=[bj(k)]N×M
并定义在 t = 1 t=1 t=1时刻的隐藏状态概率分布 Π \Pi Π
Π = [ π ( i ) ] N 其中 π ( i ) = P ( i 1 = q i ) \Pi=\left[\pi(i)\right]_N\text{其中 }\pi(i)=P(i_1=q_i) Π=[π(i)]N其中 π(i)=P(i1=qi)
可知一个HMM模型可以由隐藏状态初始概率分布 Π \Pi Π , 状态转移概率矩阵 A A A 和观测状态概率矩阵 B B B 决定。 Π , A \Pi,A Π,A 决定状态序列, B B B 决定观测序列。因此,HMM模型可以由一个三元组 λ \lambda λ表示如下: λ = ( A , B , Π ) \lambda=(A,B,\Pi) λ=(A,B,Π)
当给定模型HMM模型 λ = ( A , B , Π ) \lambda=(A,B,\Pi) λ=(A,B,Π)和观测序列 O = { o 1 , o 2 , … o T } O=\{o_1,o_2,\ldots o_T\} O={o1,o2,…oT},求观测序列 O O O在HMM中出现的概率 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)
计算 I = { i 1 , i 2 , … , i T } I=\{i_1,i_2,\ldots,i_T\} I={i1,i2,…,iT}出现的概率
P ( I ∣ λ ) = π i 1 a i 1 i 2 a i 2 i 3 ⋯ a i T − 1 i T P(I|\lambda)=\pi_{i_1}a_{i_1i_2}a_{i_2i_3}\cdots a_{i_{T-1}i_T} P(I∣λ)=πi1ai1i2ai2i3⋯aiT−1iT
其中观测序列 O = { o 1 , o 2 , … o T } O=\{o_1,o_2,\ldots o_T\} O={o1,o2,…oT}在 I = { i 1 , i 2 , … , i T } I=\{i_1,i_2,\ldots,i_T\} I={i1,i2,…,iT}情况下出现的概率
P ( O ∣ I , λ ) = b i 1 ( o 1 ) b i 2 ( o 2 ) . … b i T ( o T ) P(O|I,\lambda)=b_{i_1}(o_1)b_{i_2}(o_2).\ldots b_{i_T}(o_T) P(O∣I,λ)=bi1(o1)bi2(o2).…biT(oT)
根据联合概率公式可得
P ( O , I ∣ λ ) = P ( I ∣ λ ) P ( O ∣ I , λ ) = π i 1 b i 1 ( o 1 ) a i 1 i 2 b i 2 ( o 2 ) … a i T − 1 i T b i T ( o T ) 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)\ldots a_{i_{T-1}i_T}b_{i_T}(o_T) P(O,I∣λ)=P(I∣λ)P(O∣I,λ)=πi1bi1(o1)ai1i2bi2(o2)…aiT−1iTbiT(oT)
然后计算边缘概率
P ( O ∣ λ ) = ∑ I P ( O , I ∣ λ ) = ∑ i 1 , i 2 , . . , i T π i 1 b i 1 ( o 1 ) a i 1 , i 2 b i 2 ( o 2 ) … a i T − 1 i T b i T ( o T ) P(O|\lambda)=\sum_{I}P(O,I|\lambda)=\sum_{i_1,i_2,..,i_T}\pi_{i_1}b_{i_1}(o_1)a_{i_1,i_2}b_{i_2}(o_2)\ldots a_{i_{T-1} i_T}b_{i_T}(o_T) P(O∣λ)=I∑P(O,I∣λ)=i1,i2,..,iT∑πi1bi1(o1)ai1,i2bi2(o2)…aiT−1iTbiT(oT)
虽然直接计算方法有效,但是如果隐藏状态数 N N N 非常多,此时预测状态有 N T N^T NT 种组合,算法的时间复杂度是 O ( T N T ) O(TN^T) O(TNT) 阶的。因此对于一些隐藏状态数极少的模型,我们可以直接计算来得到观测序列出现的概率,但是如果隐藏状态多,则上述算法太耗时,我们需要寻找其他简洁的算法。
前向概率:时刻 t t t部分观测序列为 O = { o 1 , o 2 , … o t } O=\{o_1,o_2,\ldots o_t\} O={o1,o2,…ot} ,且隐藏状态为 q i q_i qi的概率为
α t ( i ) = P ( o 1 , o 2 , … o t , i t = q i ∣ λ ) \alpha_{t}(i)=P(o_{1},o_{2},\ldots o_{t},i_{t}=q_{i}|\lambda) αt(i)=P(o1,o2,…ot,it=qi∣λ)
可得时刻 t t t部分观测序列为 O = { o 1 , o 2 , … o t } O=\{o_1,o_2,\ldots o_t\} O={o1,o2,…ot} ,隐藏状态为 q j q_j qj且 t + 1 t+1 t+1时刻隐藏状态为 q i q_i qi的概率为 α t ( j ) a j i \alpha_{t}(j)a_{ji} αt(j)aji,可推出时刻 t t t部分观测序列为 O = { o 1 , o 2 , … o t } O=\{o_1,o_2,\ldots o_t\} O={o1,o2,…ot} ,且 t + 1 t+1 t+1时刻隐藏状态为 q i q_i qi的概率为 ∑ j = 1 N α t ( j ) a j i \sum_{j=1}^{N}\alpha_{t}(j)a_{ji} ∑j=1Nαt(j)aji,若 t + 1 t+1 t+1时刻的观测状态为 o t + 1 o_{t+1} ot+1,则可以得到 t + 1 t+1 t+1时刻观测序列为 O = { o 1 , o 2 , … o t + 1 } O=\{o_1,o_2,\ldots o_{t+1}\} O={o1,o2,…ot+1}且 t + 1 t+1 t+1时刻隐藏状态为 q i q_i qi的概率为:
α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) a j i ] b i ( o t + 1 ) \alpha_{t+1}\left(i\right)=\left[\sum_{j=1}^{N}\alpha_{t}(j)a_{ji}\right]b_{i}\left(o_{t+1}\right.) αt+1(i)=[j=1∑Nαt(j)aji]bi(ot+1)
由此得到了从前向概率的递推表达式
算法描述
输入:HMM模型 λ = ( A , B , Π ) \lambda=(A,B,\Pi) λ=(A,B,Π) ,观测序列 O = ( o 1 , o 2 , … o T ) O=(o_1,o_2,\ldots o_T) O=(o1,o2,…oT)
输出:观测序列概率 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)。
α 1 ( i ) = π i b i ( o 1 ) , i = 1 , 2 , ⋯ , N \begin{aligned}\alpha_1(i)=\pi_ib_i(o_1),\quad i=1,2,\cdots,N\end{aligned} α1(i)=πibi(o1),i=1,2,⋯,N
α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) a j i ] b i ( o t + 1 ) , i = 1 , 2 , … , N \alpha_{t+1}\left(i\right)=\left[\sum_{j=1}^{N}\alpha_{t}(j)a_{ji}\right]b_{i}\left(o_{t+1}\right.),\quad i=1,2,\dots,N αt+1(i)=[j=1∑Nαt(j)aji]bi(ot+1),i=1,2,…,N
P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) P(O|\lambda)=\sum_{i=1}^N\alpha_T(i) P(O∣λ)=i=1∑NαT(i)
算法时间复杂度是 O ( T N 2 ) O(TN^2) O(TN2)
后向概率:时刻 t + 1 t+1 t+1到最后时刻 T T T的部分观测序列为 { o t + 1 , o t + 2 , … o T } \{o_{t+1},o_{t+2},\ldots o_T\} {ot+1,ot+2,…oT} ,且时刻 t t t的隐藏状态为 q i q_i qi的概率为
β t ( i ) = P ( o t + 1 , o t + 2 , … o T ∣ i t = q i , λ ) \beta_{t}(i)=P(o_{t+1},o_{t+2},\ldots o_T|i_{t}=q_{i},\lambda) βt(i)=P(ot+1,ot+2,…oT∣it=qi,λ)
可得 t + 2 t+2 t+2到最后时刻 T T T观测状态为 { o t + 2 , o t + 3 , … o T } \{o_{t+2},o_{t+3},\ldots{o}_T\} {ot+2,ot+3,…oT}, t t t时刻隐藏状态为 q i q_i qi, t + 1 t+1 t+1时刻隐藏状态为 q j q_j qj的概率为 a i j β t + 1 ( j ) a_{ij}\beta_{t+1}(j) aijβt+1(j),当 t + 1 t+1 t+1时刻观测到的状态 o t + 1 o_{t+1} ot+1,此时概率为 a i j b j ( o t + 1 ) β t + 1 ( j ) a_{ij}b_j(o_{t+1})\beta_{t+1}(j) aijbj(ot+1)βt+1(j),可得时刻 t t t到最后时刻 T T T的部分观测序列为 { o t + 1 , o t + 2 , … o T } \{o_{t+1},o_{t+2},\ldots o_T\} {ot+1,ot+2,…oT} ,且时刻 t t t的隐藏状态为 q i q_i qi的概率为
∑ j = 1 N a i j b j ( o t + 1 ) β t + 1 ( j ) \sum_{j=1}^Na_{ij}b_j(o_{t+1})\beta_{t+1}(j) j=1∑Naijbj(ot+1)βt+1(j)
算法描述
输入:HMM模型 λ = ( A , B , Π ) \lambda=(A,B,\Pi) λ=(A,B,Π) ,观测序列 O = ( o 1 , o 2 , … o T ) O=(o_1,o_2,\ldots o_T) O=(o1,o2,…oT)
输出:观测序列概率 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)
β T ( i ) = 1 , i = 1 , 2 , … N \beta_T(i)=1,\:i=1,2,\ldots N βT(i)=1,i=1,2,…N
β t ( i ) = ∑ j = 1 N a i j b j ( o t + 1 ) β t + 1 ( j ) , i = 1 , 2 , … N \beta_t(i)=\sum_{j=1}^Na_{ij}b_j(o_{t+1})\beta_{t+1}(j),\:i=1,2,\ldots N βt(i)=j=1∑Naijbj(ot+1)βt+1(j),i=1,2,…N
P ( O ∣ λ ) = ∑ i = 1 N π i b i ( o 1 ) β 1 ( i ) P(O|\lambda)=\sum_{i=1}^N\pi_ib_i(o_1)\beta_1(i) P(O∣λ)=i=1∑Nπibi(o1)β1(i)
算法时间复杂度是 O ( T N 2 ) O(TN^2) O(TN2)