个人学习笔记(十二)隐马尔科夫模型

       隐马尔科夫模型(hidden Markov model, HMM)是用于标注问题的统计学习模型,属于生成模型。

一、隐马尔科夫模型的基本概念

       隐藏的马尔科夫链随机生成的状态的序列,称为状态序列(state sequence);每个状态生成一个观测,由此产生观测的随机序列,称为观测序列(observation sequence)。序列的每一个位置可以看作是一个时刻。
       设 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,\cdots,q_N\}, V=\{v_1,v_2,\cdots,v_M\} Q={q1,q2,,qN}, V={v1,v2,,vM}       式中, N N N是可能的状态数, M M M是所有可能的观测数。
        I I I是长度为 T T T的状态序列, O O O是对应的观测序列,即
I = ( i 1 , i 2 , ⋯   , i T ) ,   O = ( o 1 , o 2 , ⋯   , o T ) I=(i_1,i_2,\cdots,i_T), O=(o_1,o_2,\cdots,o_T) I=(i1,i2,,iT), O=(o1,o2,,oT)       隐马尔科夫模型建立在以上状态与观测概念的基础上,它由初始状态概率向量 π \pi π、状态转移概率矩阵 A A A和观测概率矩阵 B B B决定。因此,隐马尔科夫模型 λ \lambda λ可用以下三元符号表示
λ = ( A , B , π ) \lambda =(A,B,\pi) λ=(A,B,π)        A , B , π A,B,\pi A,B,π称为隐马尔科夫模型的三要素,其中 π \pi π A A A决定状态序列, B B B决定观测序列。接着分别介绍 A , B , π A,B,\pi A,B,π的概念。
        A A A是状态转移概率矩阵
A = [ a i j ] N × N A=[a_{ij}]_{N\times N} A=[aij]N×N       其中
a i j = P ( i t + 1 = q j ∣ i t = q i ) ,   i = 1 , 2 , ⋯   , N ;   j = 1 , 2 , ⋯   , N a_{ij}=P(i_{t+1}=q_j|i_t=q_i),  i=1,2,\cdots,N; j=1,2,\cdots,N aij=P(it+1=qjit=qi), i=1,2,,N; j=1,2,,N       即前一时刻处于状态 q i q_i qi的条件下下一时刻转移到状态 q j q_j qj的概率。
        B B B是观测概率矩阵
B = [ b j ( k ) ] N × M B=[b_j(k)]_{N\times M} B=[bj(k)]N×M       其中
b j ( k ) = P ( o t = v k ∣ i t = q j ) ,   k = 1 , 2 , ⋯   , M ;   j = 1 , 2 , ⋯   , N b_j(k)=P(o_t=v_k|i_t=q_j), k=1,2,\cdots,M; j=1,2,\cdots,N bj(k)=P(ot=vkit=qj), k=1,2,,M; j=1,2,,N       即处于状态 q j q_j qj的条件下生成观测 v k v_k vk的概率。
        π \pi π是初始状态概率向量
π = ( π i ) ,   i = 1 , 2 , ⋯   , N \pi=(\pi_i), i=1,2,\cdots,N π=(πi), i=1,2,,N       其中
π i = P ( i 1 = q i ) \pi_i=P(i_1=q_i) πi=P(i1=qi)       即第一个时刻处于状态 q i q_i qi的概率。
       隐马尔科夫模型作了下面两个基本假设:
       (1)齐次马尔科夫性假设,即任一时刻 t t t的状态只与 t − 1 t-1 t1时刻的状态有关,与其他时刻的状态和观测无关
