HMM模型基础

介绍

隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用。当然,随着目前深度学习的崛起,尤其是RNN,LSTM等神经网络序列模型的火热,HMM的地位有所下降。但是作为一个经典的模型,学习HMM的模型和对应算法,对我们解决问题建模的能力提高以及算法思路的拓展还是很好的。本文是HMM系列的第一篇,关注于HMM模型的基础。

什么样的问题需要HMM模型

首先我们来看看什么样的问题解决可以用HMM模型。使用HMM模型时我们的问题一般有这两个特征:

  1. 我们的问题是基于序列的,比如时间序列,或者状态序列。
  2. 们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。

有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。比如:我现在在打字写博客,我在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型了。再举一个,我在和你说话,我发出的一串连续的声音就是观测序列,而我实际要表达的一段话就是状态序列,你大脑的任务,就是从这一串连续的声音中判断出我最可能要表达的话的内容。

从这些例子中,我们可以发现,HMM模型可以无处不在。但是上面的描述还不精确,下面我们用精确的数学符号来表述我们的HMM模型。

HMM模型的定义

对于HMM模型,首先我们假设QQ是所有可能的隐藏状态的集合,VV是所有可能的观测状态的集合,即:

Q=q1,q2,...,qN,V=v1,v2,...vMQ = {q_1,q_2,...,q_N},V={v_1,v_2,...v_M}Q=q1​,q2​,...,qN​,V=v1​,v2​,...vM​

其中,N是可能的隐藏状态数,M是所有的可能的观察状态数。

对于一个长度为T的序列,II对应的状态序列, O是对应的观察序列,即:

I={i1,i2,⋯,iT},O={o1,o2,⋯,oT}I = \{i_1,i_2,\cdots,i_T\},\ O=\{o_1,o_2,\cdots,o_T\} I={i1​,i2​,⋯,iT​}, O={o1​,o2​,⋯,oT​}

其中,任意一个隐藏状态it∈Qit∈Q,任意一个观察状态ot∈Vot∈V

HMM模型做了两个很重要的假设如下:

  1. 齐次马尔科夫链假设。即任意时刻的隐藏状态只依赖于它前一个隐藏状态,这个我们在MCMC(二)马尔科夫链中有详细讲述。当然这样假设有点极端,因为很多时候我们的某一个隐藏状态不仅仅只依赖于前一个隐藏状态,可能是前两个或者是前三个。但是这样假设的好处就是模型简单,便于求解。如果在时刻t的隐藏状态是iti_tit​=qiq_iqi​,在时刻t+1的隐藏状态是it+1=qji_{t+1}=q_jit+1​=qj​, 则从时刻tt到时刻t+1的HMM状态转移概率aija_{ij}aij​可以表示为:
    aij=P(it+1=qj∣it=qi)a_{ij} = P(i_{t+1} = q_j|i_t=q_i) aij​=P(it+1​=qj​∣it​=qi​)

    这样aija_{ij}aij​可以组成马尔科夫链的状态转移矩阵A:
    A=[aij]N×NA = \left[a_{ij} \right]_{N\times N} A=[aij​]N×N​

  2. 观测独立性假设。即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态,这也是一个为了简化模型的假设。如果在时刻t的隐藏状态是it=qji_t=q_jit​=qj​, 而对应的观察状态为ot=vko_t=v_kot​=vk​, 则该时刻观察状态vkv_kvk​在隐藏状态qjq_jqj​下生成的概率为bj(k)b_j(k)bj​(k),满足:
    bj(k)=P(ot=vk∣it=qj)b_j(k) = P(o_t=v_k|i_t=q_j) bj​(k)=P(ot​=vk​∣it​=qj​)

    这样bj(k)b_j(k)bj​(k)可以组成观测状态生成的概率矩阵B:
    B=[bj(k)]N×MB = \left[b_j(k)\right]_{N\times M} B=[bj​(k)]N×M​

    除此之外,我们需要一组在时刻t=1的隐藏状态概率分布∏\prod∏:
    ∏=[π(i)]N,其中π(i)=P(i1=qi)\prod = \left[\pi(i)\right]_N, \ 其中\pi(i) = P(i_1=q_i) ∏=[π(i)]N​, 其中π(i)=P(i1​=qi​)

一个HMM模型,可以由隐藏状态初始概率分布∏\prod∏, 状态转移概率矩阵A和观测状态概率矩阵B决定。∏\prod∏,A决定状态序列,B决定观测序列。因此,HMM模型可以由一个三元组λ表示如下:
λ=(A,B,∏)\lambda = (A,B,\prod) λ=(A,B,∏)

一个HMM模型实例

