1.问题描述

  隐马尔可夫模型(HMM)的解码问题指,给定模型和输出序列,如何找出最有可能产生这个输出的状态序列。自然语言处理中,也即如何通过观测信号确定最有可能对应的实际语义。在状态序列上,每个状态位是状态集合中的元素之一,因此该问题等价于在状态集合中的节点构成的有向网络(篱笆网络)中找出一条概率最大的路径(最优路径),如图。该问题可以通过维特比算法得到高效的解决。

2.算法叙述

  假设 P(st,j)P(s_{t,j})P(st,j​)表示从起始时刻到st,js_{t,j}st,j​的最优路径的概率,Pre(st,j)Pre(s_{t,j})Pre(st,j​)表示从起始时刻到 st,js_{t,j}st,j​的最优路径上前一个节点,则隐马尔可夫模型的维特比解码算法为:

输入:隐马尔可夫模型 λ=(π,A,B)\lambda=(\pi,A,B)λ=(π,A,B)和观测 O=(o1,o2,...,oT)O=(o_1,o_2,...,o_T)O=(o1​,o2​,...,oT​);
输出:最优状态序列S∗=(s1∗,s2∗,...,sT∗)S^{\ast}=(s_{1}^{\ast},s_{2}^{\ast},...,s_{T}^{\ast})S∗=(s1∗​,s2∗​,...,sT∗​).
(1)初始化
    P(s1,j)=πjbj(o1)P(s_{1,j})=\pi_{j}b_{j}(o_1)P(s1,j​)=πj​bj​(o1​),
    Pre(s1,j)=NonePre(s_{1,j})=NonePre(s1,j​)=None,j=1,2,...,Nj=1,2,...,Nj=1,2,...,N

(2)递推
 对 t=2,3,...,Tt=2,3,...,Tt=2,3,...,T
P(st,j)=max⁡1≤k≤N[P(st−1,k)akj]bj(ot)P(s_{t,j})=\max_{1\leq k \leq N}{\left[ P(s_{t-1,k})a_{kj} \right]b_{j}(o_t)}P(st,j​)=1≤k≤Nmax​[P(st−1,k​)akj​]bj​(ot​)
Pre(st,j)=argmax⁡1≤k≤N[P(st−1,k)akj]Pre(s_{t,j})=arg\max_{1\leq k \leq N}{\left[ P(s_{t-1,k})a_{kj} \right]}Pre(st,j​)=arg1≤k≤Nmax​[P(st−1,k​)akj​],j=1,2,...,Nj=1,2,...,Nj=1,2,...,N.

(3)递推终止
 最大概率P∗=max⁡1≤j≤NP(sT,j)P^{\ast}=\max_{1\leq j \leq N}{P(s_{T,j})}P∗=1≤j≤Nmax​P(sT,j​)
 最优路径上的最后一个状态sT∗=argmax⁡1≤j≤N[P(sT,j)]s_{T}^{\ast}=arg\max_{1\leq j \leq N}{\left[ P(s_{T,j}) \right]}sT∗​=arg1≤j≤Nmax​[P(sT,j​)]

(4)回溯路径,确定最优状态序列
    S∗=(s1∗,s2∗,...,sT−1∗,sT∗)S^{\ast}=\left( s_{1}^{\ast},s_{2}^{\ast},...,s_{T-1}^{\ast},s_{T}^{\ast} \right)S∗=(s1∗​,s2∗​,...,sT−1∗​,sT∗​)
     =(Pre(s2∗),Pre(s3∗),...,Pre(sT∗),sT∗)=\left( Pre(s_{2}^{\ast}),Pre(s_{3}^{\ast}), ...,Pre(s_{T}^{\ast}),s_{T}^{\ast}\right)=(Pre(s2∗​),Pre(s3∗​),...,Pre(sT∗​),sT∗​)

3.示例

(参考自《统计学习方法》)
状态集合 Q={q1,q2,q3}Q=\left\{ q_1, q_2, q_3 \right\}Q={q1​,q2​,q3​},观测集合V={0,1}V=\left\{ 0,1 \right\}V={0,1},模型 λ=(π,A,B)\lambda=\left( \pi,A,B \right)λ=(π,A,B) ,