P ( i t ∣ i t − 1 , o t − 1 , ⋯   , i 1 , o 1 ) = P ( i t ∣ i t − 1 ) P(i_t|i_{t-1},o_{t-1},\cdots,i_1,o_1)=P(i_t|i_{t-1}) P(itit1,ot1,,i1,o1)=P(itit1)       (2)观测独立性假设,即任意时刻的观测只依赖该时刻的状态
P ( o t ∣ i T , o T , i T − 1 , o T − 1 , ⋯   , i t + 1 , o t + 1 , i t , i t − 1 , o t − 1 , ⋯   , i 1 , o 1 ) = P ( o t ∣ i t ) P(o_t|i_T,o_T,i_{T-1},o_{T-1},\cdots,i_{t+1},o_{t+1},i_t,i_{t-1},o_{t-1},\cdots,i_1,o_1)=P(o_t|i_t) P(otiT,oT,iT1,oT1,,it+1,ot+1,it,it1,ot1,,i1,o1)=P(otit)       隐马尔科夫模型可以用于标注,即给定观测的序列预测其对应的标记序列,这时状态对应标记。
       最后介绍一下隐马尔科夫模型的三个基本问题。
       (1)概率计算问题。给定模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)和观测序列 O = ( o 1 , o 2 , ⋯   , o T ) O=(o_1,o_2,\cdots,o_T) O=(o1,o2,,oT),计算观测 O O O出现的概率。
       (2)学习问题。给定观测序列 O = ( o 1 , o 2 , ⋯   , o T ) O=(o_1,o_2,\cdots,o_T) O=(o1,o2,,oT),用极大似然估计模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)的参数。
       (3)预测问题,也叫解码(decoding)问题。给定模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)和观测序列 O = ( o 1 , o 2 , ⋯   , o T ) O=(o_1,o_2,\cdots,o_T) O=(o1,o2,,oT),求最可能对应的状态序列。

二、概率计算算法

       概率计算是计算观测序列 O O O出现的概率 P ( O ∣ λ ) P(O|\lambda) P(Oλ),最直接的算法是,先列举所有可能的状态序列 I = ( i 1 , i 2 , ⋯   , i T ) I=(i_1,i_2,\cdots,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λ)=πi1ai1i2ai2i3aiT1iT,再计算每个状态下的给定观测序列概率 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)\cdots b_{i_T}(o_T) P(OI,λ)=bi1(o1)bi2(o2)biT(oT),接着计算状态序列 I I I和观测序列 O O O的联合概率 P ( O , I ∣ λ ) = P ( I ∣ λ ) P ( O ∣ I , λ ) P(O,I|\lambda)=P(I|\lambda)P(O|I,\lambda) P(O,Iλ)=P(Iλ)P(OI,λ),对所有可能的 I I I求和,得到 P ( O ∣ λ ) = ∑ I P ( O , I ∣ λ ) P(O|\lambda)=\sum_IP(O,I|\lambda) P(Oλ)=IP(O,Iλ)
       这种算法的效率太低了,因为可能的状态序列就有 N T N^T NT个,而每个状态序列的每个时刻都要计算一次给定观测的概率,因此算法是 O ( T N T ) O(TN^T) O(TNT)阶的。
       接着来看更快的前向算法。先抛出一个定义,给定模型参数 λ \lambda λ,到时刻 t t t的部分观测序列为 o 1 , o 2 , ⋯   , o t o_1,o_2,\cdots,o_t o1,o2,,ot且时刻 t t t状态为 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,\cdots,o_t,i_t=q_i|\lambda) αt(i)=P(o1,o2,,ot,it=qiλ)       这个前向概率是可以递推得到的。首先确定初始时刻 t = 1 t=1 t=1的前向概率
