【机器学习】隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现

  • 一、维特比算法
  • 二、python实现
  • 参考资料

隐马尔可夫模型状态序列预测问题是指给定模型 λ=[A,B,∏]\lambda = \left[ {A,B,\prod } \right]λ=[A,B,∏]和观测序列 X={x1,x2,⋯ ,xn}X = \left\{ {{x_1},{x_2}, \cdots ,{x_n}} \right\}X={x1​,x2​,⋯,xn​},求最可能出现的对应状态序列。本篇博文介绍状态序列预测算法中的维特比算法(Viterbi algorithm)[参考资料1]。

一、维特比算法

维特比算法实际是用动态规划解隐马尔科夫模型的预测问题,首先导入两个变量δ\deltaδ和ψ\psiψ。

定义在时刻ttt状态为qiq_iqi​的所有单个路径(y1,y2,⋯ ,yt)({y_1},{y_2}, \cdots ,{y_t})(y1​,y2​,⋯,yt​)中概率最大值为:
δt(qi)=max⁡y1,y2,⋯ ,yt−1P(yt=qi,yt−1,⋯ ,y1,xt,⋯ ,x1∣λ),i=1,2,⋯ ,N{\delta _t}\left( {{q_i}} \right) = \mathop {\max }\limits_{{y_1},{y_2}, \cdots ,{y_{t - 1}}} P\left( {{y_t} = {q_i},{y_{t - 1}}, \cdots ,{y_1},{x_t}, \cdots ,{x_1}\left| \lambda \right.} \right),i = 1,2, \cdots ,Nδt​(qi​)=y1​,y2​,⋯,yt−1​max​P(yt​=qi​,yt−1​,⋯,y1​,xt​,⋯,x1​∣λ),i=1,2,⋯,N

则变量δ\deltaδ的递推公式为:
δt+1(qi)=max⁡y1,y2,⋯ ,ytP(yt+1=qi,yt,⋯ ,y1,xt+1,⋯ ,x1∣λ)=max⁡1≤j≤N[δt(j)aji]bi(xt+1),i=1,2,⋯ ,N;t=1,2,⋯ ,n−1{\delta _{t + 1}}\left( {{q_i}} \right) = \mathop {\max }\limits_{{y_1},{y_2}, \cdots ,{y_t}} P\left( {{y_{t + 1}} = {q_i},{y_t}, \cdots ,{y_1},{x_{t + 1}}, \cdots ,{x_1}\left| \lambda \right.} \right) = \mathop {\max }\limits_{1 \le j \le N} \left[ {{\delta _t}\left( j \right){a_{ji}}} \right]{b_i}({x_{t + 1}}),i = 1,2, \cdots ,N;t = 1,2, \cdots ,n - 1δt+1​(qi​)=y1​,y2​,⋯,yt​max​P(yt+1​=qi​,yt​,⋯,y1​,xt+1​,⋯,x1​∣λ)=1≤j≤Nmax​[δt​(j)aji​]bi​(xt+1​),i=1,2,⋯,N;t=1,2,⋯,n−1

定义在时刻ttt状态为qiq_iqi​的所有单个路径(y1,y2,⋯ ,yt−1,qi)({y_1},{y_2}, \cdots ,{y_{t - 1}},q_i)(y1​,y2​,⋯,yt−1​,qi​)中概率最大的路径的第t−1t-1t−1个节点为:
ψt(qi)=arg⁡max⁡1≤j≤N[δt−1(j)aji],i=1,2,⋯ ,N{\psi _t}(q_i) = \arg \mathop {\max }\limits_{1 \le j \le N} \left[ {{\delta _{t - 1}}\left( j \right){a_{ji}}} \right],i = 1,2, \cdots ,Nψt​(qi​)=arg1≤j≤Nmax​[δt−1​(j)aji​],i=1,2,⋯,N

维特比算法步骤
输入:模型λ=[A,B,∏]\lambda = [A,B,\prod ]λ=[A,B,∏]和观测序列X={x1,x2,⋯ ,xn}X = \left\{ {{x_1},{x_2}, \cdots ,{x_n}} \right\}X={x1​,x2​,⋯,xn​}
输出:最优状态序列Y={y1,y2,⋯ ,yn}Y = \left\{ {{y_1},{y_2}, \cdots ,{y_n}} \right\}Y={y1​,y2​,⋯,yn​}
(1)初始化:

δ1(qi)=πibi(x1),i=1,2,⋯ ,Nψ1(qi)=0,i=1,2,⋯ ,N\begin{array}{l} {\delta _1}({q_i}) = {\pi _{_i}}{b_i}\left( {{x_1}} \right),i = 1,2, \cdots ,N\\ {\psi _1}\left( {{q_i}} \right) = 0,i = 1,2, \cdots ,N \end{array}δ1​(qi​)=πi​​bi​(x1​),i=1,2,⋯,Nψ1​(qi​)=0,i=1,2,⋯,N​

(2)递推:对于t=2,3,⋯ ,nt = 2,3, \cdots ,nt=2,3,⋯,n

δt(qi)=max⁡1≤j≤N[δt−1(j)aji]bi(xt),i=1,2,⋯ ,Nψt(qi)=arg⁡max⁡1≤j≤N[δt−1(j)aji],i=1,2,⋯ ,N\begin{array}{l} {\delta _t}\left( {{q_i}} \right) = \mathop {\max }\limits_{1 \le j \le N} \left[ {{\delta _{t - 1}}\left( j \right){a_{ji}}} \right]{b_i}({x_t}),i = 1,2, \cdots ,N\\ {\psi _t}\left( {{q_i}} \right) = \arg \mathop {\max }\limits_{1 \le j \le N} \left[ {{\delta _{t - 1}}\left( j \right){a_{ji}}} \right],i = 1,2, \cdots ,N \end{array}δt​(qi​)=1≤j≤Nmax​[δt−1​(j)aji​]bi​(xt​),i=1,2,⋯,Nψt​(qi​)=arg1≤j≤Nmax​[δt−1​(j)aji​],i=1,2,⋯,N​

(3)终止:

yn=arg⁡max⁡1≤i≤N[δn(qi)]{y_n} = \arg \mathop {\max }\limits_{1 \le i \le N} \left[ {{\delta _n}\left( {{q_i}} \right)} \right]yn​=arg1≤i≤Nmax​[δn​(qi​)]

(4)最优路径回朔:对于t=n−1,n−2,⋯ ,1t = n - 1,n - 2, \cdots ,1t=n−1,n−2,⋯,1

yt=ψt+1(yt+1){y_t} = {\psi _{t + 1}}\left( {{y_{t + 1}}} \right)yt​=ψt+1​(yt+1​)

二、python实现

代码参考资料2

import numpy as npclass HMM:def __init__(self, A, B, Pi, O):self.A = np.array(A)     # 状态转移概率矩阵self.B = np.array(B)     # 观测概率矩阵self.Pi = np.array(Pi)   # 初始状态概率矩阵self.O = np.array(O)     # 观测序列self.N = self.A.shape[0] # 状态取值个数self.M = self.B.shape[1] # 观测值取值个数def viterbi(self):n = len(self.O)  #观测序列和状态序列的长度Y = np.zeros(n)  #初始化状态序列delta = np.zeros((n,self.N))psi = np.zeros((n,self.N))#初始化for i in range(self.N):delta[0,i] = self.Pi[i] * self.B[i,self.O[0]]psi[0,i] = 0#递推for t in range(1,n):for i in range(self.N):delta[t,i] = self.B[i,self.O[t]] * np.array([delta[t-1,j] * self.A[j,i] for j in range(self.N)]).max()psi[t,i] = np.array([delta[t-1,j] * self.A[j,i] for j in range(self.N)]).argmax()print(psi)#终止Y[n-1] = delta[n-1,:].argmax()print(Y[n-1])#回朔for t in range(n-2,-1,-1):Y[t] = psi[int(t+1),int(Y[t+1])]return Yif __name__ == '__main__':print('----------------1.初始化HMM模型参数------------------')A = [[0,1,0,0],[0.4,0,0.6,0],[0,0.4,0,0.6],[0,0,0.5,0.5]]B = [[0.5,0.5],[0.3,0.7],[0.6,0.4],[0.8,0.2]]Pi = [0.25,0.25,0.25,0.25]print('----------------2.观测序列---------------------------')O = [0,1,0]print('----------------3.viterbi 算法-----------------------')hmm = HMM(A,B,Pi,O)Y = hmm.viterbi()

参考资料

1、《统计学习方法》李航
2、https://www.cnblogs.com/d-roger/articles/5719979.html

