HMM简介

  对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳。那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑。

  本文将通过具体形象的例子来引入该模型,并深入探究隐马尔可夫模型及Viterbi算法,希望能对大家有所启发。

  隐马尔可夫模型(HMM,hidden Markov model)是可用于标注问题的统计学模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。HMM模型在实际的生活和生产中有着广泛的应用,包括语音识别,自然语言处理,生物信息,模式识别等领域。

引入

  某天,你的女神告诉你说,她放假三天,将要去上海游玩,准备去欢乐谷、迪士尼和外滩(不一定三个都会去)。

  她呢,会选择在这三个地方中的某几个逗留并决定是否购物,而且每天只待在一个地方。根据你对她的了解,知道她去哪个地方,仅取决于她去的上一个地方,且是否购物的概率仅取决于她去的地方。已知她去的三个地方的转移概率表如下:

欢乐谷 迪士尼 外滩
欢乐谷 0.8 0.05 0.15
迪士尼 0.2 0.6 0.3
外滩 0.2 0.3 0.5

稍微对这个表格做些说明,比如第一行,前一天去了欢乐谷后,第二天还待在欢乐谷的概率为0.8,去迪士尼的概率为0.05,去外滩的概率为0.15。

  她在每个地方的购物概率为:

地点 购物概率
欢乐谷 0.1
迪士尼 0.8
外滩 0.3

  在出发的时候,她跟你说去每个地方的可能性相同。后来,放假回来后,你看了她的朋友圈,发现她的购物情况如下:第一天不购物,第二三天都购物了。于是,你很好奇,她这三天都去了哪些地方。

  怎么样,聪明的你能求解出来吗?

HMM的模型参数

  接下来,我们将会介绍隐马尔可夫模型(HMM)。

  隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。隐藏的马尔可夫链随机生成的状态的序列,称为状态序列;每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列。序列的每一个位置又可以看作是一个时刻。

  隐马尔可夫模型由初始概率分布、状态转移概率分布以及观测概率分布确定。隐马尔可夫模型的形式定义如下:

  设Q是所有可能的状态的集合,V是所有可能的观测的集合,也就是说,Q是不可见的,而V是可见的,是我们观测到的可能结果。

\[q=\{q_1,q_2,...,q_N\}, V=\{v_1,v_2,...,v_M\}
\]

其中,N是可能的状态数,M是可能的观测数。

  在刚才的例子中,\(Q\)是不可见的状态集合,应为\(Q=\{欢乐谷,迪士尼,外滩\}\),而\(V\)是可以观测的集合,应为\(V=\{购物,不购物\}\)。

  I是长度为T的状态序列,O是对应的观测序列。

\[I=(i_1,i_2,...,i_T), O=(o_1,o_2,...,o_T)
\]

在刚才的例子中,\(I\)这个序列是我们需要求解的,即女生去了哪些地方,而\(O\)是你知道的序列,\(O=\{不购物,购物,购物\}\)。

  A是状态转移概率矩阵:

\[A=[a_{ij}]_{N\times N}
\]

其中,\(a_{ij}=P(i_{t+1}=q_j|i_{t}=q_{i}), i=1,2,...,N; j=1,2,..,N\)是在时刻t处于状态\(q_i\)的条件下在时刻t+1转移到状态\(q_j\)的概率。在刚才的例子中,转移概率矩阵为:

\[A=
\begin{bmatrix}
{0.8}&{0.05}&{0.15}\\
{0.6}&{0.6}&{0.2}\\
{0.2}&{0.3}&{0.5}\\
\end{bmatrix}
\]

  B是观测概率矩阵:

\[B=[b_{j}(k)]_{N\times M}
\]

其中,\(b_{j}(k)=P(o_t = v_{k}|i_{t}=q_{j}), k=1,2,...,M; j=1,2,...,N\)是在时刻t处于状态\(q_{j}\)的条件下生成观测\(v_{k}\)的概率。在刚才的例子中:

\[B=
\begin{bmatrix}
{0.1}&{0.9}\\
{0.8}&{0.2}\\
{0.3}&{0.7}\\
\end{bmatrix}
\]

  \(\pi\)是初始状态概率向量\(\pi=(\pi_i)\),其中\(\pi_i = P(i_1 = q_i), i=1,2,...,N\)是时刻t=1处于状态\(q_{j}\)的概率。在刚才的例子中, \(\pi = (\frac{1}{3}, \frac{1}{3}, \frac{1}{3}).\)

  综上,我们已经讲完HMM中的基本概念。同时,我们可以知道,隐马尔可夫模型由初始状态概率向量\(\pi\),状态转移概率矩阵\(A\)和观测概率矩阵\(B\)决定。\(\pi\)和\(A\)决定状态序列,\(B\)决定观测序列。因此,隐马尔可夫模型\(\lambda\)可用三元符号表示,即

\[\lambda = (A, B, \pi)
\]

\(A,B,\pi\)称为HMM的三要素。

  当然,隐马尔可夫模型之所以被称为马尔可夫模型,是因为它使用了两个基本的假设,其中之一为马尔可夫假设。它们分别是:

  1. 齐次马尔科夫假设,即假设隐藏的马尔可夫链在任意时刻t的状态只依赖于其前一时刻的状态,与其他时刻的状态及观测无关,也与时刻t无关。

\[P(i_{i}|i_{t-1},o_{t-1},...,i_1,o_1)=P(i_{t}|i_{t-1}), t=1,2,...,T
\]

  1. 观测独立性假设,即假设任意时刻的观测只依赖于该时刻的马尔可夫链的状态,与其他观测及状态无关。

\[P(o_{i}|i_{T},o_{T},...,i_{t+1},o_{t+1},i_{t}, t_{t-1},o_{t-1},...,i_{1},o_{1})=P(o_{t}|i_{t}), t=1,2,...,T
\]

  在刚才的假设中,我们对应的两个假设分别为:她去哪个地方,仅取决于她去的上一个地方;是否购物的概率仅取决于她去的地方。前一个条件为齐次马尔科夫假设,后一个条件为观测独立性假设。

  以上,我们就介绍了HMM的基本概念及假设。而HMM的三个基本问题如下:

  1. 概率计算问题。给定模型\(\lambda=(A,B,\pi)\)和观测序列\(O=(o_1,o_2,...,o_T)\),计算在模型\(\lambda\)下观测序列\(O\)出现的概率\(P(O|\lambda).\)
  2. 学习问题。已知观测序列\(O=(o_1,o_2,...,o_T)\),估计模型\(\lambda=(A,B,\pi)\)参数,使得在该模型下观测序列概率\(P(O|\lambda)\)最大。
  3. 预测问题。已知模型\(\lambda=(A,B,\pi)\)和观测序列\(O=(o_1,o_2,...,o_T)\),求对给定观测序列条件概率\(P(I|O)\)最大的状态序列\(I=(i_1,i_2,...,i_T).\)即给定观测序列,求最有可能的对应的状态序列。

  上面的例子即为HMM的第三个基本问题,也就是,给定观测序列{不购物,购物,购物},结果最有可能的状态序列,即游玩的地方。

Viterbi算法

  求解HMM的第三个基本问题,会用到大名鼎鼎的维特比算法(Viterbi Algorithm)。

  维特比算法以安德鲁·维特比(Andrew Viterbi)命名,是现代数字通信中最常用的算法,同时也是很多自然语言处理采用的解码算法。可以毫不夸张地讲,维特比是对我们的生活影音力最大的科学家之一,因为基于CDMA的3G移动通信标准主要就是他和厄文·雅各布(Irwin Mark Jacobs)创办的高通公司(Qualcomm)指定的。

  维特比算法是一个特殊但应用最广的动态规划(dynamic programming)算法,利用动态规划,可以解决任何一个图中的最短路径问题,同时,它也是求解HMM描述的第三个基本问题的算法。

  在维特比算法中,需要引入两个变量\(\delta\)和\(\psi.\)定义在时刻t状态i的所有单个路径\((i_1,i_2,...,i_t)\)中概率最大值为