α 1 ( i ) = P ( o 1 , i t = q i ∣ λ ) = P ( i t = q i ∣ λ ) P ( o 1 ∣ i t = q i , λ ) = π i b i ( o 1 ) ,   i = 1 , 2 , ⋯   , N \alpha_1(i)=P(o_1,i_t=q_i|\lambda)=P(i_t=q_i|\lambda)P(o_1|i_t=q_i,\lambda)=\pi_ib_i(o_1), i=1,2,\cdots,N α1(i)=P(o1,it=qiλ)=P(it=qiλ)P(o1it=qi,λ)=πibi(o1), i=1,2,,N       接着递推后面各时刻的前向概率
α t + 1 ( i ) = P ( o 1 , ⋯   , o t + 1 , i t + 1 = q i ∣ λ ) = P ( o 1 , ⋯   , o t + 1 ∣ λ ) P ( i t + 1 = q i ∣ o 1 , ⋯   , o t + 1 , λ ) \alpha_{t+1}(i)=P(o_1,\cdots,o_{t+1},i_{t+1}=q_i|\lambda)=P(o_1,\cdots,o_{t+1}|\lambda)P(i_{t+1}=q_i|o_1,\cdots,o_{t+1},\lambda) αt+1(i)=P(o1,,ot+1,it+1=qiλ)=P(o1,,ot+1λ)P(it+1=qio1,,ot+1,λ)       因为式中的
P ( o 1 , ⋯   , o t + 1 ∣ λ ) = P ( o 1 , ⋯   , o t ∣ λ ) P ( o t + 1 ∣ o 1 , ⋯   , o t , λ ) P(o_1,\cdots,o_{t+1}|\lambda)=P(o_1,\cdots,o_t|\lambda)P(o_{t+1}|o_1,\cdots,o_t,\lambda) P(o1,,ot+1λ)=P(o1,,otλ)P(ot+1o1,,ot,λ)       又上式可继续写作
P ( o 1 , ⋯   , o t + 1 ∣ λ ) = ∑ j = 1 N P ( o 1 , ⋯   , o t , i t = q j ∣ λ ) P ( o t + 1 ∣ o 1 , ⋯   , o t , i t = q j , λ ) P(o_1,\cdots,o_{t+1}|\lambda)=\sum_{j=1}^NP(o_1,\cdots,o_t,i_t=q_j|\lambda)P(o_{t+1}|o_1,\cdots,o_t,i_t=q_j,\lambda) P(o1,,ot+1λ)=j=1NP(o1,,ot,it=qjλ)P(ot+1o1,,ot,it=qj,λ)       因此
P ( o 1 , ⋯   , o t + 1 ∣ λ ) = ∑ j = 1 N α t ( j ) a j i P(o_1,\cdots,o_{t+1}|\lambda)=\sum_{j=1}^N\alpha_t(j)a_{ji} P(o1,,ot+1λ)=j=1Nαt(j)aji       代入 α t + 1 ( i ) \alpha_{t+1}(i) αt+1(i)的表达式,得
α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) a j i ] b i ( o t + 1 )   i = 1 , 2 , ⋯   , N \alpha_{t+1}(i)=[\sum_{j=1}^N\alpha_t(j)a_{ji}]b_i(o_{t+1}) i=1,2,\cdots,N αt+1(i)=[j=1Nαt(j)aji]bi(ot+1) i=1,2,,N       递推至最后时刻,得到 P ( O ∣ λ ) P(O|\lambda) P(Oλ)的表达式
P ( O ∣ λ ) = P ( o 1 , ⋯   , o T ∣ λ ) = ∑ i = 1 N P ( o 1 , ⋯   , o T , i T = q i ∣ λ ) = ∑ i = 1 N α T ( i ) P(O|\lambda)=P(o_1,\cdots,o_T|\lambda)=\sum_{i=1}^NP(o_1,\cdots,o_T,i_T=q_i|\lambda)=\sum_{i=1}^N\alpha_T(i) P(Oλ)=P(o1,,oTλ)=i=1NP(o1,,oT,iT=qiλ)=i=1NαT(i)       前向算法比直接算法快很多,每一次递推都要计算 N 2 N^2 N2次,因此前向算法是 O ( T N 2 ) O(TN^2) O(TN2)阶的。
       再来看与前向算法相对应的后向算法。同样先抛出一个定义,给定模型参数 λ \lambda λ,在时刻 t t t状态为 q i q_i qi的条件下,从 t + 1 t+1 t+1往后的部分观测序列为 o t + 1 , o t + 2 , ⋯   , o T o_{t+1},o_{t+2},\cdots,o_{T} ot+1,ot+2,,oT的概率为后向概率,记作
β 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},\cdots,o_T|i_t=q_i,\lambda) βt(i)=P(ot+1,ot+2,,oTit=qi,λ)       仔细观察,后向概率与前向概率有两点不同。第一点,前向概率是 o 1 , ⋯   , o t o_1,\cdots,o_t o1,,ot的概率,后向概率为 o t + 1 , ⋯   , o T o_{t+1},\cdots,o_T ot+1,,oT的概率,它们是互斥的两部分;第二点,在后向概率中, i t = q i i_t=q_i it=qi是作为条件写在后面的。
       后向概率同样可以递推得到。首先确定最后时刻 t = T t=T t=T的后向概率
