一、引言

HMM对于自然语言处理和语音识别等方面有着重大意义,其三个经典问题

  • 在已知序列的情况下推理出隐藏序列
  • 参数估计
  • 计算可能序列的边缘概率

在诸多文章中被提及,但是对于如何求解却很少提及!
本文主要通过一个简单的小例子说明如何在已知序列的情况下推理出隐藏序列

二、模型引入

1、为了模型的使用做如下假设

  • 观测序列和隐含序列有关系
  • 序列符合马尔科夫过程

2、模型图概览

HMM.png

3、分析

  • 隐含序列范围 :state ϵ \epsilon ϵ [a,b,c]
  • 观测序列范围 :observe $ \epsilon$ [1,2,3]

为了根据观测序列求出隐含的序列,必须求出三个参数,分别如下

  • 参数1: π \pi π

π \pi π:表示隐含序列每一位的为序列开头的概率,比如有4个序列
a,b,c
a,c,c
b,a,c
c,a,b
如序列a,b,c的初始概率 π = [ 2 4 , 1 4 , 1 4 ] = [ 0.5 , 0.25 , 0.25 ] \pi=[\frac{2}{4},\frac{1}{4},\frac{1}{4}]=[0.5,0.25,0.25] π=[42,41,41]=[0.5,0.25,0.25]

  • 参数2:隐含序列之间的转移概率矩阵 t r a n s P transP transP

仍以状态a,b,c的序列为例,a->a转移了0次,a->b转移了2次…

abc
a022
b101
c101

那么 t r a n s P transP transP为:

abc
a00.50.5
b0.500.5
c0.500.5
  • 参数3:隐含序列到观测序列的发射概率矩阵 e m i t P emitP emitP

如隐含序列和观测序列的对应关系如下:
a,b,c->1,2,3
a,c,c->1,3,2
b,a,c->2,2,3
c,a,b->1,1,2
a->1发射了3次,a->2发射了1次…

123
a310
b030
c112

那么 e m i t P emitP emitP为:

123
a0.750.250
b010
c0.250.250.5

到此为止模型的三个参数处理完毕,根据三个参数+维特比算法就可以根据输入值求出预测值,比如输入一个序列 2,1,1,那么需要计算的表格是

abc
2 p ( a ∥ 2 ) = π [ a ] ∗ e m i t P [ a ] [ 2 ] p(a\|2)=\pi[a]*emitP[a][2] p(a2)=π[a]emitP[a][2] p ( b ∥ 2 ) = π [ b ] ∗ e m i t P [ b ] [ 2 ] p(b\|2)=\pi[b]*emitP[b][2] p(b2)=π[b]emitP[b][2] p ( c ∥ 2 ) = π [ c ] ∗ e m i t P [ c ] [ 2 ] p(c\|2)=\pi[c]*emitP[c][2] p(c2)=π[c]emitP[c][2]
1 p ( a ∥ 1 ) = m a x ( t r a n s P [ a ] [ a ] ∗ e m i t P [ a ] [ 1 ] ∗ p ( a ∥ 2 ) , t r a n s P [ b ] [ a ] ∗ e m i t P [ a ] [ 1 ] ∗ p ( b ∥ 2 ) , t r a n s P [ c ] [ a ] ∗ e m i t P [ a ] [ 1 ] ∗ p ( c ∥ 2 ) ) p(a\|1)=max(transP[a][a]*emitP[a][1]*p(a\|2),transP[b][a]*emitP[a][1]*p(b\|2),transP[c][a]*emitP[a][1]*p(c\|2)) p(a1)=max(transP[a][a]emitP[a][1]p(a2),transP[b][a]emitP[a][1]p(b2),transP[c][a]emitP[a][1]p(c2))
1

在首行,根据初始概率和发射概率进行初始化
首先计算序列2,1,1的首位2的状态有可能是a,b,c的概率 p ( a ∣ 2 ) 、 p ( b ∣ 2 ) 、 p ( c ∣ 2 ) p(a|2)、p(b|2)、p(c|2) p(a2)p(b2)p(c2)
首位的影响因素为两个,一个是a,b,c分别为首的概率,一个是隐含状态a,b,c可能生成观测值1,2,3的概率,那么

p ( a ∣ 2 ) = p ( a 为 首 位 ) ∗ p ( a 发 射 程 2 ) p(a|2)=p(a为首位)*p(a发射程2) p(a2)=p(a)p(a2)

从第二行开始,使用发射概率和来自有状态转移的最大概率进行概率填充,并记录最大概率来自方状态确定路径,特别说明一下(以 p ( a ∣ 1 ) p(a|1) p(a1)为例):

p ( a ∣ 1 ) = M a x ( p(a|1)=Max( p(a1)=Max(
t r a n s P [ a ] [ a ] ∗ e m i t P [ a ] [ 1 ] ∗ p ( a ∣ 2 ) , transP[a][a]*emitP[a][1]*p(a|2), transP[a][a]emitP[a][1]p(a2),
t r a n s P [ b ] [ a ] ∗ e m i t P [ a ] [ 1 ] ∗ p ( b ∣ 2 ) , transP[b][a]*emitP[a][1]*p(b|2), transP[b][a]emitP[a][1]p(b2),
t r a n s P [ c ] [ a ] ∗ e m i t P [ a ] [ 1 ] ∗ p ( c ∣ 2 ) transP[c][a]*emitP[a][1]*p(c|2) transP[c][a]emitP[a][1]p(c2)
) ) )

p ( a ∣ 1 ) p(a|1) p(a1)表示在观测值为1的条件下隐含状态为a的概率,在此不仅要考虑a发射为1的概率,还要考虑上一个状态a,b,c转移为a的概率,基于动态规划的思想,确保局部路径最优,还要考虑上一个状态的最终概率

三、实战预测

  • 安装环境
pip install hmmlearn
  • 根据的方法计算模型参数
  • 导入hmmlearn
from hmmlearn import hmm
  • 模型求解
model=hmm.MultinomialHMM(n_components=隐含状态数量)
model.startprob_=startP
model.transmat_=tranP
model.emissionprob_=emitP
预测结果=model.predict(输入序列.reshape(-1,1))

本文如果有什么错误还望大神指正!

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