下面我们用一个简单的实例来描述上面抽象出的HMM模型。这是一个盒子与球的模型,例子来源于李航的《统计学习方法》。

假设我们有3个盒子,每个盒子里都有红色和白色两种球,这三个盒子里球的数量分别是:

盒子 1 2 3
红球数 5 4 7
白球数 5 6 3

按照下面的方法从盒子里抽球,开始的时候,从第一个盒子抽球的概率是0.2,从第二个盒子抽球的概率是0.4,从第三个盒子抽球的概率是0.4。以这个概率抽一次球后,将球放回。然后从当前盒子转移到下一个盒子进行抽球。规则是:如果当前抽球的盒子是第一个盒子,则以0.5的概率仍然留在第一个盒子继续抽球,以0.2的概率去第二个盒子抽球,以0.3的概率去第三个盒子抽球。如果当前抽球的盒子是第二个盒子,则以0.5的概率仍然留在第二个盒子继续抽球,以0.3的概率去第一个盒子抽球,以0.2的概率去第三个盒子抽球。如果当前抽球的盒子是第三个盒子,则以0.5的概率仍然留在第三个盒子继续抽球,以0.2的概率去第一个盒子抽球,以0.3的概率去第二个盒子抽球。如此下去,直到重复三次,得到一个球的颜色的观测序列:
O={红,白,红}O = \{红,白,红\} O={红,白,红}

注意在这个过程中,观察者只能看到球的颜色序列,却不能看到球是从哪个盒子里取出的。

那么按照我们上一节HMM模型的定义,我们的观察集合是:
V={红,白},M=2V=\{红,白\}, \ M=2 V={红,白}, M=2

我们的状态集合是:
Q={盒子1,盒子2,盒子3},N=3Q = \{盒子1,盒子2,盒子3\}, \ N=3 Q={盒子1,盒子2,盒子3}, N=3

而观察序列和状态序列的长度为3.

初始状态分布为:
∏=(0.2,0.4,0.4)T\prod = (0.2,0.4,0.4)^T ∏=(0.2,0.4,0.4)T

状态转移概率分布矩阵为:
A={0.50.20.30.30.50.20.20.30.5}A = \left\{\begin{matrix} 0.5 & 0.2 & 0.3\\ 0.3 & 0.5 & 0.2 \\ 0.2 & 0.3 & 0.5 \end{matrix}\right\} A=⎩⎨⎧​0.50.30.2​0.20.50.3​0.30.20.5​⎭⎬⎫​

观测状态概率矩阵为:
B={0.50.50.40.60.70.3}B = \left\{ \begin{matrix} 0.5 & 0.5 \\ 0.4 & 0.6 \\ 0.7 & 0.3 \end{matrix}\right\} B=⎩⎨⎧​0.50.40.7​0.50.60.3​⎭⎬⎫​

HMM观测序列的生成

从上一节的例子,我们也可以抽象出HMM观测序列生成的过程。

输入的是HMM的模型λ=(A,B,∏\prod∏),观测序列的长度T
输出是观测序列O=o1,o2,...oTO={o_1,o_2,...o_T}O=o1​,o2​,...oT​
生成的过程如下:

  1. 根据初始状态概率分布Π生成隐藏状态i1i_1i1​
  2. for t from 1 to T
    a. 按照隐藏状态iti_tit​的观测状态分布bit(k)生成观察状态oto_tot​
    b. 按照隐藏状态iti_tit​的状态转移概率分布aitit+1a_{{i_t}{i_{t+1}}}ait​it+1​​产生隐藏状态it+1i_t+1it​+1

所有的ot一起形成观测序列O=o1,o2,...oTO={o_1,o_2,...o_T}O=o1​,o2​,...oT​

HMM模型的三个基本问题

HMM模型一共有三个经典的问题需要解决:

  1. 评估观察序列概率。即给定模型λ=(A,B,∏\prod∏)和观测序列O=o1,o2,...oTO={o_1,o_2,...o_T}O=o1​,o2​,...oT​,计算在模型λ下观测序列O出现的概率P(O|λ)。这个问题的求解需要用到前向后向算法,我们在这个系列的第二篇会详细讲解。这个问题是HMM模型三个问题中最简单的。

  2. 模型参数学习问题。即给定观测序列O=o1,o2,...oTO={o_1,o_2,...o_T}O=o1​,o2​,...oT​,估计模型λ=(A,B,∏\prod∏)的参数,使该模型下观测序列的条件概率P(O|λ)最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法, 我们在这个系列的第三篇会详细讲解。这个问题是HMM模型三个问题中最复杂的。

  3. 预测问题,也称为解码问题。即给定模型λ=(A,B,∏\prod∏)和观测序列O=o1,o2,...oTO={o_1,o_2,...o_T}O=o1​,o2​,...oT​,求给定观测序列条件下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划的维特比算法,我们在这个系列的第四篇会详细讲解。这个问题是HMM模型三个问题中复杂度居中的算法。