β T ( i ) = 1 ,   i = 1 , 2 , ⋯   , N \beta_T(i)=1, i=1,2,\cdots,N βT(i)=1, i=1,2,,N       接着递推前面各时刻的后向概率
β t ( i ) = ∑ j = 1 N α i j b j ( o t + 1 ) β t + 1 ( j ) ,   i = 1 , 2 , ⋯   , N \beta_t(i)=\sum_{j=1}^N\alpha_{ij}b_j(o_{t+1})\beta_{t+1}(j), i=1,2,\cdots,N βt(i)=j=1Nαijbj(ot+1)βt+1(j), i=1,2,,N       最终递推至 β 1 ( i ) \beta_1(i) β1(i)后,可以得到 P ( O ∣ λ ) P(O|\lambda) P(Oλ)的表达式
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=1Nπibi(o1)β1(i)       根据前向概率与后向概率中 P ( O ∣ λ ) P(O|\lambda) P(Oλ)的两个表达式, P ( O ∣ λ ) P(O|\lambda) P(Oλ)可写成更一般的形式
P ( O ∣ λ ) = ∑ i = 1 N ∑ j = 1 N α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) ,   t = 1 , 2 , ⋯   , T − 1 P(O|\lambda)=\sum_{i=1}^N\sum_{j=1}^N\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j), t=1,2,\cdots,T-1 P(Oλ)=i=1Nj=1Nαt(i)aijbj(ot+1)βt+1(j), t=1,2,,T1

三、学习算法

       学习问题是给定观测序列,用极大似然估计模型的参数。如果已知的数据中除了观测序列 O O O,还有状态序列 I I I,那么直接用极大似然估计法来估计参数 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)即可,具体算法很简单。
       首先是转移概率 a i j a_{ij} aij的估计,设样本中两相邻时刻从状态 i i i转移到状态 j j j的频数为 A i j A_{ij} Aij,那么状态转移概率 a i j a_{ij} aij的估计是
a ^ i j = A i j ∑ j = 1 N A i j \hat a_{ij}=\frac{A_{ij}}{\sum_{j=1}^NA_{ij}} a^ij=j=1NAijAij       接着是观测概率 b j ( k ) b_j(k) bj(k)的估计,设样本中状态为 j j j且观测为 k k k的频数是 B j k B_{jk} Bjk,那么观测概率 b j ( k ) b_j(k) bj(k)的估计是
b ^ j ( k ) = B j k ∑ k = 1 M B j k \hat b_j(k)=\frac{B_{jk}}{\sum_{k=1}^MB_{jk}} b^j(k)=k=1MBjkBjk       最后是初始状态概率 π i \pi_i πi的估计,即为 S S S个样本中初始状态为 q i q_i qi的频率。
       在现实中,往往只有观测序列 O O O是已知的,状态序列看作是不可观测的隐数据 I I I,我们要估计参数 λ \lambda λ,使 P ( O ∣ λ ) P(O|\lambda) P(Oλ)最大,这样EM算法便派上用场了。
       设 λ ˉ \bar\lambda λˉ是当前估计值,根据EM算法的E步, Q Q Q函数为