A=[0.50.20.30.30.50.20.20.30.5]A=\begin{bmatrix} 0.5 & 0.2 & 0.3 \\ 0.3 & 0.5 & 0.2 \\ 0.2 & 0.3 & 0.5 \\ \end{bmatrix}A=⎣⎡​0.50.30.2​0.20.50.3​0.30.20.5​⎦⎤​ , B=[0.50.50.40.60.70.3]B=\begin{bmatrix} 0.5 & 0.5 \\ 0.4 & 0.6 \\ 0.7 & 0.3 \end{bmatrix}B=⎣⎡​0.50.40.7​0.50.60.3​⎦⎤​,π=(0.2,0.4,0.4)T\pi=\left( 0.2, 0.4, 0.4 \right)^{T}π=(0.2,0.4,0.4)T

已知观测序列O=(0,1,0)O=\left( 0, 1, 0 \right)O=(0,1,0),求最优状态序列。

解:
(1)在t=1时(初始化),对每一个状态,求观测为0的最大概率
 P(s1,1)=0.2×0.5=0.1P(s_{1,1})=0.2\times0.5=0.1P(s1,1​)=0.2×0.5=0.1,Pre(s1,1)=NonePre(s_{1,1})=NonePre(s1,1​)=None
 P(s1,2)=0.4×0.4=0.16P(s_{1,2})=0.4\times0.4=0.16P(s1,2​)=0.4×0.4=0.16,Pre(s1,2)=NonePre(s_{1,2})=NonePre(s1,2​)=None
 P(s1,3)=0.4×0.7=0.28P(s_{1,3})=0.4\times0.7=0.28P(s1,3​)=0.4×0.7=0.28,Pre(s1,3)=NonePre(s_{1,3})=NonePre(s1,3​)=None

(2)在t=2时,对每一个状态,求观测为1的
 最大概率P(s2,j)=max⁡1≤k≤3[P(s1,k)akj]bj(1)P(s_{2,j})=\max_{1 \leq k \leq 3}{\left[ P(s_{1,k})a_{kj} \right]b_{j}(1)}P(s2,j​)=1≤k≤3max​[P(s1,k​)akj​]bj​(1)
 当前最优的前一个状态Pre(s2,j)=argmax⁡1≤k≤3[P(s1,k)akj]Pre(s_{2,j})=arg\max_{1 \leq k \leq 3}{\left[ P(s_{1,k})a_{kj} \right]}Pre(s2,j​)=arg1≤k≤3max​[P(s1,k​)akj​],j=1,2,3.j=1,2,3.j=1,2,3.
P(s2,1)=max{0.1×0.5×0.5,0.16×0.3×0.5,0.28×0.2×0.5}P(s_{2,1})=max\left\{ 0.1\times0.5\times0.5, 0.16\times0.3\times0.5, 0.28\times0.2\times0.5 \right\}P(s2,1​)=max{0.1×0.5×0.5,0.16×0.3×0.5,0.28×0.2×0.5}=0.028=0.028=0.028

Pre(s2,1)=s1,3=q3Pre(s_{2,1})=s_{1,3}=q_3Pre(s2,1​)=s1,3​=q3​

P(s2,2)=max{0.1×0.2×0.6,0.16×0.5×0.6,0.28×0.3×0.6}P(s_{2,2})=max\left\{ 0.1\times0.2\times0.6,0.16\times0.5\times0.6,0.28\times0.3\times0.6 \right\}P(s2,2​)=max{0.1×0.2×0.6,0.16×0.5×0.6,0.28×0.3×0.6}=0.0504=0.0504=0.0504

Pre(s2,2)=s1,3=q3Pre(s_{2,2})=s_{1,3}=q_3Pre(s2,2​)=s1,3​=q3​

P(s2,3)=max{0.1×0.3×0.3,0.16×0.2×0.3,0.28×0.5×0.3}P(s_{2,3})=max\left\{ 0.1\times0.3\times0.3, 0.16\times0.2\times0.3,0.28\times0.5\times0.3 \right\}P(s2,3​)=max{0.1×0.3×0.3,0.16×0.2×0.3,0.28×0.5×0.3}=0.042=0.042=0.042

Pre(s2,3)=s1,3=q3Pre(s_{2,3})=s_{1,3}=q_3Pre(s2,3​)=s1,3​=q3​