\[\delta_{t+1}(i) = \max_{1\leq j \leq N}[\delta_{t}(j)a_{ji}]b_{i}(o_{t+1}), i=1,2,...,N; t=1,2,...,T.
\]

定义在时刻t状态为i的所有单个路径\((i_1,i_2,...,i_{t-1},i)\)中概率最大的路径的第i-1个节点为

\[\psi_{t}(i) = arg \max_{1\leq j \leq N}[\delta_{t-1}(j)a_{ji}], i=1,2,...,N; t=1,2,...,T.
\]

  下面是维特比算法在HMM的第三个基本问题的算法:

Python代码实现

  下面,对于刚才给出的例子,我们将使用Python,来写代码实现Viterbi算法,同时求解刚才的问题。

  1. # -*- coding: utf-8 -*-
  2. # HMM.py
  3. # Using Vertibi algorithm
  4. import numpy as np
  5. def Viterbi(A, B, PI, V, Q, obs):
  6. N = len(Q)
  7. T = len(obs)
  8. delta = np.array([[0] * N] * T, dtype=np.float64)
  9. phi = np.array([[0] * N] * T, dtype=np.int64)
  10. # 初始化
  11. for i in range(N):
  12. delta[0, i] = PI[i]*B[i][V.index(obs[0])]
  13. phi[0, i] = 0
  14. # 递归计算
  15. for i in range(1, T):
  16. for j in range(N):
  17. tmp = [delta[i-1, k]*A[k][j] for k in range(N)]
  18. delta[i,j] = max(tmp) * B[j][V.index(obs[i])]
  19. phi[i,j] = tmp.index(max(tmp))
  20. # 最终的概率及节点
  21. P = max(delta[T-1, :])
  22. I = int(np.argmax(delta[T-1, :]))
  23. # 最优路径path
  24. path = [I]
  25. for i in reversed(range(1, T)):
  26. end = path[-1]
  27. path.append(phi[i, end])
  28. hidden_states = [Q[i] for i in reversed(path)]
  29. return P, hidden_states
  30. def main():
  31. # 状态集合
  32. Q = ('欢乐谷', '迪士尼', '外滩')
  33. # 观测集合
  34. V = ['购物', '不购物']
  35. # 转移概率: Q -> Q
  36. A = [[0.8, 0.05, 0.15],
  37. [0.2, 0.6, 0.2],
  38. [0.2, 0.3, 0.5]
  39. ]
  40. # 发射概率, Q -> V
  41. B = [[0.1, 0.9],
  42. [0.8, 0.2],
  43. [0.3, 0.7]
  44. ]
  45. # 初始概率
  46. PI = [1/3, 1/3, 1/3]
  47. # 观测序列
  48. obs = ['不购物', '购物', '购物']
  49. P, hidden_states = Viterbi(A,B,PI,V,Q,obs)
  50. print('最大的概率为: %.5f.'%P)
  51. print('隐藏序列为:%s.'%hidden_states)
  52. main()

输出结果如下:

  1. 最大的概率为: 0.02688.
  2. 隐藏序列为:['外滩', '迪士尼', '迪士尼'].

  现在,你有很大的把握可以确定,你的女神去了外滩和迪士尼。

   注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

参考文献

  1. 一文搞懂HMM(隐马尔可夫模型):https://www.cnblogs.com/skyme/p/4651331.html
  2. 李航《统计学习方法》 清华大学出版社
  3. HMM与分词、词性标注、命名实体识别:http://www.hankcs.com/nlp/hmm-and-segmentation-tagging-named-entity-recognition.html
  4. Hidden Markov Models 1: http://docplayer.net/21306742-Hidden-markov-models-1.html
  5. 吴军 《数学之美》 人民邮电出版社