Q ( λ , λ ˉ ) = E I [ l o g P ( O , I ∣ λ ) ∣ O , λ ˉ ] = ∑ I l o g P ( O , I ∣ λ ) P ( I ∣ O , λ ˉ ) Q(\lambda,\bar{\lambda})=E_I[logP(O,I|\lambda)|O,\bar{\lambda}]=\sum_IlogP(O,I|\lambda)P(I|O,\bar{\lambda}) Q(λ,λˉ)=EI[logP(O,Iλ)O,λˉ]=IlogP(O,Iλ)P(IO,λˉ)       由于式中
P ( I ∣ O , λ ˉ ) = P ( O , I ∣ λ ˉ ) P ( O , λ ˉ ) P(I|O,\bar{\lambda})=\frac{P(O,I|\bar{\lambda})}{P(O,\bar{\lambda})} P(IO,λˉ)=P(O,λˉ)P(O,Iλˉ)       而 P ( O , λ ˉ ) P(O,\bar\lambda) P(O,λˉ)对要求的 λ \lambda λ而言是常数,因此 Q Q Q函数可写为
Q ( λ , λ ˉ ) = ∑ I l o g P ( O , I ∣ λ ) P ( O , I ∣ λ ˉ ) Q(\lambda,\bar\lambda)=\sum_IlogP(O,I|\lambda)P(O,I|\bar\lambda) Q(λ,λˉ)=IlogP(O,Iλ)P(O,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)=\pi_{i_1}b_{i_1}(o_1)\cdot a_{i_1i_2}b_{i_2}(o_2)\cdots a_{i_{T-1}i_T}b_{i_T}(o_T) P(O,Iλ)=πi1bi1(o1)ai1i2bi2(o2)aiT1iTbiT(oT)       把上式分为 π , A , B \pi,A,B π,A,B三部分代入 Q Q Q函数中,可得
Q ( λ , λ ˉ ) = [ ∑ I l o g π i 1 + ∑ I ∑ t = 1 T − 1 l o g a i 1 i t + 1 + ∑ I ∑ t = 1 T l o g b i t ( o t ) ] ⋅ P ( O , I ∣ λ ˉ ) Q(\lambda,\bar\lambda)=[\sum_Ilog\pi_{i_1}+\sum_I\sum_{t=1}^{T-1}loga_{i_1i_{t+1}}+\sum_I\sum_{t=1}^Tlogb_{i_t}(o_t)]\cdot P(O,I|\bar\lambda) Q(λ,λˉ)=[Ilogπi1+It=1T1logai1it+1+It=1Tlogbit(ot)]P(O,Iλˉ)       由于要求得三个参数单独地出现在上面三项中,分别求导后可得更新三个参数的表达式
π i = P ( O , i 1 = i ∣ λ ˉ ) P ( O ∣ λ ˉ ) \pi_i=\frac{P(O,i_1=i|\bar\lambda)}{P(O|\bar\lambda)} πi=P(Oλˉ)P(O,i1=iλˉ) a i j = ∑ t = 1 T − 1 P ( O , i t = i , i t + 1 = j ∣ λ ˉ ) ∑ t = 1 T − 1 P ( O , i t = i ∣ λ ˉ ) a_{ij}=\frac{\sum_{t=1}^{T-1}P(O,i_t=i,i_{t+1}=j|\bar\lambda)}{\sum_{t=1}^{T-1}P(O,i_t=i|\bar\lambda)} aij=t=1T1P(O,it=iλˉ)t=1T1P(O,it=i,it+1=jλˉ) b j ( k ) = ∑ t = 1 T P ( O , i t = j ∣ λ ˉ ) I ( o t = v k ) ∑ t = 1 T P ( O , i t = j ∣ λ ˉ ) b_j(k)=\frac{\sum_{t=1}^TP(O,i_t=j|\bar\lambda)I(o_t=v_k)}{\sum_{t=1}^TP(O,i_t=j|\bar\lambda)} bj(k)=t=1TP(O,it=jλˉ)t=1TP(O,it=jλˉ)I(ot=vk)       上面三个式子仍然不够直接,因为它没有直接写出与 λ ˉ = ( A ˉ , B ˉ , π ˉ ) \bar\lambda=(\bar A,\bar B, \bar\pi) λˉ=(Aˉ,Bˉ,πˉ)有关的表达式,为了引出更直接的表达式,下面先介绍两个概念。
       第一个概念,设给定模型 λ \lambda λ和观测 O O O,时刻 t t t处于状态 q i q_i qi的概率为 γ t ( i ) = P ( i t = q i ∣ O , λ ) \gamma_t(i)=P(i_t=q_i|O,\lambda) γt(i)=P(it=qiO,λ),结合前向概率 α t ( i ) \alpha_t(i) αt(i)与后向概率 β t ( i ) \beta_t(i) βt(i),可得到
