隐马尔科夫模型
隐马尔科夫模型(Hidden Markov Model(HMM))是可用于标注问题的统计学习模型,描述由隐藏的马尔科夫链随机生成观察序列的过程,属于生成模型,可以应用于语音识别,词性标注,音字转换,概率问题发等自然语言处理的各个应用。
本文的总结主要根据李航《统计机器学习方法》,隐马尔科夫模型内容,但对概率计算问题,做了更清楚的补充,从而使证明更易懂。而且对维特比算法做了更清晰的数学说明(独立推导和说明,个人认为比原书内容更清晰,欢迎批评指正) 。
基本概念
隐马尔科夫模型的定义
隐马尔可夫模型 :隐马尔科夫模型是关于时序的概率模型,描述一个由隐藏的马尔可夫链随机生成不可观察的状态的随机序列,再由各个状态生成一个观察而产生观测随机序列的过程。
状态序列(state sequence) :隐马尔科夫链随机生成的状态的序列
观测序列(observation sequence) :每个状态生成一个观察,而由此产生的观察的随机序列
序列每个位置看作一个时刻。
隐马尔科夫模型由初始概率分布,状态转移概率分布以及观测概率分布确定,形式如下:
状态集合 : Q=(q1,q2...qN) Q = ( q 1 , q 2 . . . q N ) , 观察集合 : V=(v1,v2...vM) V = ( v 1 , v 2 . . . v M )
N :可能的状态数 M 可能的观察数
状态序列 : I=(i1,i2....iT) I = ( i 1 , i 2 . . . . i T ) 观察序列 : O=(o1,o2...oT) O = ( o 1 , o 2 . . . o T )
隐马尔科夫模型的两个基本假设 :
1、齐次马尔科夫模型假设 (有限历时假设):隐藏的马尔科夫链在任意时刻t的状态只依赖于前一时刻的状态,与其他时刻的状态以及观测无关,也与t无关。
p(it|it−1,ot−1,...i1,o1)=p(it|it−1) p ( i t | i t − 1 , o t − 1 , . . . i 1 , o 1 ) = p ( i t | i t − 1 )
2、观察独立假设 :任意时刻的观测只依赖于该时刻的马儿可分链的状态,与其他观察及状态无关。
p(ot|iT,oT,...i1,o1)=p(ot|it) p ( o t | i T , o T , . . . i 1 , o 1 ) = p ( o t | i t )
3、时间不变性假设 :条件依赖不随时间改变而改变
根据上述假设,可以定义:
状态转移概率矩阵 : A=[aij]N∗N A = [ a i j ] N ∗ N ,其中 aij=p(it+1=qj|it=qi) a i j = p ( i t + 1 = q j | i t = q i )
t时刻处于状态 qi q i 的条件下在t+1转移到状态 qj q j 的概率
在马尔科夫模型中,状态转移概率 aij a i j 必须满足以下条件
0≤aij 0 ≤ a i j
∑Nj=1aij=1 ∑ j = 1 N a i j = 1
B 是观测概率矩阵 : B=[bj(k)][N∗M] B = [ b j ( k ) ] [ N ∗ M ] ,其中 bj(k) b j ( k ) 是在t时刻处于状态 qj q j 的条件下生成观察 vk v k 的概率。
π π :是初始状态概率向量 : πi π i t=1时刻处于状态 qi q i 的概率
隐马尔科夫模型由初始状态向量 π π ,状态转移概率矩阵 A A 和观察概率矩阵B决定,和A决定状态序列,B决定观察序列,因此隐马尔科夫模型可以用三元符号表示,即 λ=(A,B,π) λ = ( A , B , π )
隐马尔科夫可以用于标注,这时状态对应着标记,标注问题是给定观察序列预测器对应的标记序列。
隐马尔科夫模型的3个基本问题:
1、概率计算问题 :给定模型 λ=(A,B,π) λ = ( A , B , π ) 和观察序列 O=(o1,o2...oT) O = ( o 1 , o 2 . . . o T ) ,计算在模型 λ λ 下观察序列O出现的概率: P(o|λ) P ( o | λ ) .
2、学习问题 :已知观察序列 O=(o1,o2...oT) O = ( o 1 , o 2 . . . o T ) ,根据最大似然估计,估计模型参数,使得模型在 λ λ 下观察序列概率 p(O|λ) p ( O | λ ) 最大。
3、预测问题 :也称解码问题,已知模型 λ=(A,B,π) λ = ( A , B , π ) 和观察序列 O=(o1,o2...oT) O = ( o 1 , o 2 . . . o T ) ,求给定观察序列条件概率 P(I|O,λ) P ( I | O , λ ) 最大的状态序列 I=(i1,i2....iT) I = ( i 1 , i 2 . . . . i T ) 。
概率计算问题
1、直接计算法(暴力解法)
直接根据公式进行计算:
将公式展开,可以得到:
P(O|λ)=∑IP(I,O|λ)=∑IP(I|λ)P(O|I,λ) P ( O | λ ) = ∑ I P ( I , O | λ ) = ∑ I P ( I | λ ) P ( O | I , λ )
根据状态转移概率矩阵,状态序列 I=(i1,i2...iT) I = ( i 1 , i 2 . . . i T ) 的概率是
P(I|λ)=πi1ai1i2ai2i3...aiT−1iT P ( I | λ ) = π i 1 a i 1 i 2 a i 2 i 3 . . . a i T − 1 i T
固定状态序列 I=(i1,i2...iT) I = ( i 1 , i 2 . . . i T ) ,观察序列 O=(o1,o2...oT) O = ( o 1 , o 2 . . . o T ) 的概率为:
P(O|I,λ)=bi1(o1)bi2(o2)...biT(oT) P ( O | I , λ ) = b i 1 ( o 1 ) b i 2 ( o 2 ) . . . b i T ( o T )
将上边两式放到一起,最终得到:
P(O|λ)=∑IP(I|λ)P(O|I,λ)=∑i1,i2...iTπi1bi1(o1)ai1i2bi2(o2)ai2i3...aiT−1iTbiT(oT) P ( O | λ ) = ∑ I P ( 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 2 i 3 . . . a i T − 1 i T b i T ( o T )
利用上述公式计算量很大( O(NT) O ( N T ) ),实践上不可行。
下面介绍计算观察序列的有效算法:前向-后向算法(forward-backward algorithm)
前向算法
前向概率 :给定马尔科夫模型 λ λ ,定义到时刻t部分观察序列为 o1,o2...ot o 1 , o 2 . . . o t 且状态为 qi q i 的概率。
αt(i)=P(o1,o2,...ot,it=qi|λ) α t ( i ) = P ( o 1 , o 2 , . . . o t , i t = q i | λ )
前向算法采用递推方式求解:
初始值 : α1(i)=πibi(o1) α 1 ( i ) = π i b i ( o 1 ) 第一时刻观察到 o1 o 1 且第一时刻状态为 qi q i 的概率
递推公式 :对t=1,2…,T-1, αt+1(i)=[∑Nj=1αt(j)aji]bi(ot+1) α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) a j i ] b i ( o t + 1 )
递推式比较复杂,下面具体说明:
根据定义 αt(j) α t ( j ) 表示到t时刻,观察到 o1,o2...ot o 1 , o 2 . . . o t 且t时刻处于 qj q j 的概率
αt(j)aji α t ( j ) a j i 表示t时刻,观察到 o1,o2...ot o 1 , o 2 . . . o t 且t时刻处于 qj q j ,t+1时刻状态处于 qi q i 的概率
对t时刻所有可能的N个状态 qj q j 求和: [∑Nj=1αt(j)aji] [ ∑ j = 1 N α t ( j ) a j i ] 得到t时刻观察到 o1,o2...ot o 1 , o 2 . . . o t ,且t+1时刻状态处于 qi q i 的概率(如上图所示)
用上式乘上 bi(ot+1) b i ( o t + 1 ) 表示t时刻观察到 o1,o2...ot o 1 , o 2 . . . o t ,且t+1时刻状态处于 qi q i 的概率,且t+1时刻观察到 ot+1 o t + 1 时刻概率。
终止 : P(O|λ)=∑Ni=1αT(i) P ( O | λ ) = ∑ i = 1 N α T ( i )
将所有t+1时刻所有可能的状态相加得到:T时刻观察到 o1,o2...oT o 1 , o 2 . . . o T 的概率,即 P(O|λ)=∑Ni=1αT(i) P ( O | λ ) = ∑ i = 1 N α T ( i )
计算复杂度分析 :
前向算法高效的关键是局部计算前向概率,然后利用路径结构将前向概率递推到全局。
递推公式中,根据t时刻N个 αt(j) α t ( j ) ,计算t+1时刻 αt+1(i) α t + 1 ( i ) 主要计算量为 [∑Nj=1αt(j)aji] [ ∑ j = 1 N α t ( j ) a j i ] ,计算复杂度为N,为了计算 t+2 t + 2 时刻前向概率,需要t+1时刻所有可能的N个状态,因此每个时间点总的时间复杂度为 O(N2) O ( N 2 ) ,所以该算法总的时间复杂度为 O(TN2) O ( T N 2 ) 。
后向算法
后向概率 :给定马尔科夫模型 λ λ ,定义t时刻状态为 qi q i 的条件下,从t+1时刻到T部分观察序列为 ot+1,ot+1,...oT o t + 1 , o t + 1 , . . . o T 的概率。
初始值 : βT(i)=1 β T ( i ) = 1 ,T时刻之后没有观察序列,定义为1
递推公式 :对t =T-1,T-2,…,1 βt(i)=∑Nj=1aijbj(ot+1)βt+1(j) β t ( i ) = ∑ j = 1 N a i j b j ( o t + 1 ) β t + 1 ( j )
(统计学习方法中给的说明比较简略,这里采用公式证明说明)
根据定义:
βt(i)=p(ot+1,ot+2,...oT|it=qi,λ) β t ( i ) = p ( o t + 1 , o t + 2 , . . . o T | i t = q i , λ )
=∑Nj=1p(ot+1,ot+2,...oT,it+1=qj|it=qi,λ) = ∑ j = 1 N p ( o t + 1 , o t + 2 , . . . o T , i t + 1 = q j | i t = q i , λ )
=∑Nj=1p(ot+1,ot+2,...oT|it+1=qj,it=qi,λ).p(it+1=qj|it=qi,λ) = ∑ j = 1 N p ( o t + 1 , o t + 2 , . . . o T | i t + 1 = q j , i t = q i , λ ) . p ( i t + 1 = q j | i t = q i , λ )
根据其次假设,可将上式简化为:
=∑Nj=1p(ot+1,ot+2,...oT|it+1=qj,λ)aij = ∑ j = 1 N p ( o t + 1 , o t + 2 , . . . o T | i t + 1 = q j , λ ) a i j
根据概率乘法公式:
=∑Nj=1p(ot+1|ot+2....oT,it+1=qj,λ)p(ot+2,ot+3,...oT|it+1=qj,λ)aij = ∑ j = 1 N p ( o t + 1 | o t + 2 . . . . o T , i t + 1 = q j , λ ) p ( o t + 2 , o t + 3 , . . . o T | i t + 1 = q j , λ ) a i j
根据其次假设 ot+1与ot+2...oT o t + 1 与 o t + 2 . . . o T 无关,可以得到:
=∑Nj=1p(ot+1|it+1=qj,λ)p(ot+2,ot+3,...oT|it+1=qj,λ)aij = ∑ j = 1 N p ( o t + 1 | i t + 1 = q j , λ ) p ( o t + 2 , o t + 3 , . . . o T | i t + 1 = q j , λ ) a i j
=∑Nj=1bj(ot+1)p(ot+2,ot+3,...oT|it+1=qj,λ)aij = ∑ j = 1 N b j ( o t + 1 ) p ( o t + 2 , o t + 3 , . . . o T | i t + 1 = q j , λ ) a i j
=∑Nj=1bj(ot+1)βt+1(j)aij = ∑ j = 1 N b j ( o t + 1 ) β t + 1 ( j ) a i j
从而得证。
终止式 : P(O|λ) P ( O | λ ) 可以理解为t=1时刻的后向概率之和,从而有:
P(O|λ)=∑Ni=1πibi(o1)β1(i) P ( O | λ ) = ∑ i = 1 N π i b i ( o 1 ) β 1 ( i )
利用前向概率和后向概率的定义可以一起观察序列概率 p(O|λ) p ( O | λ ) :
P(O|λ)=P(o1,o2...oT|λ)=∑Ni=1∑Nj=1P(o1,o2...oT,it=qi,it+1=qj|λ) P ( O | λ ) = P ( o 1 , o 2 . . . o T | λ ) = ∑ i = 1 N ∑ j = 1 N P ( o 1 , o 2 . . . o T , i t = q i , i t + 1 = q j | λ )
P(o1,o2...oT,it=qi,it+1=qj|λ) P ( o 1 , o 2 . . . o T , i t = q i , i t + 1 = q j | λ )
=P(ot+1,ot+2,..oT,it+1=qj|o1,o2,...ot,it=qi,λ)P(o1,o2...ot,it=qi|λ) = P ( o t + 1 , o t + 2 , . . o T , i t + 1 = q j | o 1 , o 2 , . . . o t , i t = q i , λ ) P ( o 1 , o 2 . . . o t , i t = q i | λ )
=P(ot+1,ot+2,..oT,it+1=qj|it=qi,λ)αt(i) = P ( o t + 1 , o t + 2 , . . o T , i t + 1 = q j | i t = q i , λ ) α t ( i ) =P(ot+2,..oT|ot+1,it=qi,it+1=qj,λ)P(it+1=qj,ot+1|it=qi)αt(i) = P ( o t + 2 , . . o T | o t + 1 , i t = q i , i t + 1 = q j , λ ) P ( i t + 1 = q j , o t + 1 | i t = q i ) α t ( i )
=P(ot+2,..oT|it+1=qj,λ)P(ot+1|it+1=qj,it=qi)P(it+1=qj|it=qi)αt(i) = P ( o t + 2 , . . o T | i t + 1 = q j , λ ) P ( o t + 1 | i t + 1 = q j , i t = q i ) P ( i t + 1 = q j | i t = q i ) α t ( i )
=P(ot+2,..oT|it+1=qj,λ)P(ot+1|it+1=qj)P(it+1=qj|it=qi)αt(i) = P ( o t + 2 , . . o T | i t + 1 = q j , λ ) P ( o t + 1 | i t + 1 = q j ) P ( i t + 1 = q j | i t = q i ) α t ( i )
=βt+1(j)bj(ot+1)aijαt(i) = β t + 1 ( j ) b j ( o t + 1 ) a i j α t ( i )
从而可以得到: P(O|λ)=∑Ni=1∑Nj=1βt+1(j)bj(ot+1)aijαt(i) P ( O | λ ) = ∑ i = 1 N ∑ j = 1 N β t + 1 ( j ) b j ( o t + 1 ) a i j α t ( i )
一些概率与期望值的计算
1、给定模型 λ λ 与观察O,在t时刻处于状态 qi q i 的概率,记为:
γt(i)=P(it=qi|O,λ)=P(it=qi,O|λ)P(O|λ) γ t ( i ) = P ( i t = q i | O , λ ) = P ( i t = q i , O | λ ) P ( O | λ )
P(it=qi,O|λ)=P(o1,o2...oT,it=qi|λ) P ( i t = q i , O | λ ) = P ( o 1 , o 2 . . . o T , i t = q i | λ )
=P(ot+1,ot+2,...oT|o1,o2,...ot,it=qi,λ)P(o1,o2...ot,it=qi|λ) = P ( o t + 1 , o t + 2 , . . . o T | o 1 , o 2 , . . . o t , i t = q i , λ ) P ( o 1 , o 2 . . . o t , i t = q i | λ )
=P(ot+1,ot+2,...oT|it=qi,λ)P(o1,o2...ot,it=qi|λ) = P ( o t + 1 , o t + 2 , . . . o T | i t = q i , λ ) P ( o 1 , o 2 . . . o t , i t = q i | λ )
= αt(i)βt(i) α t ( i ) β t ( i )
γt(i)=αt(i)βt(i)∑Nj=1αt(i)βt(i) γ t ( i ) = α t ( i ) β t ( i ) ∑ j = 1 N α t ( i ) β t ( i )
2、给定模型 λ λ 与观察O,在t时刻处于状态 qi q i ,且t+1时刻处于 qj q j 的概率:
ξ(i,j)=P(it=qi,it+1=qj|O,λ)=P(it=qi,it+1=qjO|λ)∑Ni=1∑Nj=1P(it=qi,it+1=qjO|λ) ξ ( i , j ) = P ( i t = q i , i t + 1 = q j | O , λ ) = P ( i t = q i , i t + 1 = q j O | λ ) ∑ i = 1 N ∑ j = 1 N P ( i t = q i , i t + 1 = q j O | λ )
P(it=qi,it+1=qjO|λ)=βt+1(j)bj(ot+1)aijαt(i) P ( i t = q i , i t + 1 = q j O | λ ) = β t + 1 ( j ) b j ( o t + 1 ) a i j α t ( i )
从而有 ξ(i,j)=βt+1(j)bj(ot+1)aijαt(i)∑Ni=1∑Nj=1βt+1(j)bj(ot+1)aijαt(i) ξ ( i , j ) = β t + 1 ( j ) b j ( o t + 1 ) a i j α t ( i ) ∑ i = 1 N ∑ j = 1 N β t + 1 ( j ) b j ( o t + 1 ) a i j α t ( i )
学习算法
隐马尔科夫模型的学习,根据训练数据是包括观察序列和对应的状态序列还是只有观察序列,可分为监督学习和非监督学习,本节首先介绍监督学习,然后介绍非监督学习算法(Baum-Welch算法)
监督学习算法
假设已给训练数据包含S个长度相同的观察序列和对应的状态序列(比如词性标注中对应的词和词性){ (O1,I1),(O2,I2)...(OS,IS) ( O 1 , I 1 ) , ( O 2 , I 2 ) . . . ( O S , I S ) },那么可以利用极大似然估计算法来估计隐马尔科夫模型的参数。具体估计如下:
1、转移概率 aij a i j 的估计,样本中t时刻处于 qi q i 条件下,t+1时刻处于 qj q j 所占百分比
样本中t时刻处于 qi q i ,t+1时刻处于 qj q j 的频数为 Aij A i j ,
那么 a^ij=Aij∑Nj=1Aij a ^ i j = A i j ∑ j = 1 N A i j
2、观察概率 bj(k) b j ( k ) 的估计,状态为 qj q j 时,观测状态为 vk v k 所占百分比
样本中状态为 qj q j 且观察状态为 vk v k 的频数为 Bjk B j k ,
那么 b^j(k)=Bjk∑Mk=1Bjk b ^ j ( k ) = B j k ∑ k = 1 M B j k
3、初始状态概率 πi π i 的估计 π^ π ^ 为S个样本中初始状态为 qi q i 的概率。
非监督学习算法:Baum-Welch算法
假设给定训练数据只包含S个长度为T的观察序列{ O1,O2...OS O 1 , O 2 . . . O S },而没有对应的状态。将观察序列数据看作观察数据O,状态序列看作不客管处的因数据I,那么隐马尔科夫模型事实上是一个含有隐变量的概率模型。
P(O|λ)=∑IP(O|I,λ)P(I|λ) P ( O | λ ) = ∑ I P ( O | I , λ ) P ( I | λ )
参数学习可以通过EM算法实现。EM算法的推导比较复杂,这里就不再做说明,具体可以参考《统计机器学习方法》隐马尔科夫模型Baum-Welch算法部分,这里只给出参数估计形式。
Baum-welch模型参数估计形式
aij=∑T−1t=1ξ(i,j)∑T−1t=1γt(i) a i j = ∑ t = 1 T − 1 ξ ( i , j ) ∑ t = 1 T − 1 γ t ( i )
bj(k)=∑t=1,ot=vkγt(i)∑t=1γt(i) b j ( k ) = ∑ t = 1 , o t = v k γ t ( i ) ∑ t = 1 γ t ( i )
πi=γ1(i) π i = γ 1 ( i )
预测算法
预测问题是在给定观察序列O和模型 λ λ 的条件下,找到概率最大的状态序列 I∗ I ∗ 的问题
数学表述为 I∗=argmaxIP(I|O,λ) I ∗ = a r g m a x I P ( I | O , λ )
近似算法
近似算法是为判别模型,采取贪心策略在给定模型和观察序列O条件下,每个时刻最优可能出现的状态 i∗t i t ∗ ,
γt(i) γ t ( i ) 为给定模型 λ λ 与观察O,在t时刻处于状态 qi q i 的概率
那么: i∗t=argmax1≤i≤N[γt(i)],t=1,2...T i t ∗ = a r g m a x 1 ≤ i ≤ N [ γ t ( i ) ] , t = 1 , 2... T
从而得到一个状态序列 I∗=(i∗1,i∗2...i∗T) I ∗ = ( i 1 ∗ , i 2 ∗ . . . i T ∗ )
优点 :计算简单
缺点 : 贪心策略无法保证最优解
维特比算法
给定模型 λ λ 和观测序列O,求取最大的状态序列,数学上可以表示为: I∗=argmaxIP(I|O,λ) I ∗ = a r g m a x I P ( I | O , λ ) ,但上式不容易求解。维特比算法采用概率生成模型,根据贝叶斯公式, P(I|O,λ)=P(I,O|λ)P(O|λ) P ( I | O , λ ) = P ( I , O | λ ) P ( O | λ ) ,由于状态序列I与观察序列O无关,因此 I∗=argmaxIP(I|O,λ)=argmaxIP(I,O|λ) I ∗ = a r g m a x I P ( I | O , λ ) = a r g m a x I P ( I , O | λ ) :
即在给定模型参数 λ λ 下,求解最大的联合概率对应的序列。
首先我们来分析t+1时刻与t时刻最佳序列之间的关系:
假设从初始到t+1时刻状态为 qj q j 最佳序列中,t时刻状态分别为 qi q i ,之前序列使用 i1∗,...i∗t−1 i 1 ∗ , . . . i t − 1 ∗
p(it+1=qj,ot+1,it=qi,ot,.....i∗1,o1|λ) p ( i t + 1 = q j , o t + 1 , i t = q i , o t , . . . . . i 1 ∗ , o 1 | λ )
=p(it+1=qj,ot+1|it=qi,ot,.....i∗1,o1,λ)p(it=qi,ot...i∗1,o1|λ) = p ( i t + 1 = q j , o t + 1 | i t = q i , o t , . . . . . i 1 ∗ , o 1 , λ ) p ( i t = q i , o t . . . i 1 ∗ , o 1 | λ )
=p(it+1=qj,ot+1|it=qi,λ)p(it=qi,ot...i∗1,o1|λ) = p ( i t + 1 = q j , o t + 1 | i t = q i , λ ) p ( i t = q i , o t . . . i 1 ∗ , o 1 | λ )
=p(ot+1|it+1=qj,it=qi,λ)p(it+1=qj|it=qi,λ)p(it=qi,ot...i∗1,o1|λ) = p ( o t + 1 | i t + 1 = q j , i t = q i , λ ) p ( i t + 1 = q j | i t = q i , λ ) p ( i t = q i , o t . . . i 1 ∗ , o 1 | λ )
=p(ot+1|it+1=qj,λ)p(it+1=qj|it=qi,λ)p(it=qi,ot...i∗1,o1|λ) = p ( o t + 1 | i t + 1 = q j , λ ) p ( i t + 1 = q j | i t = q i , λ ) p ( i t = q i , o t . . . i 1 ∗ , o 1 | λ )
=bj(ot+1)aijp(it=qi,ot...i∗1,o1|λ) = b j ( o t + 1 ) a i j p ( i t = q i , o t . . . i 1 ∗ , o 1 | λ )
分析上式,如果i,j确定,那么 bj(ot+1) b j ( o t + 1 ) 与 aij a i j 也确定,
因此,如果初始点到t+1时刻状态为 qj q j 的最佳序列中前t个序列为 i∗1,i∗2,...i∗t−1,it=qi i 1 ∗ , i 2 ∗ , . . . i t − 1 ∗ , i t = q i 。那么从初始点到t时刻状态为 qi q i 的最大序列为 i∗1,i∗2,...i∗t−1,it=qi i 1 ∗ , i 2 ∗ , . . . i t − 1 ∗ , i t = q i 。即如果一个序列是最佳序列,那么它的子序列也是一个最佳序列而后者只,是前者小一些规模的相同问题。
为了求解t+1时刻最佳序列,我们需要保证 bj(ot+1)aijp(it=qi,ot...i∗1,o1|λ) b j ( o t + 1 ) a i j p ( i t = q i , o t . . . i 1 ∗ , o 1 | λ ) 最大,
因此如果我们t时刻,状态为 qi q i 的最大概率为 δt(i) δ t ( i ) ,
那么t+1时刻状态为 qj q j 的最大概率 δt+1(j)=max1≤i≤Nδt(i)aijbj(ot+1) δ t + 1 ( j ) = m a x 1 ≤ i ≤ N δ t ( i ) a i j b j ( o t + 1 ) .
为了求得t+1时刻状态为 qj q j 的最大概率,我们只需要t时刻每一个可能的状态的最大概率( aij与bj(ot+1) a i j 与 b j ( o t + 1 ) 只与模型有关,与时间无关),从而将问题的规模缩小,我们可以采用相同的策略将问题进一步缩小。从而可以采用递推的方式进行求解。
根据 δt+1(j)=max1≤i≤Nδt(i)aijbj(ot+1) δ t + 1 ( j ) = m a x 1 ≤ i ≤ N δ t ( i ) a i j b j ( o t + 1 ) ,我们也可以确定t+1时刻状态为 qj q j 的最佳序列对应的t时刻的状态。
定义 ϕt(j)=argmax1≤i≤Nδt(i)aijbj(ot+1)=argmax1≤i≤Nδt(i)aij ϕ t ( j ) = a r g m a x 1 ≤ i ≤ N δ t ( i ) a i j b j ( o t + 1 ) = a r g m a x 1 ≤ i ≤ N δ t ( i ) a i j 为t+1时刻状态为 qj q j 的最佳序列对应的t时刻的状态。
初始值 :t=1时刻,状态为 qi q i ,观测序列为 o1 o 1 的最大概率为 δ1(i)=πibi(o1) δ 1 ( i ) = π i b i ( o 1 ) , ϕ0=0 ϕ 0 = 0
递推公式 :
δt+1(j)=max1≤i≤Nδt(i)aijbj(ot+1) δ t + 1 ( j ) = m a x 1 ≤ i ≤ N δ t ( i ) a i j b j ( o t + 1 )
ϕt(j)=argmax1≤i≤Nδt(i)aijbj(ot+1)=argmax1≤i≤Nδt(i)aij ϕ t ( j ) = a r g m a x 1 ≤ i ≤ N δ t ( i ) a i j b j ( o t + 1 ) = a r g m a x 1 ≤ i ≤ N δ t ( i ) a i j
终止式 : p∗=max1≤j≤NδT(i) p ∗ = m a x 1 ≤ j ≤ N δ T ( i ) i∗T=argmax1≤j≤NδT(i) i T ∗ = a r g m a x 1 ≤ j ≤ N δ T ( i )
维特比算法的python实现
import numpy as np
def Virtebi(A,B,pi,O):
# A :状态转移概率矩阵
# B :观察状态概率矩阵
# pi :初始状态概率矩阵
# O :观测序列
assert A.shape[0]==A.shape[1]==B.shape[0]==pi.shape[0]
n = A.shape[0]
m = B.shape[1]
T = O.shape[0]
opt_state= np.zeros(T)
delta = np.zeros([T,n])
phi = np.zeros([T,n])
# 存储 delta_j*a_ji
adelta = np.zeros([n,n])
# 初始化 delta(i) = pi(i)b_i(O[0])
delta[0] =np.multiply(pi,B[:,O[0]])
# 递推
for t in range(1,T):
adelta = np.multiply(delta[t-1][:,np.newaxis],A)
delta[t] = np.max(np.multiply(adelta,B[:,O[t]]),axis=0)
phi[t-1] = np.argmax(adelta,axis=0)
phi[T-1] = np.argmax(delta[T-1],axis=0)
# 终止
p = np.max(delta[T-1])
opt_state[T-1] = np.argmax(delta[T-1])
#回溯
for t in range(T-2,-1,-1):
opt_state[t] = phi[t+1][np.int(opt_state[t+1])]
return (p,opt_state)
def test_Virtebi():
#状态转移概率矩阵
A = np.array([[0.5,0.2,0.3],[0.3,0.5,0.2],[0.2,0.3,0.5]])
#观测概率矩阵
B = np.array([[0.5,0.5],[0.4,0.6],[0.7,0.3]])
#初始概率矩阵
pi = np.array([0.2,0.4,0.4])
#观测序列
O = np.array([0,1,0])
p,opt_state = Virtebi(A,B,pi,O)
print('最佳序列 :',opt_state)
print('序列最大概率 :',p)
test_Virtebi()
最佳序列 : [ 2. 2. 2.]
序列最大概率 : 0.0147