HMM到底是一个什么样的东西,我想从我研究的一个应用场景开始说起。之所以想重新描述一下我对HMM的理解,是因为上次面试百度糯米的时候,自己没有把HMM在应用上说的很明白,不过糯米的那位郑姓面试官我也是服,盛气凌人完全不是招聘的样子啊,罢了,还是自己准备的不够充分,特来博客上总结一发。

  我所研究的问题,概括来讲,就是缩略语的还原。且看下面的图1所示的例子:

  图示很直观,怎么把网络中经常出现的武大电信院,还原为武汉大学电子信息学院呢?类似的例子还有很多,这里不再一一列举。可以说,缩略语的使用在汉语中是非常普遍的现象。如果采用字典查找的方法,当然也可以取得不错的准确率,前提是你构造的字典要足够完备,显然这种方法无法解决新登录缩略语的还原问题。这个场景,如何应用在HMM模型上,我想从这个图中,便可以很直观的感受出来:将待还原的缩略语看成是观测序列,而将缩略语对应的原短语,看成是隐马尔可夫链中的隐藏序列。这样,根据缩略语,寻找最有可能输出该缩略语的原短语,便成为了一个典型的隐马尔可夫模型的求解问题,使用Viterbi算法,便可以轻松的求解出来。

  我们知道,HMM模型是基于三个假设产生的,那么这三个假设,在这个应用场景中,分别有什么意义呢?如下:

  1)马尔科夫假设,即一阶马尔科夫假设。它的意思就是,下一个状态只依赖于其前一个状态,而和之前的其他状态无关(因此,由于第一个状态没有前一个状态,HMM会有一个参数pi,表示各个状态在马尔科夫链第一个位置出现的概率的大小,状态如不特别声明,都是指的隐藏状态,下同)。这里,拿武汉-大学-电子三个状态来讲,电子只依赖于大学,而和武汉没有关系。这里显然可以根据实际的应用问题,将该假设扩展为高阶假设。

  2)不动性假设,也就是时间无关性假设。它的意思是说,状态i转移到状态j,在马尔科夫链上的任何位置发生的概率,是一样大的。在这个例子里面,我们可以这样理解:武汉这个状态i,出现在马尔科夫链的开头时,它转移到大学这个状态j的概率,和武汉出现在马尔科夫链的其他位置转移到大学这个状态的概率,是一样大的。但是这样的假设,在这个应用问题上,显然不是十分合适的,因为按照我们的经验来看,特定的位置上,一般会发生特定类型的转移,比如当武汉这个状态出现在比较靠前的位置,那么其转移到大学这个状态的概率就会大一些。

  3)输出独立性假设。即当然得输出状态,仅和当前的隐藏状态有关,而和其他的状态没有关系。这个显然不是很好扩展,而且该假设很大的降低了计算复杂度。试想一下,如果每次你还要计算其他N个状态对该输出的影响,那么计算量是相当可怕的。但是,我们可以利用时间信息来影响输出概率。这显然是合理的,比如,当武汉这个状态出现在马尔科夫链的head处,则其输出“武”这个观测状态的概率,就需要增大,需要进行一定的加权。

  这便是HMM的三个假设在该问题上的应用含义。可是,我们要利用HMM解决这个问题,需要哪些数据?我们又该如何进行,模型训练和模型求解呢?这其实就是HMM的三个基本问题:评估问题(数据集的似然概率),解码问题(找出最有可能的隐藏状态序列)以及学习问题(根据数据集训练模型参数)。HMM有三个基本的参数,A,B和pi,假设我们有N个隐藏状态,M个观测状态,则A是N阶矩,B则是N*M大小的矩阵,pi则是1*N的向量(表示第i个状态出现在位置0的概率大小)。那么在这个问题上,我们首先要确定什么是隐藏状态和观测状态。观测状态其实就是缩略语中的每一个字符,而隐藏状态则是中文词表。然而为了减小计算量,我们可以将那些不含有观测状态字符的词,生成该观测状态的概率,设置为0

  需要什么数据呢?首先,HMM的训练是一个非监督的训练(Baum-Welch算法接下来再讲解),我们只需要拿到观测序列的集合即可完成模型的EM方法求解。这是书上说的,但是要这么做,就需要先随机的初始化A和B,再不济你也可以设置A和B均匀分布,这样便可以生成任何的观测序列。然而,这样不负责任的初始化,很容易陷入局部最优解的问题,而且数学之美上也提到过,Baum-Welch算法一般没有监督方法得到的解好,但是监督训练需要大量的人工标注。因此,一般来讲,我们可以拿一份标注的数据,通过标注和统计,将A和B进行一次初始化,然后进行Baum-Welch的迭代优化。而且,由于在我的扩展中,我还需要统计位置信息,所以确实标注一下进行初始化是一个不错的选择,但是,这并不是必须的

