一、隐马尔科夫链的第一个基本问题

估计问题:给定一个观察序列O=O1O2…OTO=O_1O_2\dots O_T和模型u=(A,B,π)u = (\boldsymbol{A,B,\pi}),如何快速地计算出给定模型uu情况下,观察序列OO的概率, 即P(O|u)P(O|u)?

二、求解观察序列的概率

其实,求解这个问题就是一个解码问题。 对于任意的状态序列Q=q1q2…qTQ=q_1q_2\dots q_T,有

P(O|Q,u)=∏t=1T−1P(Ot|qt,qt+1,u)=bq1(O1)bq2(O2)…bqT(OT)

P(O|Q,u)= \prod_{t=1}^{T-1} P(O_t|q_t,q_t+1,u) \\ =b_{q1}(O_1)b_{q2}(O_2)\dots b_{qT}(O_T)
并且

P(Q|u)=πq1aq1q2aq2q3…aqT−1qT

P(Q|u) = \pi _{q_1}a_{q_1q_2}a_{q_2q_3} \dots a_{q_{T-1}q_T}
由于

P(O,Q|u)=P(O|Q,u)P(Q|u)

P(O,Q|u) = P(O|Q,u)P(Q|u)
所以

P(O|u)=∑QP(O,Q|u)∑QP(O|Q,u)P(Q|u)=∑Qπq1bq1(O1)∏t=1T−1aqtqt+1bqt+1(Ot+1)

P(O|u) = \sum _{Q} P(O,Q|u) \\ \sum _{Q}P(O|Q,u)P(Q|u) \\ =\sum _{Q}\pi _{q_1}b_{q1}(O_1)\prod_{t=1}^{T-1}a_{q_{t}q_{t+1}}b_{q_{t+1}}(O_{t+1})
上述推导过程很直接,但是实际的计算量是非常庞大的,它要穷尽所有可能的状态序列,如果模型中有 NN个状态,时间长度为TT, 那么有 NTN^T个可能的状态序列,这导致了并不能有效地执行这个算法。因此,人们提出了前向算法,利用动态规划来解决指数爆炸的问题。

三、HMM中的前向算法

为了实现前向算法,需要定义一个前向变量αt(i)\alpha_t(i).
定义1 前向变量αt(i)\alpha_t(i)是在时间tt, HMM输出序列O=O1O2…OtO=O_1O_2\dots O_t并且位于状态sis_i的概率

αt(i)=P(O1O2…Ot,qt=si|u)

\alpha_t(i) = P(O_1O_2\dots O_t, q_t=s_i|u)

前向算法的主要思想是,如果可以快速地计算前向变量αt(i)\alpha_t(i),那么就可以根据αt(i)\alpha_t(i)计算出P(O|u)P(O|u) , 因为P(O|u)P(O|u) 是在所有状态下观察到序列O=O1O2…OtO=O_1O_2\dots O_t的概率:

P(O|u)=∑siP(O1O2…OT,qT=si|u)=∑i=1NαT(i)

P(O|u) = \sum _{s_i}P(O_1O_2\dots O_T, q_T=s_i|u)= \sum _{i=1}^{N}\alpha_T(i)
    在前向算法中,采用动态规划的方法计算前向变量 αt(i)\alpha_t(i),其思想基于如下观察:在时间t+1的前向变量可以根据时间t时的前向变量 αt(1),αt(2),…,αt(N)\alpha_t(1),\alpha_t(2),\dots, \alpha_t(N)来归纳计算:

αt+1(j)=(∑i=1Nαt(i)aij)bj(Ot+1)

\alpha_{t+1}(j) = (\sum_{i=1}^{N}\alpha_t(i)a_{ij})b_j({O_{t+1}})

前向算法

1 初始化: α1(i)=πibi(O1),1≤i≤N\alpha_1(i)=\pi_ib_i(O_1), 1 \le i \le N
2 归纳计算: αt+1(j)=(∑Ni=1αt(i)aij)bj(Ot+1),1≤t≤T−1\alpha_{t+1}(j) = (\sum_{i=1}^{N}\alpha_t(i)a_{ij})b_j({O_{t+1}}) , 1 \le t \le T-1
3 求和终结: P(O|u)=∑Ni=1αT(i)P(O|u) = \sum _{i=1}^{N}\alpha_T(i)

前向算法的时间复杂度为O(N2T)O(N^2T)

四、HMM中的后向算法

快速计算P(O|u)P(O|u)还有一种后向算法。
对应于前向变量,定义一个后向变量βt(i)\beta_t(i).
定义2 后向变量βt(i)\beta_t(i)是在给定模型u=(A,B,π)u = (\boldsymbol{A,B,\pi})并且在时间tt状态为sis_i的条件下,HMM的输出观察序列O=Ot+1Ot+2…OTO=O_{t+1}O_{t+2}\dots O_T的概率:

βt(i)=P(Ot+1Ot+2…OT|qt=si|u)

\beta_t(i) = P(O_{t+1}O_{t+2}\dots O_T| q_t=s_i|u)
    类似于前向算法,也可以用动态规划算法计算后向变量。