【机器学习】隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现相关推荐

  1. 【机器学习】隐马尔可夫模型及其三个基本问题(三)模型参数学习算法及python实现

    [机器学习]隐马尔可夫模型及其三个基本问题(三)模型参数学习算法及python实现 一.一些概率与期望值的计算 二.非监督学习方法(Baum-Welch算法) 三.python实现 隐马尔可夫模型参数 ...

  2. 【机器学习】隐马尔可夫模型及其三个基本问题(二)观测序列概率计算算法及python实现

    [机器学习]隐马尔可夫模型及其三个基本问题(二)观测序列概率计算算法及python实现 一.前向算法 二.后向算法 三.前向-后向算法的python实现 参考资料 隐马尔可夫(HMM)模型的第一个基本 ...

  3. 【机器学习】隐马尔可夫模型及其三个基本问题(一)

    [机器学习]隐马尔可夫模型及其三个基本问题(一) HMM模型 1.HMM模型概述 2.HMM的三个基本问题 3.HMM问题实例 参考资料 隐马尔可夫模型(Hidden Markov Model,HMM ...

  4. 隐马尔科夫模型、三个基本问题、三个训练算法

    参考一篇"机器学习研究会"的文章与宗庆后的<统计自然语言模型>,督促自己回顾一下HMM模型知识为面试做准备. 这次学习会讲了隐马尔科夫链,这是一个特别常见的模型,在自然 ...

  5. 隐马尔可夫模型的三个基本问题

    目录 写在前面的话 隐马尔可夫模型(HMM) 隐马尔可夫模型的三个基本问题 写在前面的话 隐马尔可夫模型(HMM)的三个基本问题,我查阅相关资料有一些自己的理解,如有错误请多指正~ 参考资料: 如何用 ...

  6. 隐马尔科夫模型,三个基本问题及相应算法

    隐马尔科夫模型基本问题及其相应的算法: 1.评估问题:概率计算问题:给定模型和观测序列,计算在模型下观测序列出现的概率. 前向.后向算法解决的是一个评估问题,即给定一个模型,求某特定观测序列的概率,用 ...

  7. 隐马尔可夫模型的三个基本问题(例子说明)

    例子:有放回的从N个盒子拿红白球的问题. 模型参数λ(A,B,π),观测序列表示为O(o1,o2,-,oT) A表示状态转移矩阵 B表示观测矩阵 π表示初始状态概率 假设目前的观测序列为(红,红,白) ...

  8. 人工智能里的数学修炼 | 概率图模型 : 隐马尔可夫模型

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

  9. 10_隐马尔科夫模型HMM1_统计学习方法

    文章目录 一.几个基本概念 1.隐马尔可夫模型 2.马尔科夫链 3.随机过程 4.马尔科夫性质 二.隐马尔科夫模型 1.隐马尔科夫模型的引入 2.隐马尔科夫模型定义 3.隐马尔科夫模型的两个假设 4. ...

最新文章

  1. word break
  2. Perl Nmap报告处理摸索(学习)
  3. 深入分析 Linux 内核链表--转
  4. 设计模式--命令(Command)模式
  5. [AWS vs Azure] 云计算里AWS和Azure的探究(4)
  6. 关于 HTTP 和 TCP 的 keep-alive
  7. centos proftp_在CentOS上禁用ProFTP
  8. 概要设计说明书_没有什么比牙签更好的设计了
  9. 广科计算机专业3 2分数线,考试网:重庆最新高考录取分数线发布 理科一本533分...
  10. 开源分布式数据库 TiKV 入选 CNCF 云原生项目!
  11. 开源大数据生态下的 Flink 应用实践
  12. 百度中文手写输入法linux版,[Linux]百度输入法Linux版 V1.0.1.0 [2020.05.19]
  13. 微信小程序影视评论交流平台系统毕业设计毕设(6)开题答辩PPT
  14. 开始写博客之学习编程的重要性
  15. 用户体验设计师到底有多重要
  16. 史上最难英语单词——as的七十二变【猴精】
  17. ubuntu下flann库编译报错处理
  18. matlab应用测试,moocMATLAB程序与应用单元测试答案
  19. 有哪些能支持epub、txt格式的电子书阅读器?能在MAC上用的?
  20. 弱连通和强连通_什么叫:强连通 单向连通 弱连通 不连通

热门文章

  1. 数字类型转换成字符串类型并逆序输出
  2. 数据挖掘-二手车价格预测 Task02:数据分析
  3. 大数据项目实战数仓4——常用脚本
  4. 第二个案例实操——创建Bean类
  5. 挑选大数据营销平台应注意哪些问题
  6. 企业如何搭建物联卡云平台
  7. Hive(四)——数据操作
  8. C++算法学习(动态规划算法)
  9. 银医 服务器虚拟化,长宁时报数字报刊平台-技术创新 需求驱动 信息化助力医院发展...
  10. 卸载vuecli3_112、vue-cli3安装遇到的问题,卸载不掉旧版本,导致更新不了