白话HMM系列1——从一个缩略语还原的例子说起的更多相关文章

  1. 用Qt写软件系列三:一个简单的系统工具(上)

    导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...

  2. [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    [0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...

  3. E - 小晴天老师系列——我有一个数列!

    E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/O ...

  4. [大数据从入门到放弃系列教程]第一个spark分析程序

    [大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...

  5. acdream 小晴天老师系列——我有一个数列! (ST算法)

    小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)S ...

  6. 【ABAP系列】SAP 一个完整的SAP的Abap例子(idoc,edi文件的相互转换)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 一个完整的SAP的Aba ...

  7. hdu1465不easy系列之中的一个(错排)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/37512659 转载请注明出 ...

  8. 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)

    [SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...

  9. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...

随机推荐

  1. Android(java)学习笔记33:注册广播接收者

    1. 下面我们先看一部分代码,由代码进行进一步的深入: registerReceiver( new BroadcastReceiver() {//onReceive中代码的执行时间不要超过5s,and ...

  2. LA 4254 贪心

    题意:有 n 个工作,他的允许的工作时间是 [l,r] ,工作量是 v ,求CPU最速度的最小值. 分析: 可能太久没有做题了,竟然脑子反应好慢的.还是很容易想到二分,但是二分怎么转移呢? 可以看出, ...

  3. PS中会使用到的快捷键有那些?

    P.S:我刚刚在百度上,搜了一些关于PS的快捷键的使用. 我把它总结了一下.对我今后的P图有所帮助. PS的所有快捷键 1. 显示/隐藏选择区域 [Ctrl]+[H] 2. 取消当前命令:Esc: 工 ...

  4. Hive UDF 用户自定义函数 编程及使用

    首先创建工程编写UDF 代码,示例如下: 1. 新建Maven项目 udf 本机Hadoop版本为2.7.7, Hive版本为1.2.2,所以选择对应版本的jar ,其它版本也不影响编译. 2. po ...

  5. 【洛谷P1265】公路修建

    公路修建 题目链接 分析题意,可以发现,在(1)的条件下,(2)的情况是不会发生的, 于是直接求MST(Min Set Tree) 然而稠密图克鲁斯卡尔会TLE,建图还会爆空间, 所以用prime,用 ...

  6. css ul dl dt 表格分页 文本框样式

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  7. Flask—05-理解掌握flask数据模型(01)

    数据模型 数据库回顾 分类: 关系型数据库:MySQL.sqlite.… 非关系型数据库:Redis.MongoDB.… 操作: 执行原生SQL语句,每次都需要拼接SQL语句,非常繁琐而且特别容易出错 ...

  8. 02-第一个iOS程序-开发步骤

    打开Xcode 选择项目模板 Single View Application是最适合初学者的模板 设置项目属性 运行程序 不管怎样,先运行第一个iOS程序看看效果先(用快捷键Command + R 也 ...

  9. call、apply和bind的用法

    在改变 this 指向的时候,经常会把这三个方法混淆,下面就详细的整理一下三者的用法和区别 call() 方法 call() 方法可以有无数个参数 第一个参数是改变 this 指向的对象 后面的参数直 ...

  10. Plupload+easyui+springmvc实现批量上传

    demo下载(java项目):http://pan.baidu.com/s/1ntmoGEd 可兼容所有常用浏览器,当前版本为V1.5.4,如果不兼容,肯定是你没有调试好啊 1.jsp代码 <% ...