隐马尔科夫模型

隐马尔科夫模型

隐马尔科夫模型(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|it1,ot1,...i1,o1)=p(it|it1) 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]NN 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 必须满足以下条件

0aij 0 ≤ a i j

Nj=1aij=1 ∑ j = 1 N a i j = 1

B 是观测概率矩阵 B=[bj(k)][NM] 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...aiT1iT 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...aiT1iTbiT(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+1ot+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=1Nj=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=1Nj=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=1Nj=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=1Nj=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=AijNj=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)=BjkMk=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=T1t=1ξ(i,j)T1t=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条件下,每个时刻最优可能出现的状态 it i t ∗

γt(i) γ t ( i ) 为给定模型 λ λ 与观察O,在t时刻处于状态 qi q i 的概率

那么: it=argmax1iN[γt(i)],t=1,2...T i t ∗ = a r g m a x 1 ≤ i ≤ N [ γ t ( i ) ] , t = 1 , 2... T

从而得到一个状态序列 I=(i1,i2...iT) 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,...it1 i 1 ∗ , . . . i t − 1 ∗

p(it+1=qj,ot+1,it=qi,ot,.....i1,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,.....i1,o1,λ)p(it=qi,ot...i1,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...i1,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...i1,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...i1,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...i1,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个序列为 i1,i2,...it1,it=qi i 1 ∗ , i 2 ∗ , . . . i t − 1 ∗ , i t = q i 。那么从初始点到t时刻状态为 qi q i 的最大序列为 i1,i2,...it1,it=qi i 1 ∗ , i 2 ∗ , . . . i t − 1 ∗ , i t = q i 。即如果一个序列是最佳序列,那么它的子序列也是一个最佳序列而后者只,是前者小一些规模的相同问题。

为了求解t+1时刻最佳序列,我们需要保证 bj(ot+1)aijp(it=qi,ot...i1,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)=max1iNδ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时刻每一个可能的状态的最大概率( aijbj(ot+1) a i j 与 b j ( o t + 1 ) ​ 只与模型有关,与时间无关),从而将问题的规模缩小,我们可以采用相同的策略将问题进一步缩小。从而可以采用递推的方式进行求解。

根据 δt+1(j)=max1iNδ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)=argmax1iNδt(i)aijbj(ot+1)=argmax1iNδ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)=max1iNδ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)=argmax1iNδt(i)aijbj(ot+1)=argmax1iNδ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=max1jNδT(i) p ∗ = m a x 1 ≤ j ≤ N δ T ( i ) iT=argmax1jNδ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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值