(3)在t=3时,对每一个状态,求观测为0的
 最大概率 P(s3,j)=max⁡1≤k≤3[P(s2,k)akj]bj(0)P(s_{3,j})=\max_{1 \leq k \leq 3}{\left[ P(s_{2,k})a_{kj} \right]b_{j}(0)}P(s3,j​)=1≤k≤3max​[P(s2,k​)akj​]bj​(0)
 当前最优的前一个状态Pre(s3,j)=argmax⁡1≤k≤3[P(s2,k)akj]Pre(s_{3,j})=arg\max_{1 \leq k \leq 3}\left[ P(s_{2,k})a_{kj} \right]Pre(s3,j​)=arg1≤k≤3max​[P(s2,k​)akj​],j=1,2,3.j=1,2,3.j=1,2,3.

P(s3,1)=max{0.028×0.5×0.5,0.0504×0.3×0.5,0.042×0.2×0.5}P(s_{3,1})=max\left\{ 0.028\times0.5\times0.5, 0.0504\times0.3\times0.5,0.042\times0.2\times0.5 \right\}P(s3,1​)=max{0.028×0.5×0.5,0.0504×0.3×0.5,0.042×0.2×0.5}=0.00756=0.00756=0.00756

Pre(s3,1)=s2,2=q2Pre(s_{3,1})=s_{2,2}=q_2Pre(s3,1​)=s2,2​=q2​

P(s3,2)=max{0.028×0.2×0.4,0.0504×0.5×0.4,0.042×0.3×0.4}P(s_{3,2})=max\left\{ 0.028\times0.2\times0.4, 0.0504\times0.5\times0.4, 0.042\times0.3\times0.4 \right\}P(s3,2​)=max{0.028×0.2×0.4,0.0504×0.5×0.4,0.042×0.3×0.4}=0.01008=0.01008=0.01008

Pre(s3,2)=s2,2=q2Pre(s_{3,2})=s_{2,2}=q_2Pre(s3,2​)=s2,2​=q2​

P(s3,3)=max{0.028×0.3×0.7,0.0504×0.2×0.7,0.042×0.5×0.7}P(s_{3,3})=max\left\{ 0.028\times0.3\times0.7,0.0504\times0.2\times0.7,0.042\times0.5\times0.7 \right\}P(s3,3​)=max{0.028×0.3×0.7,0.0504×0.2×0.7,0.042×0.5×0.7}=0.0147=0.0147=0.0147

Pre(s3,3)=s2,3=q3Pre(s_{3,3})=s_{2,3}=q_3Pre(s3,3​)=s2,3​=q3​

(4)得到结果.
 最大概率
  P∗=max⁡1≤j≤3P(s3,j)P^{\ast}=\max_{1 \leq j \leq 3}P\left( s_{3,j} \right)P∗=max1≤j≤3​P(s3,j​)
   =max{0.00756,0.01008,0.0147}=max\left\{ 0.00756,0.01008,0.0147 \right\}=max{0.00756,0.01008,0.0147}
   =0.0147=0.0147=0.0147
 最优状态序列
  S∗=(Pre(s2∗)t,Pre(s3∗),s3∗)S^{\ast}=\left( Pre(s_{2}^{\ast})t,Pre(s_{3}^{\ast}),s_{3}^{\ast} \right)S∗=(Pre(s2∗​)t,Pre(s3∗​),s3∗​)
   =(s1,3,s2,3,s3,3)=\left( s_{1,3},s_{2,3},s_{3,3} \right)=(s1,3​,s2,3​,s3,3​)
   =(q3,q3,q3)=\left( q_3,q_3,q_3 \right)=(q3​,q3​,q3​)

4.python实现

对上述HMM维特比解码示例的python实现程序为