1. 从时间 tt到时间t+1t+1, HMM的状态 sis_i到状态 sjs_j输出 Ot+1O_{t+1},概率为 aijbj(Ot+1)a_{ij}b_j(O_{t+1})
2. 在时间 t+1t+1的状态为 sjs_j的条件下,HMM输出观察序列 Ot+2…OTO_{t+2}\dots O_T,概率为: βt+1(j)\beta_{t+1}(j)
则,归纳关系为:

βt(i)=∑j=1Naijbj(Ot+1)βt+1(j)

\beta_t(i)=\sum_{j=1}^{N}a_{ij}b_j(O_{t+1})\beta_{t+1}(j)
后向算法

1 初始化:βT(i)=1,1≤i≤N\beta_T(i)=1, 1 \le i \le N
2 归纳计算:βt(i)=∑Nj=1aijbj(Ot+1)βt+1(j),T−1≥t≥1;1≤i≤N\beta_t(i)=\sum_{j=1}^{N}a_{ij}b_j(O_{t+1})\beta_{t+1}(j), T-1 \ge t \ge 1; 1 \le i \le N
3 求和终结:P(O|u)=∑Ni=1πibi(O1)β1(i)P(O|u) = \sum _{i=1}^{N}\pi_ib_i(O_1)\beta_1(i)

后向算法的时间复杂度为O(N2T)O(N^2T)

机器学习笔记(十四)——HMM估计问题和前向后向算法相关推荐

  1. 机器学习笔记十四:随机森林

    在上一篇机器学习笔记十三:Ensemble思想(上)中,简要的提了一下集成学习的原理和两种主要的集成学习形式.  而在这部分要讲的随机森林,就算是其中属于bagging思路的一种学习方法.为了篇幅,b ...

  2. 机器学习笔记(十八)——HMM的参数估计

    一.HMM中的第三个基本问题 参数估计问题:给定一个观察序列O=O1O2-OTO=O_1O_2\dots O_T,如何调节模型μ=(A,B,π)\mu = (A, B, \pi)的参数,使得P(O|μ ...

  3. 机器学习笔记 十四:k-近邻算法(kNN)的实现

    目录 1. 什么是机器学习 2. k-近邻算法(kNN) 2.1 kNN的原理 2.2 k-近邻算法的一般流程 2.3 kNN伪代码 3. 函数介绍 3.1 get()函数:利用字典统计列表中元素出现 ...

  4. 吴恩达机器学习笔记十四之大规模机器学习

    本节目录 1 大型数据集的学习 2 随机梯度下降法 3 小批量梯度下降 4 随机梯度下降收敛 5 在线学习 6 映射化简和数据并行 1 大型数据集的学习 如果我们有一个低方差的模型,增加数据集的规模可 ...

  5. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  6. 【周志华机器学习】十四、概率图模型

    文章目录 参考资料 1. 基本概念 2. 隐马尔可夫模型(HMM) 2.1 隐马尔可夫三大问题 1. 第一个问题解法 2. 第二个问题解法 3. 第三个问题解法 3. 马尔可夫随机场(MRF) 3.1 ...

  7. 强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现

    强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现 TD3算法简介 TD3是Twin Delayed Deep Deterministic policy gradie ...

  8. 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:// ...

  9. Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理

    Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理 Polyworks的工作任务存储分为工作区和项目两级,通过WORKSPACE命令获取工作任务信息,实现更好的任务管理. 下 ...

最新文章

  1. python 显示数据库数据tk_如何使用python显示从Mysql表获取的Tkinter treeview中的数据...
  2. 多线程:了解一下ForkJoin、FutureTask、BlockingQueue
  3. 使用 Castal DynamicProxy 简化 Silverlight 数据绑定
  4. MIME type类型
  5. MySQL ACID及四种隔离级别的解释
  6. python图书管理系统增删改查_python基础-字典的增删改查
  7. java中的jpa_在JPA中处理Java的LocalDateTime
  8. 漫谈CGI FastCGI WSGI
  9. Java 创建线程的4种方式
  10. 修改 tomcat 初始 ROOT 的方法
  11. 第31讲 聊天室程序
  12. 软件工程pert图_《软件工程》软件项目管理实验
  13. object has no attribute 'cleaned_data'
  14. python爬取网页停止_如何使用Python抓取雪球网页?
  15. veracrypt源码编译
  16. php 抢红包_用PHP实现的抢红包小程序
  17. (数据库系统概论|王珊)第七章数据库设计-第三节:概念结构设计
  18. 诗歌七 千字文(天地玄黄,宇宙洪荒)
  19. 如何理解 ssh 三大框架
  20. 行人重识别论文(五)Beyond Part Models: Person Retrieval with Refined Part Pooling

热门文章

  1. PHP在哪里执行_php文件放在哪运行
  2. 从一个深度图里面导出NARF特征
  3. 罗盘时钟编码代码_安全研究 | 利用macOS Dock实现代码的持久化执行
  4. lamp配置python_LAMP搭建笔记
  5. java 对list增删_List 中正确的增删操作
  6. 探索测试 | 新奇深层测试策略之案例剖析(一)
  7. 【测试】用例设计思路-六方面
  8. Unity3d通用工具类之定时触发器
  9. PHP单引号 ' ',没有任何意义,对所引内容不经任何处理直接拿过来
  10. .net 页面之间传值的几种方法!(转)