γ t ( i ) = α t ( i ) β t ( i ) ∑ j = 1 N α t ( j ) β t ( j ) \gamma_t(i)=\frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^N\alpha_t(j)\beta_t(j)} γt(i)=j=1Nαt(j)βt(j)αt(i)βt(i)       第二个概念,设给定模型 λ \lambda λ和观测 O O O,时刻 t t t处于状态 q i q_i qi且时刻 t + 1 t+1 t+1处于状态 q j q_j qj的概率为 ξ t ( i , j ) = P ( i t = q i , i t + 1 = q j ∣ O , λ ) \xi_t(i,j)=P(i_t=q_i,i_{t+1}=q_j|O,\lambda) ξt(i,j)=P(it=qi,it+1=qjO,λ),可得到
ξ t ( i , j ) = α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) ∑ i = 1 N ∑ j = 1 N α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) \xi_t(i,j)=\frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum_{i=1}^N\sum_{j=1}^N\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)} ξt(i,j)=i=1Nj=1Nαt(i)aijbj(ot+1)βt+1(j)αt(i)aijbj(ot+1)βt+1(j)       这样,更新三个参数的表达式可写作
a i j = ∑ t = 1 T − 1 ξ t ( i , j ) ∑ t = 1 T − 1 γ t ( i ) a_{ij}=\frac{\sum_{t=1}^{T-1}\xi_t(i,j)}{\sum_{t=1}^{T-1}\gamma_t(i)} aij=t=1T1γt(i)t=1T1ξt(i,j) b j ( k ) = ∑ t = 1 , o t = v k T γ t ( j ) ∑ t = 1 T γ t ( j ) b_j(k)=\frac{\sum_{t=1,o_t=v_k}^T\gamma_t(j)}{\sum_{t=1}^T\gamma_t(j)} bj(k)=t=1Tγt(j)t=1,ot=vkTγt(j) π i = γ 1 ( i ) \pi_i=\gamma_1(i) πi=γ1(i)

四、预测算法

       预测问题是给定模型 λ \lambda λ和观测序列 O O O,求最有可能的状态序列 I I I
       首先是最简单直接的近似算法,不考虑其他时刻,直接对每个时刻 t t t计算该时刻最有可能出现的状态,将它作为预测结果。在上一节中提到了 γ t ( i ) = α t ( i ) β t ( i ) ∑ j = 1 N α t ( j ) β t ( j ) \gamma_t(i)=\frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^N\alpha_t(j)\beta_t(j)} γt(i)=j=1Nαt(j)βt(j)αt(i)βt(i)代表时刻 t t t处于状态 q i q_i qi的概率,因此在每一个时刻 t t t最有可能的状态 i t ∗ i_t^* it
i t ∗ = arg ⁡ max ⁡ 1 ≤ i ≤ N γ t ( i ) ,   t = 1 , 2 , ⋯   , T i_t^*=\arg\max_{1\le i\le N}\gamma_t(i), t=1,2,\cdots,T it=arg1iNmaxγt(i), t=1,2,,T       近似算法比较简单,但它只能保证每一时刻都是最有可能的状态,但没法保证整个状态序列是最有可能的状态序列。事实上,用近似算法很有可能出现这种情况:得到的状态序列中,某两个相邻状态的转移概率为0。
       为了求出最有可能的状态序列,我们可以用动态规划(dynamic programming)的思路求解这个最优路径问题,即从时刻 t = 1 t=1 t=1开始,递推地计算在时刻 t t t状态为 i i i的各条部分路径的最大概率,直至得到时刻 t = T t=T t=T状态为 i i i的各条路径的最大概率,这就是维特比算法。
       先给出两个定义。在时刻 t t t状态为 i i i的所有单个路径 ( i 1 , i 2 , ⋯   , i t ) (i_1,i_2,\cdots,i_t) (i1,i2,,it)中概率最大值为