import numpy as npdef viterbi(pi, A, B, Q, V, obs_seq):''':param pi:HMM初始状态概率向量,list类型:param A:HMM状态转移概率矩阵,list类型:param B:HMM观测生成概率矩阵,list类型:param Q:状态集合,list类型:param V:观测集合,list类型:param obs_seq:观测序列,list类型:return:最优状态序列的概率sta_pro,float类型;最优状态序列sta_seq,list类型'''# HMM模型参数转换为array类型pi = np.array(pi)A = np.array(A)B = np.array(B)# 1.定义动态计算结果存储矩阵rowNum = len(Q)  # 行数,状态数colNum = len(obs_seq)  # 列数,生成的观测数,即时刻数# 存储节点当前最大概率的矩阵probaMatrix = np.zeros((rowNum,colNum))# 存储当前最优路径下的前一个节点的矩阵preNodeMatrix = np.zeros((rowNum,colNum))# 2.初始化(第1时刻)probaMatrix[:,0] = pi*np.transpose(B[:,obs_seq[0]])preNodeMatrix[:,0] = [-1]*rowNum  # 第1时刻节点的前一个节点不存在,置为-1# 3.递推,第2时刻至最后for t in range(1, colNum):list_pre_max_proba = []  # 节点最大前置概率列表list_pre_node = []  # 节点当前最优路径中前一个节点列表for j in range(rowNum):pre_proba_list = list(np.array(probaMatrix[:,t-1])*np.transpose(A[:,j]))  # 前置概率列表,前一时刻的节点最大概率与到当前节点转移概率的乘积'''注:因为计算机的二进制机制对小数的表达是有限的,所以对小数作运算将产生一定的误差。在使用函数获取pre_proba_list中的最大值和对应的索引时,为有效降低这种误差,将数据放大后再进行操作。'''pre_proba_list = [x*pow(10,5) for x in pre_proba_list]  # 放大100000倍prePro = max(pre_proba_list)/pow(10,5)  # 最大前置概率preNodeIndexNum = pre_proba_list.index(max(pre_proba_list))  # 前置节点的索引号list_pre_max_proba.append(prePro)  # 最大前置概率加入列表list_pre_node.append(preNodeIndexNum)  # 前置节点的索引号加入列表probaMatrix[:,t] = np.array(list_pre_max_proba)*np.transpose(B[:,obs_seq[t]])  # 最大前置概率乘上观测概率,即为当前最大概率preNodeMatrix[:,t] = list_pre_node  # 将该列前置节点索引号加入矩阵# 此时,得到了完整的probaMatrix和preNodeMatrix,对这两个矩阵进行操作便可得到需要的结果# 4.得到最大概率maxPro = np.max(probaMatrix[:, colNum-1])  # 全局最大概率(即最后一列的最大值)# 5.得到最优状态序列的状态索引号列表lastStateIndexNum = np.argmax(probaMatrix[:, colNum-1])  # 最优状态序列中最后一个状态的索引号stateIndexList = []  # 定义最优状态的索引号列表stateIndexList.append(lastStateIndexNum)# 回溯,完成状态索引号列表currentIndex = lastStateIndexNum;for t in range(colNum-1, 0, -1):fls = preNodeMatrix[:, t].tolist()  # 矩阵中的数值是浮点型ls = list(map(int, fls))  # 转为整型currentIndex = ls[currentIndex]stateIndexList.append(currentIndex)stateIndexList.reverse()  # 反转列表# 6.由索引号序列得到最优状态序列stateSeq = [Q[i] for i in stateIndexList]return maxPro,stateSeqif __name__=='__main__':# 状态集合Q = ["q1", "q2", "q3"]# 观测集合V = [0, 1]# 初始状态概率向量pi = [0.2, 0.4, 0.4]# 状态转移概率矩阵A = [[0.5, 0.2, 0.3],[0.3, 0.5, 0.2],[0.2, 0.3, 0.5]]# 观测概率矩阵B = [[0.5, 0.5],[0.4, 0.6],[0.7, 0.3]]# 观测序列obs_seq = [0, 1, 0]maxPro, stateSeq = viterbi(pi, A, B, Q, V, obs_seq)print("最大概率为:", maxPro)print("最优状态序列为:", stateSeq)


End.

参考

  1. 吴军. 数学之美(第二版). 人民邮电出版社.
  2. 李航. 统计学习方法. 清华大学出版社.
  3. https://www.cnblogs.com/zhibei/p/9391014.html

