转载自 http://www.cnblogs.com/skyme/p/4651331.html

HMM(隐马尔可夫模型)是用来描述隐含未知参数的统计模型,举一个经典的例子:一个东京的朋友每天根据天气{下雨,天晴}决定当天的活动{公园散步,购物,清理房间}中的一种,我每天只能在twitter上看到她发的推“啊,我前天公园散步、昨天购物、今天清理房间了!”,那么我可以根据她发的推特推断东京这三天的天气。在这个例子里,显状态是活动,隐状态是天气。

HMM描述

任何一个HMM都可以通过下列五元组来描述:

  1. :param obs:观测序列
  2. :param states:隐状态
  3. :param start_p:初始概率(隐状态)
  4. :param trans_p:转移概率(隐状态)
  5. :param emit_p: 发射概率 (隐状态表现为显状态的概率)

例子描述

这个例子可以用如下的HMM来描述:

  1. states = ('Rainy', 'Sunny')
  2.  
  3. observations = ('walk', 'shop', 'clean')
  4.  
  5. start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
  6.  
  7. transition_probability = {
  8. 'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
  9. 'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
  10. }
  11.  
  12. emission_probability = {
  13. 'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
  14. 'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
  15. }

求解最可能的天气

求解最可能的隐状态序列是HMM的三个典型问题之一,通常用维特比算法解决。维特比算法就是求解HMM上的最短路径(-log(prob),也即是最大概率)的算法。

稍微用中文讲讲思路,很明显,第一天天晴还是下雨可以算出来:

  1. 定义V[时间][今天天气] = 概率,注意今天天气指的是,前几天的天气都确定下来了(概率最大)今天天气是X的概率,这里的概率就是一个累乘的概率了。

  2. 因为第一天我的朋友去散步了,所以第一天下雨的概率V[第一天][下雨] = 初始概率[下雨] * 发射概率[下雨][散步] = 0.6 * 0.1 = 0.06,同理可得V[第一天][天晴] = 0.24 。从直觉上来看,因为第一天朋友出门了,她一般喜欢在天晴的时候散步,所以第一天天晴的概率比较大,数字与直觉统一了。

  3. 从第二天开始,对于每种天气Y,都有前一天天气是X的概率 * X转移到Y的概率 * Y天气下朋友进行这天这种活动的概率。因为前一天天气X有两种可能,所以Y的概率有两个,选取其中较大一个作为V[第二天][天气Y]的概率,同时将今天的天气加入到结果序列中

  4. 比较V[最后一天][下雨]和[最后一天][天晴]的概率,找出较大的哪一个对应的序列,就是最终结果。

这个例子的Python代码:

  1. # -*- coding:utf-8 -*-
  2. # Filename: viterbi.py
  3. # Author:hankcs
  4. # Date: 2014-05-13 下午8:51
  5.  
  6. states = ('Rainy', 'Sunny')
  7.  
  8. observations = ('walk', 'shop', 'clean')
  9.  
  10. start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
  11.  
  12. transition_probability = {
  13. 'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
  14. 'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
  15. }
  16.  
  17. emission_probability = {
  18. 'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
  19. 'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
  20. }
  21.  
  22. # 打印路径概率表
  23. def print_dptable(V):
  24. print " ",
  25. for i in range(len(V)): print "%7d" % i,
  26. print
  27.  
  28. for y in V[0].keys():
  29. print "%.5s: " % y,
  30. for t in range(len(V)):
  31. print "%.7s" % ("%f" % V[t][y]),
  32. print
  33.  
  34. def viterbi(obs, states, start_p, trans_p, emit_p):
  35. """
  36.  
  37. :param obs:观测序列
  38. :param states:隐状态
  39. :param start_p:初始概率(隐状态)
  40. :param trans_p:转移概率(隐状态)
  41. :param emit_p: 发射概率 (隐状态表现为显状态的概率)
  42. :return:
  43. """
  44. # 路径概率表 V[时间][隐状态] = 概率
  45. V = [{}]
  46. # 一个中间变量,代表当前状态是哪个隐状态
  47. path = {}
  48.  
  49. # 初始化初始状态 (t == 0)
  50. for y in states:
  51. V[0][y] = start_p[y] * emit_p[y][obs[0]]
  52. path[y] = [y]
  53.  
  54. # 对 t > 0 跑一遍维特比算法
  55. for t in range(1, len(obs)):
  56. V.append({})
  57. newpath = {}
  58.  
  59. for y in states:
  60. # 概率 隐状态 = 前状态是y0的概率 * y0转移到y的概率 * y表现为当前状态的概率
  61. (prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states])
  62. # 记录最大概率
  63. V[t][y] = prob
  64. # 记录路径
  65. newpath[y] = path[state] + [y]
  66.  
  67. # 不需要保留旧路径
  68. path = newpath
  69.  
  70. print_dptable(V)
  71. (prob, state) = max([(V[len(obs) - 1][y], y) for y in states])
  72. return (prob, path[state])
  73.  
  74. def example():
  75. return viterbi(observations,
  76. states,
  77. start_probability,
  78. transition_probability,
  79. emission_probability)
  80.  
  81. print example()