δ t ( i ) = max ⁡ i 1 , i 2 , ⋯   , i t − 1 P ( i t = i , i t − 1 , ⋯   , i 1 , o t , ⋯   , o 1 ∣ λ ) ,   i = 1 , 2 , ⋯   , N \delta_t(i)=\max_{i_1,i_2,\cdots,i_{t-1}}P(i_t=i,i_{t-1},\cdots,i_1,o_t,\cdots,o_1|\lambda), i=1,2,\cdots,N δt(i)=i1,i2,,it1maxP(it=i,it1,,i1,ot,,o1λ), i=1,2,,N       那么后面各时刻可递推得到,递推公式为
δ t + 1 ( i ) = max ⁡ 1 ≤ j ≤ N [ δ t ( j ) a j i ] b i ( o t + 1 ) ,   i = 1 , 2 , ⋯   , N ;   t = 1 , 2 , ⋯   , T − 1 \delta_{t+1}(i)=\max_{1\le j\le N}[\delta_t(j)a_{ji}]b_i(o_{t+1}), i=1,2,\cdots,N; t=1,2,\cdots,T-1 δt+1(i)=1jNmax[δt(j)aji]bi(ot+1), i=1,2,,N; t=1,2,,T1       再给出第二个定义,在时刻 t t t状态为 i i i的概率最大的路径 ( i 1 , i 2 , ⋯   , i t − 1 , i ) (i_1,i_2,\cdots,i_{t-1},i) (i1,i2,,it1,i)中,第 t − 1 t-1 t1个节点的状态为
ψ t ( i ) = arg ⁡ max ⁡ 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] \psi_t(i)=\arg\max_{1\le j\le N}[\delta_{t-1}(j)a_{ji}] ψt(i)=arg1jNmax[δt1(j)aji]       这个 ψ t ( i ) \psi_t(i) ψt(i)的含义可能有点难理解,它代表的是到目前为止最优路径中 t − 1 t-1 t1个节点的状态,它能帮助我们在递推完成得到 T T T时刻的状态后,回溯得到前面各时刻的状态。从另一种角度, δ t ( i ) \delta_t(i) δt(i)的递推公式中可以写成
δ t + 1 ( i ) = δ t ( ψ t ( i ) ) a j i b i ( o t + 1 ) \delta_{t+1}(i)=\delta_t(\psi_t(i))a_{ji}b_i(o_{t+1}) δt+1(i)=δt(ψt(i))ajibi(ot+1)       这样,就能引出维特比算法的具体过程了。首先在 t = 1 t=1 t=1时刻,有
δ 1 ( i ) = π i b i ( o 1 ) ,   i = 1 , 2 , ⋯   , N \delta_1(i)=\pi_ib_i(o_1), i=1,2,\cdots,N δ1(i)=πibi(o1), i=1,2,,N ψ 1 ( i ) = 0 ,   i = 1 , 2 , ⋯   , N \psi_1(i)=0, i=1,2,\cdots,N ψ1(i)=0, i=1,2,,N       对后面各时刻递推,有
δ t ( i ) = max ⁡ 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] b i ( o t ) ,   i = 1 , 2 , ⋯   , N \delta_t(i)=\max_{1\le j\le N}[\delta_{t-1}(j)a_{ji}]b_i(o_t), i=1,2,\cdots,N δt(i)=1jNmax[δt1(j)aji]bi(ot), i=1,2,,N ψ t ( i ) = arg ⁡ max ⁡ 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] ,   i = 1 , 2 , ⋯   , N \psi_t(i)=\arg\max_{1\le j\le N}[\delta_{t-1}(j)a_{ji}], i=1,2,\cdots,N ψt(i)=arg1jNmax[δt1(j)aji], i=1,2,,N       递推到时刻 t = T t=T t=T,可以得到最优状态序列中,时刻 T T T的状态为
i T ∗ = arg ⁡ max ⁡ 1 ≤ i ≤ N δ T ( i ) i_T^*=\arg\max_{1\le i\le N}\delta_T(i) iT=arg1iNmaxδT(i)       这条路径的概率为
P ∗ = max ⁡ 1 ≤ i ≤ N δ T ( i ) P^*=\max_{1\le i \le N}\delta_T(i) P=1iNmaxδT(i)       最后便可以用 ψ t ( i ) \psi_t(i) ψt(i)回溯了,得到最优状态序列中前面各时刻的状态
i t ∗ = ψ t + 1 ( i t + 1 ∗ ) i_t^*=\psi_{t+1}(i_{t+1}^*) it=ψt+1(it+1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值