隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。

The HMM is a generative probabilistic model, in which a sequence of observable X variables is generated by a sequence of internal hidden states Z. The hidden states are not be observed directly. The transitions between hidden states are assumed to have the form of a (first-order) Markov chain. They can be specified by the start probability vector π and a transition probability matrix A. The emission probability of an observable can be any distribution with parameters B conditioned on the current hidden state. The HMM is completely determined by π, A and B.

From http://hmmlearn.readthedocs.io/en/latest/tutorial.html

举例来说,假设对于隐居室内的人,天气是隐含状态,海藻是可观察状态,海藻的状态和天气之间存在联系,通过观察海藻的状态来预测天气的状态。

如果使用HMM模型,我们需要知道天气的初始状态,天气的状态转移矩阵和海藻的状态转移矩阵。

概念

  • A - 隐含状态转移概率矩阵。
    描述了HMM模型中各个状态之间的转移概率。其中Aij = P( Sj | Si ),1≤i,j≤N,表示在 t 时刻、状态为 Si 的条件下,在 t+1 时刻状态是 Sj 的概率。

  • B - 观测状态转移概率矩阵,也称为混淆矩阵
    令N代表隐含状态数目,M代表可观测状态数目,则:Bij = P( Oi | Sj ), 1≤i≤M,1≤j≤N,表示在 t 时刻、隐含状态是 Sj 条件下,观察状态为 Oi 的概率。

  • π - 初始状态概率矩阵
    表示隐含状态在初始时刻t=1的概率矩阵,(例如t=1时,P(S1)=p1、P(S2)=P2、P(S3)=p3,则初始状态概率矩阵 π=[ p1 p2 p3 ].

对于包含M个客观察状态和N个隐含状态的HMM模型来说,用**λ={ π, A, B }**来表示HMM的参数。

HMM可以解决的问题

  • 根据可观察状态的序列找到一个最可能的隐藏状态序列

一个广泛使用的例子,就是使用HMM+Viterbi算法完成词性标注任务。

  • 已知模型参数,计算某一给定可观察状态序列的概率

  • 根据观察到的序列集来找到一个最有可能的 HMM
    Given just the observed data, estimate the model parameters.

The first and the second problem can be solved by the dynamic programming algorithms known as the Viterbi algorithm and the Forward-Backward algorithm, respectively. The last one can be solved by an iterative Expectation-Maximization (EM) algorithm, known as the Baum-Welch algorithm.

三个重要假设

这三个假设并不现实。

假设1:马尔可夫假设(状态构成一阶马尔可夫链)

假设2:不动性假设(状态与具体时间无关)

假设3:输出独立性假设(输出仅与当前状态有关)

举例说明

医生给村民看病,不能直接确定是"感冒"还是"健康",医生问诊村民有三种结果:正常,冷和发烧。

有没有病和村民的回答有关联,已知在有病的情况下,村民感觉正常,冷和发烧的概率。也知道在没病情况下对应的正常,冷和发烧的概率。

村民也告知了医生过去三天的情况是:正常,冷,发烧。

问题:过去三天,村民的健康状况?

分析

假设时间序列为t0, t1, t2. 那么有病和没病可以获得的可观察状态为:

每天可计算出六个概率,由"有病"导致的"正常"或者"无病"导致的"正常"会有两个概率,这时我们选择概率较大的作为第一天的状态。然后,计算t1。

根据马尔可夫链原则,t1只和t0的状态有关,对所有状态进行遍历,求从前一时刻的状态过渡到遍历状态,并且输出了观察状态的概率。

对每一个当前时刻的遍历状态:
p = 前一时刻某一状态的概率 X 状态转移矩阵中前一时刻某一状态的转移概率 X 发射矩阵中输出观察状态的概率

max§ = 对前一时刻各种状态按上公式求概率,然后使用最大值。在求最大值的同时也就确定了路径。

Codes: Github

# -*- coding: utf-8 -*-
# Python3
states = ('Healthy', 'Fever')
observations = ('normal', 'cold', 'dizzy')
start_probability = {'Healthy': 0.6, 'Fever': 0.4}transition_probability = {'Healthy' : {'Healthy': 0.7, 'Fever': 0.3},'Fever' : {'Healthy': 0.4, 'Fever': 0.6},}emission_probability = {'Healthy' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},}# Helps visualize the steps of Viterbi.
def print_dptable(V):print("    "),for i in range(len(V)): print("%7d" % i,)for y in V[0].keys():print("%.6s: " % y,)for t in range(len(V)):print("%.7s" % ("%f" % V[t][y]),)printdef viterbi(obs, states, start_p, trans_p, emit_p):V = [{}]path = {}# Initialize base cases (t == 0)for y in states:V[0][y] = start_p[y] * emit_p[y][obs[0]]path[y] = [y]# Run Viterbi for t > 0for t in range(1,len(obs)):V.append({})newpath = {}for y in states:(prob, state) = max([(V[t-1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states])V[t][y] = probnewpath[y] = path[state] + [y]print("t%d's path" % t, newpath)# Don't need to remember the old pathspath = newpathprint_dptable(V)(prob, state) = max([(V[len(obs) - 1][y], y) for y in states])return (prob, path[state])def example():return viterbi(observations,states,start_probability,transition_probability,emission_probability)
print(example())

运行结果:

通俗理解

A序列是已知的,状态有限,比如:a1, a2, a1, a3。B序列也是状态有限,但是不知道B序列的排列。A序列及B序列内在有联系,得知在B序列状态转移会对应A序列状态转移的一个概率矩阵。维特比就是计算在这种情况下,B序列的最大可能序列。