输出:

  1. 0 1 2
  2. Rainy: 0.06000 0.03840 0.01344
  3. Sunny: 0.24000 0.04320 0.00259
  4. (0.01344, ['Sunny', 'Rainy', 'Rainy'])

NLP应用

具体到分词系统,可以将天气当成“标签”,活动当成“字或词”。那么,几个NLP的问题就可以转化为:

  • 词性标注:给定一个词的序列(也就是句子),找出最可能的词性序列(标签是词性)。如ansj分词和ICTCLAS分词等。

  • 分词:给定一个字的序列,找出最可能的标签序列(断句符号:[词尾]或[非词尾]构成的序列)。结巴分词目前就是利用BMES标签来分词的,B(开头),M(中间),E(结尾),S(独立成词)

  • 命名实体识别:给定一个词的序列,找出最可能的标签序列(内外符号:[内]表示词属于命名实体,[外]表示不属于)。如ICTCLAS实现的人名识别、翻译人名识别、地名识别都是用同一个Tagger实现的。

小结

HMM是一个通用的方法,可以解决贴标签的一系列问题。

HMM(隐马尔科夫模型)与分词、词性标注、命名实体识别的更多相关文章

  1. HMM隐马尔科夫模型

    这是一个非常重要的模型,凡是学统计学.机器学习.数据挖掘的人都应该彻底搞懂. python包: hmmlearn 0.2.0 https://github.com/hmmlearn/hmmlearn ...

  2. 自然语言处理(1)-HMM隐马尔科夫模型基础概念(一)

    隐马尔科夫模型HMM 序言 文本序列标注是自然语言处理中非常重要的一环,我先接触到的是CRF(条件随机场模型)用于解决相关问题,因此希望能够对CRF有一个全面的理解,但是由于在学习过程中发现一个算法像 ...

  3. HMM 隐马尔科夫模型

    参考如下博客: http://www.52nlp.cn/itenyh%E7%89%88-%E7%94%A8hmm%E5%81%9A%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8 ...

  4. HMM基本原理及其实现(隐马尔科夫模型)

    HMM(隐马尔科夫模型)基本原理及其实现 HMM基本原理 Markov链:如果一个过程的“将来”仅依赖“现在”而不依赖“过去”,则此过程具有马尔可夫性,或称此过程为马尔可夫过程.马尔可夫链是时间和状态 ...

  5. 基于隐马尔科夫模型(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 ...

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

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

  7. HMM 自学教程(四)隐马尔科夫模型

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  8. 隐马尔科夫模型(HMM)的概念

    定义隐马尔科夫模型可以用一个三元组(π,A,B)来定义:π 表示初始状态概率的向量A =(aij)(隐藏状态的)转移矩阵 P(Xit|Xj(t-1)) t-1时刻是j而t时刻是i的概率B =(bij) ...

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

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

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

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

随机推荐

  1. redis的哨兵模式

    我是在一台服务器上安装了三个redis  一主两从 想安装gcc gcc-c++ make tcl  lrzsz yum -y install gcc gcc-c++ make tcl  lrzsz ...

  2. block-chain

    维护一条链,只能增加记录,不能删除.修改. 去中心化,达到共识 密码学,保证交易无法抵赖和破坏 共识机制 PoW(Proof of Work),工作量证明,是一个博弈论的应用,来防止作恶. 示例:两个 ...

  3. hint不当索引,影响多表连接方式,最终导致SQL执行缓慢

    需求:一个SQL执行特别慢,无法返回结果,需要进行优化,最终返回结果即可. 一.SQL分析 二.尝试执行,观测执行计划 三.修改SQL 四.问题总结 一.SQL分析 )SQL文本,执行时间,执行用户 ...

  4. 双向重定向tee命令详解

    vim一般在训练网络的时候需要保存log文件,同时需要在屏幕上网络的输出信息,在shell文件中常常会看到如下代码 执行的命令 2>&1 | tee log.txt tee是linux中 ...

  5. [LeetCode&Python] Problem 860. Convert BST to Greater Tree

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  6. 20155219实验三 敏捷开发与XP实践

    实验内容 XP基础 XP核心实践 相关工具 敏捷开发与XP 1.敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法."敏捷流程"是一系列价值观 ...

  7. hdoj-1503 (LCS解的输出)

    题目链接 回溯输出解 #include <bits/stdc++.h> using namespace std; ; int dp[N][N],dir[N][N]; char s1[N], ...

  8. 洛谷P2568 GCD(线性筛法)

    题目链接:传送门 题目: 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 ...

  9. CentOS安装LibreOffice

    查找yum源的安装包$ yum search libreoffice 查看yum源上安转包基本信息$ yum info libreoffice可安装的软件包名称 :libreoffice架构 :x86 ...

  10. hdu4998 Rotate 计算几何

    Noting is more interesting than rotation! Your little sister likes to rotate things. To put it easie ...