隐马尔可夫模型的解码相关推荐

  1. 机器学习笔记之隐马尔可夫模型(六)解码问题

    机器学习笔记之隐马尔可夫模型--解码问题 引言 解码问题介绍 解码问题分析 引言 上一节介绍了使用狭义EM算法对模型参数λ\lambdaλ.本节将介绍使用维特比算法(Viterbi)处理解码问题(De ...

  2. 隐马尔可夫模型(五)——隐马尔可夫模型的解码问题(维特比算法)

    HMM解码问题       给定一个观察序列O=O1O2...OT,和模型μ=(A,B,π),如何快速有效地选择在一定意义下"最优"的状态序列Q=q1q2...qT,使该状态最好地 ...

  3. 人工智能里的数学修炼 | 隐马尔可夫模型 : 维特比(Viterbi)算法解码隐藏状态序列

    人工智能里的数学修炼 | 概率图模型 : 隐马尔可夫模型 人工智能里的数学修炼 | 隐马尔可夫模型:前向后向算法 人工智能里的数学修炼 | 隐马尔可夫模型 : 维特比(Viterbi)算法解码隐藏状态 ...

  4. 第十九课.隐马尔科夫模型

    目录 隐马尔科夫模型的结构 马尔科夫链与隐马尔科夫模型 实例 HMM的要素 模型的性质 推理问题:HMM的状态解码 隐状态解码问题 最大路径概率与维特比算法 使用维特比算法解码 实例演示 基于Pyth ...

  5. python 隐马尔科夫_隐马尔可夫模型原理和python实现

    隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程.其难点是从可观察的参数中确定该过程的隐含参数. 隐马尔可夫模型注意包含以下参数 ...

  6. 如何用赌场风云解释隐马尔可夫模型(HMM)?

    来源:DataCastle数据城堡 本文约3300字,建议阅读10分钟. 本文以"赌场风云"为背景,带你直观认识隐马尔可夫模型. 一.背景介绍:赌场风云 最近一个赌场的老板发现生意 ...

  7. 如何用简单易懂的例子解释隐马尔可夫模型?

    https://www.toutiao.com/a6684542749640753678/ 2019-04-27 19:59:50 隐马尔可夫(HMM)好讲,简单易懂不好讲.不过我想说个更通俗易懂的例 ...

  8. (转载)机器学习知识点(十一)隐马尔可夫模型

           隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域 ...

  9. 隐马尔科夫模型HMM自学 (2)

    HMM 定义 崔晓源 翻译 HMM是一个三元组 (,A,B).  the vector of the initial state probabilities;  the state transitio ...

最新文章

  1. 从上市公司数据读懂我国新兴产业发展态势
  2. 鸿蒙升级变动,天天吹鸿蒙,视频向你展示鸿蒙升级后到底有什么变化
  3. 数据分析pandas属性实现统计分析
  4. 一个渣渣的随页面滚动改变定位的代码
  5. OJ1069: 向Z同学学习
  6. 面板大小调整_3天学会premiere完全自学教程-了解时间轴面板
  7. Linux2.6内核本地提权
  8. java 图像处理两例:图像缩放与圆角图片的制作
  9. 大数据分析的步骤有哪些
  10. 2022年除了深度学习,人工智能算法有可能突破的10个方向
  11. 如何将.sql文件导入数据库
  12. 基于中间件的开发---中间件技术
  13. (三)进程各种id:pid、pgid、sid、全局pid、局部pid
  14. Nginx之一:Nginx的编译安装
  15. shiro框架的基本理解
  16. 甲骨文业绩超预期股价大涨近11% 市值首超2000亿美元
  17. 一文讲透图像分割经典网络:FCN、Unet、DeepLabV3+、Vnet、Unet++
  18. 用科技解决亿万人吃饭难题,中国团队入围工业工程界「诺贝尔奖」
  19. Linux —— tftp 使用
  20. Java编程(2)-类和方法

热门文章

  1. 时间的几个实用函数 FILETIME UnixTime的转换
  2. 领导想提拔你,会暗送这3个“秋波”,你要做足前戏,把握节奏
  3. Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能
  4. 按群计数10以内_大班数学按群数数教案
  5. 5G时代华为因为专利多至少比苹果少交了40亿 …
  6. deepdriveforGTA5之一 安装运行deepdrive
  7. 埃航黑匣子逐步破解,坠机矛头直指全自动化飞行软件
  8. C语言 strlen(int),C语言 - strlen函数及int,char转换问题
  9. Exoplayer+Exomedia打造自定义视频播放器
  10. Generics (泛型)