隐马尔可夫模型(HMM)及Viterbi算法的更多相关文章

  1. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...

  2. 基于隐马尔科夫模型(HMM)的地图匹配(Map-Matching)算法

    文章目录 1. 1. 摘要 2. 2. Map-Matching(MM)问题 3. 3. 隐马尔科夫模型(HMM) 3.1. 3.1. HMM简述 3.2. 3.2. 基于HMM的Map-Matchi ...

  3. 隐马尔科夫模型HMM学习最佳范例

    谷歌路过这个专门介绍HMM及其相关算法的主页:http://rrurl.cn/vAgKhh 里面图文并茂动感十足,写得通俗易懂,可以说是介绍HMM很好的范例了.一个名为52nlp的博主(google ...

  4. 猪猪的机器学习笔记(十七)隐马尔科夫模型HMM

    隐马尔科夫模型HMM 作者:樱花猪 摘要: 本文为七月算法(julyedu.com)12月机器学习第十七次课在线笔记.隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来 ...

  5. 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率

    隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...

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

    隐马尔科夫模型HMM(一)HMM模型基础 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比 ...

  7. 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数

    隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...

  8. 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列

    隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态 ...

  9. 用hmmlearn学习隐马尔科夫模型HMM

    在之前的HMM系列中,我们对隐马尔科夫模型HMM的原理以及三个问题的求解方法做了总结.本文我们就从实践的角度用Python的hmmlearn库来学习HMM的使用.关于hmmlearn的更多资料在官方文 ...

  10. HMM:隐马尔可夫模型HMM

    http://blog.csdn.net/pipisorry/article/details/50722178 隐马尔可夫模型 隐马尔可夫模型(Hidden Markov Model,HMM)是统计模 ...

随机推荐

  1. 处理Word文档中所有修订

    打开现有文档进行编辑 若要打开现有文档,您可以将 Word类实例化,如以下 using 语句所示. 为此,您可以使用Open(String, Boolean) 方法打开具有指定 fileName 的字 ...

  2. python对象的for迭代实现

    第一种:__iter__ 实现__iter__的对象,是可迭代对象.__iter__方法可以直接封装一个迭代器,从而实现for循环 class A: def __init__(self): self. ...

  3. Spring Boot中使用Spring Security进行安全控制转载来自翟永超

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(比如:Apache ...

  4. js 原型链解密

    1.对象继承 javaScript的继承不是通过class实现的,而是通过“原型对象”(prototype). 1.每一个函数都有一个原型对象 2.每一个实例对象都有一个_proto_属性 2.原型链 ...

  5. jQuery-少见获取元素的方式

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. JAVA程序CPU 100%问题排查

    做JAVA开发的同学一定遇到过的爆表问题,看这里解决  https://www.cnblogs.com/qcloud1001/p/9773947.html   本文由净地发表于云+社区专栏 记一次Ja ...

  7. Senparc.Weixin SDK 微信公众号 .NET 开发教程 索引

    Senparc.WeixinSDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大 ...

  8. 每天学点SpringCloud(五):如何使用高可用的Eureka

    前几篇文章我们讲了一下Eureka的基础使用,但是呢有一个很重要的问题,我们讲的都是单机版的情况,如果这个时候Eureka服务挂了的话,那么我们的服务提供者跟服务消费者岂不是都废了?服务提供者和消费者 ...

  9. nginx+lua学习

    1. nginx+lua学习 1.1. 网关架构 1.2. nginx命令和信号控制 nginx -s stop 快速关闭,不管有没有正在处理的请求 nginx -s quit 优雅关闭方式,推出前完 ...

  10. Spring面试底层原理的那些问题,你是不是真的懂Spring?

    1.什么是 Spring 框架?Spring 框架有哪些主要模块?Spring 框架是一个为 Java 应用程序的开发提供了综合.广泛的基础性支持的 Java 平台.Spring帮助开发者解决了开发中 ...