HMM(隐马尔科夫模型)相关推荐

  1. HMM隐马尔科夫模型(附维特比代码)

    背景知识:马尔科夫模型 1 马尔科夫的局限性 在一些情况下,我们并不能直接得到观测的结果,比如在天气系统中,我们不能直接得到天气的状态,但是我们有一堆蚂蚁,可以从蚂蚁的行为状态找到天气变化的关系规律. ...

  2. 通过hmmlearn学习使用HMM隐马尔科夫模型

    一.了解隐马尔科夫模型(HMM) 具体可参考https://www.zhihu.com/question/20962240,讲得很通俗易懂. 本文使用的是hmmlearn模块,可以使用pip inst ...

  3. 一文讲透:HMM隐马尔科夫模型

    一.马尔科夫模型 1 马尔科夫的几个概念 要想理解隐马尔科夫模型,首先要理解马尔科夫模型. 下面通过一个天气变化的例子来认识马尔科夫模型中的几个重要概念.

  4. HMM隐马尔科夫模型浅析

    http://www.zhihu.com/question/20962240 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Yang Eninala 链接:http:/ ...

  5. HMM隐马尔科夫模型 学习总结

    隐马尔可夫模型(Hidden Markov Model,简称HMM)是结构最简单的动态贝叶斯网(dynamic Bayesian network),这是一种著名的有向图模型,主要用于时序数据建模,在语 ...

  6. 隐马尔科夫模型HMM详解(1)

    目录 隐马尔科夫模型基本概念 隐马尔科夫模型的三个基本问题 概率计算 预测算法-Viterbi算法 HMM学习算法参考下篇文章 代码地址:https://gitee.com/liangcd/speec ...

  7. 强化学习(一)-->隐马尔科夫模型HMM-->HMM模型基础

    隐马尔科夫模型HMM 隐马尔科夫模型算是比较经典的机器学习模型了,在自然语言处理.语言识别.模型识别等这些领域也得到了广泛的应用.在深度学习的崛起,尤其是RNN.LSTM等神经网络序列模型的火热,HM ...

  8. 机器学习之概率图模型(贝叶斯概率,隐马尔科夫模型)

    一.贝叶斯公式 在学习概率图模型之前先要了解贝叶斯公式: 由公式(1),(2)可得: 这便是贝叶斯公式,其中条件概率P(A/B)称为后验概率,概率P(A),P(B)称为先验概率,条件概率P(B/A), ...

  9. 隐马尔科夫模型HMM(一)HMM模型

    2019独角兽企业重金招聘Python工程师标准>>> 隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理 ...

最新文章

  1. Android 唯一标识获取
  2. 快速解决正则----模糊匹配、字符类、量词
  3. linux下miniconda3启动命令
  4. DTStructure分治法与最大子列和问题
  5. OpenCV伪彩色applyColorMap函数
  6. shell脚本执行返回的状态码
  7. c语言出勤成绩,C语言课程设计学生考勤系统文档推荐 (10页)-原创力文档
  8. 跨境电商为什么需要ERP系统?
  9. 计算机域名DNS设置,电脑的IP地址和DNS域名服务器如何设置
  10. 关于java的局部知识点总结
  11. fragment嵌套viewpager嵌套fragment第二次加载数据不显示问题
  12. 国内外优秀音视频博客
  13. eclipse设置代码自动提示
  14. [Unity3D]ml-agent入门案例
  15. CSC宣布成立CSC Security Center
  16. 汉字五行归属python实现
  17. 对比极米Z6X Pro和RS Pro 2,极米H5值得入手吗?极米H5评测来了
  18. VMOS+小黄鸟无root抓包(解决抓包无网络问题)(附工具)
  19. 简单的CSV文件读取,C语言实现
  20. Android双屏异显

热门文章

  1. Facebook发币、摩根币年底问世,数字货币或冲击传统金融格局
  2. Elasticsearch概述
  3. python同时发送与接收_python网络编程之多线程同时接受和发送
  4. jsoup 的用法网络爬虫
  5. 四步打造情绪板,fabrie教你如何跟客户谈“感觉”!(内含模板)
  6. 数据库新技术那些让人眼前一亮的设计
  7. 大数据 杨栋_杨栋与王庆国修理合同纠纷一案
  8. Siamese 详解
  9. Android进阶之路 - 顶部状态栏、底部虚拟导航栏相关操作
  10. Qt多线程调用gdal库接口