维特比算法依赖于假设条件:A,B序列中每个值只和它前一个值相关,也就是A,B序列都是一阶马尔可夫链。从B状态观察A的状态和时间无关。

Refers

[Rabiner89] Lawrence R. Rabiner “A tutorial on hidden Markov models and selected applications in speech recognition”, Proceedings of the IEEE 77.2, pp. 257-286, 1989.

[Bilmes98] Jeff A. Bilmes, “A gentle tutorial of the EM algorithm and its application to parameter estimation for Gaussian mixture and hidden Markov models.”, 1998.

维特比算法

隐马尔可夫模型(HMM)攻略

隐马尔科夫模型和维特比算法相关推荐

  1. 中文分词与马尔科夫模型之二:隐马尔科夫模型与维特比

    转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebv.html 前面一篇博客讲到了中文分词的机械分词算法,这种算法实现相对比较简单,但是分词效果还是有 ...

  2. HMM学习笔记2 隐马尔科夫模型与前向算法

    一 序 本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,有大佬做了二次整理,参见:https://blog.csdn.ne ...

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

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

  4. 隐马尔可夫模型HMM+维特比算法(Viterbi Algorithm)进行词性标注代码实现(自然语言处理课程第二次作业)

    文章目录 一.理论描述 二.算法描述 三.详例描述 具体过程 分析题目 数据预处理 转移概率矩阵: 发射概率矩阵: HMM+维特比算法进行词性标注 开始进行词性标注: The: bear: is: o ...

  5. 【隐马尔可夫模型】维特比算法matlab实现

    %隐马尔可夫模型维特比算法:求最优路径I %输入模型(A,B,pai),观测O=(o1,o2,...oT) %A状态转移概率矩阵 %B观测概率矩阵 %pai初始状态概率矩阵 %T总时刻,N状态数 %Q ...

  6. 隐马尔科夫模型HMM之Baum-Welch算法Python代码实现

    ☕️ 本文系列文章汇总: (1)HMM开篇:基本概念和几个要素 (2)HMM计算问题:前后向算法 代码实现 (3)HMM学习问题:Baum-Welch算法 (4)  HMM预测问题:维特比算法 本篇算 ...

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

    文章目录 四.学习算法 1.监督学习方法 2.非监督学习方法(Baum-Welch算法) 五.预测算法 1.近似算法 2.维特比算法 (1)最优路径特性 (2)两个变量 (3)维特比算法流程 隐马尔科 ...

  8. 从零开始学NLP(八) 隐马尔科夫模型(超详细)

    目录 前言 一.HMM基础 二.HMM定义 三.HMM的三个基本问题 1.概率计算问题 2. 学习问题 3.预测问题 四.HMM中的参数估计 1.前向算法 2.后向算法 五.HMM实例 总结 前言 上 ...

  9. 隐马尔科夫模型HMM之前后向算法Python代码实现,包括2个优化版本

    ☕️ 本文系列文章汇总: (1)HMM开篇:基本概念和几个要素 (2)HMM计算问题:前后向算法 (3)HMM学习问题:Baum-Welch算法 (4)  HMM预测问题:维特比算法 本篇算法原理分析 ...

最新文章

  1. Java语言中的数据类型
  2. 1+1大于2 联想借东风破浪HPC市场
  3. 前端开发者必备的Nginx知识
  4. 网络推广外包专员浅析为什么说企业网站都需要网络推广外包?
  5. 解决: Cannot find module ‘webpack-cli/bin/config-yargs‘、Error: Cannot find module ‘webpack-cli‘
  6. switch 字符串 java_JDK7新特性switch支持字符串
  7. c语言运行给拦截了怎么办,[蓝桥杯][算法训练VIP]拦截导弹 (C语言代码)
  8. 理解TCP/IP协议
  9. linux c程序 bash,linux-如何使bash程序接受来自另一个C程序的命令
  10. 41. Element getElementsByTagName() 方法
  11. 电阻、电容、电感、半导体器件的失效分析
  12. 密钥分发中心KDC 对称密钥分发中心 P112
  13. Oracle ORA-00955名称已由现有对象使用
  14. android锁屏密码文件夹,深入理解Android M 锁屏密码存储方式
  15. Unity开发基础——使用字符串学习笔记
  16. 【ROS基础】rosbag 的使用方法
  17. java.util. 什么意思_java.util中,util是什么意义
  18. 韦东山嵌入式第一期学习笔记DAY_1——2_0_安装ubuntu16.04虚拟机
  19. 好片推荐---《WALL·E》(又名《机器人瓦力》
  20. python 矩阵类型转换_Python 矩阵转置的几种方法小结

热门文章

  1. 【负荷预测】基于蚂蚁优化算法的BP神经网络在负荷预测中的应用研究(Matlab完整代码实现)
  2. 匿名社交APP都是死于同一个问题,关系重大却注定无解?
  3. 那个写书教你交易期权的人James Cordier爆仓了
  4. yy本次操作由于这台计算机的限制而被取消,技术员讲诉win7系统运行yy提示本次操作由于这台计算机的限制而被取消的还原办法...
  5. 生活杂项 网页版加速播放代码
  6. 边走边充电:15岁少年发明手机充电鞋
  7. JavaScript 数组及数组函数常用方法(完全版)
  8. win10自带虚拟机好用吗_Win10自带虚拟机HyperV安装win7教程详解
  9. android tablelayout 多行,Android入门户五篇之TableLayout (二)//生成10行,8列的表格
  10. 牛客编程巅峰赛S2第5场 - 钻石王者 C.Tree III