最详细最容易理解的HMM文章

最详细最容易理解的HMM文章

https://blog.csdn.net/daringpig/article/details/8072794
http://www.52nlp.cn/hmm-learn-best-practices-four-hidden-markov-models

核心目的:对于一个特殊的隐马尔科夫模型(HMM)及一个相应的观察序列,我们常常希望能找到生成此序列最可能的隐藏状态序列。

我们使用一个隐马尔科夫模型(HMM)对这些例子建模。这个模型包含两组状态集合和三组概率集合:

* 隐藏状态:一个系统的(真实)状态,可以由一个马尔科夫过程进行描述(例如,天气)。

* 观察状态:在这个过程中‘可视’的状态(例如,海藻的湿度)。

* 向量:包含了(隐)模型在时间t=1时一个特殊的隐藏状态的概率(初始概率)。

* 状态转移矩阵:包含了一个隐藏状态到另一个隐藏状态的概率

* 混淆矩阵:包含了给定隐马尔科夫模型的某一个特殊的隐藏状态,观察到的某个观察状态的概率。

因此一个隐马尔科夫模型是在一个标准的马尔科夫过程中引入一组观察状态,以及其与隐藏状态间的一些概率关系。

wiki上一个比较好的HMM例子

HMM(隐马尔科夫模型)是自然语言处理中的一个基本模型,用途比较广泛,如汉语分词、词性标注及语音识别等,在NLP中占有很重要的地位。网上关于HMM的介绍讲解文档很多,我自己当时开始看的时候也有点稀里糊涂。后来看到wiki上举得一个关于HMM的例子才如醍醐灌顶,忽然间明白HMM的三大问题是怎么回事了。例子我借助中文wiki重新翻译了一下,并对三大基本问题进行说明,希望对读者朋友有所帮助:

  Alice 和Bob是好朋友,但是他们离得比较远,每天都是通过电话了解对方那天作了什么.Bob仅仅对三种活动感兴趣:公园散步,购物以及清理房间.他选择做什么事情只凭当天天气.Alice对于Bob所住的地方的天气情况并不了解,但是知道总的趋势.在Bob告诉Alice每天所做的事情基础上,Alice想要猜测Bob所在地的天气情况.
  Alice认为天气的运行就像一个马尔可夫链. 其有两个状态 “雨”和”晴”,但是无法直接观察它们,也就是说,它们对于Alice是隐藏的.每天,Bob有一定的概率进行下列活动:”散步”, “购物”, 或 “清理”. 因为Bob会告诉Alice他的活动,所以这些活动就是Alice的观察数据.这整个系统就是一个隐马尔可夫模型HMM.
  Alice知道这个地区的总的天气趋势,并且平时知道Bob会做的事情.也就是说这个隐马尔可夫模型的参数是已知的.可以用程序语言(Python)写下来:
   // 状态数目,两个状态:雨或晴
   states = (‘Rainy’, ‘Sunny’)
   // 每个状态下可能的观察值
   observations = (‘walk’, ’shop’, ‘clean’)            
   //初始状态空间的概率分布
   start_probability = {‘Rainy’: 0.6, ‘Sunny’: 0.4}
   // 与时间无关的状态转移概率矩阵
   transition_probability = {
   ’Rainy’ : {‘Rainy’: 0.7, ‘Sunny’: 0.3},
   ’Sunny’ : {‘Rainy’: 0.4, ‘Sunny’: 0.6},
   }
   //给定状态下,观察值概率分布,发射概率
   emission_probability = {
   ’Rainy’ : {‘walk’: 0.1, ’shop’: 0.4, ‘clean’: 0.5},
   ’Sunny’ : {‘walk’: 0.6, ’shop’: 0.3, ‘clean’: 0.1},
   }
  在这些代码中,start_probability代表了Alice对于Bob第一次给她打电话时的天气情况的不确定性(Alice知道的只是那个地方平均起来下雨多些).在这里,这个特定的概率分布并非平衡的,平衡概率应该接近(在给定变迁概率的情况下){‘Rainy’: 0.571, ‘Sunny’: 0.429}。 transition_probability 表示马尔可夫链下的天气变迁情况,在这个例子中,如果今天下雨,那么明天天晴的概率只有30%.代码emission_probability 表示了Bob每天作某件事的概率.如果下雨,有 50% 的概率他在清理房间;如果天晴,则有60%的概率他在外头散步。
  Alice和Bob通了三天电话后发现第一天Bob去散步了,第二天他去购物了,第三天他清理房间了。Alice现在有两个问题:这个观察序列“散步、购物、清理”的总的概率是多少?(注:这个问题对应于HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)?) 最能解释这个观察序列的状态序列(晴/雨)又是什么?(注:这个问题对应HMM基本问题之二:给定观察序列O=O1,O2,…OT以及模型λ,如何选择一个对应的状态序列S = q1,q2,…qT,使得S能够最为合理的解释观察序列O?)
  至于HMM的基本问题之三:如何调整模型参数, 使得P(O|λ)最大?这个问题事实上就是给出很多个观察序列值,来训练以上几个参数的问题。

HMM学习最佳范例与崔晓源的博客

  “HMM学习最佳范例”与“崔晓源的博客”本来是不搭边的,由于自己花了几乎一个晚上浏览崔师兄的博客,没有时间写文章了,所以最终决定放在这里做成大杂烩,不过我觉得这个大杂烩还是有点价值的。
  先说说HMM,通过Google Analytics 发现,读者经常通过与“隐马尔科夫模型、HMM”相关的关键字访问52nlp的,因为这里曾经写了一篇简单的介绍HMM的文章。事实上,对于HMM,由于自己没有直接实践过,仅停留在“纸上得来”的程度,所以心里也虚。某天赶巧遇到了国外这个专门介绍HMM及其相关算法的主页:http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/main.html
  里面图文并茂还动感十足,写得又通俗易懂,可以说是我见到过的介绍HMM最好的范例了。读完了立即有翻译全文的冲动,这样一方面可以给有需要的读者以帮助,另一方面翻译虽然耗时,但却能仔细把握一下比较细节的地方,这也是我翻译“MIT自然语言处理”的初衷。不过Google了一下,发现已经有人把这件事做了,这个人就是崔晓源,中文译名是“隐马尔科夫模型HMM自学”。
  原计划这一篇博客题目为“HMM学习最佳范例”的,准备介绍这个英文主页和崔晓源的翻译,出于尊重译者劳动的缘故,Google“隐马尔科夫模型HMM自学”,可是发现其被转载了很多,除了知道译者是“崔晓源”外,原始出处似乎被丢失了。不过最终还是找到了原始出处:
  http://blogcui.spaces.live.com/blog/cns!46BDB23E24219CE9!144.entry?_c=BlogPart
  其实就是崔师兄在msn spaces上的博客,仔细对比了一下原文,发现崔师兄的这个翻译是一个简化和缩略版本,有些地方只是概况性的翻译了一下,省去了一些内容,所以这个介绍HMM主页还有再翻译的必要。有可能的话,今后在52nlp上我会慢慢翻译HMM这个系列。
  对比完之后,我就浏览开他的博客了,没想到,一发而不可收,主要在于他的博客多数内容都很有价值。博客最集中更新的一段时间,是在05年5月到9月份他在MSRA-NLC组实习的时候,不过可惜的是,现在几乎不更新了,但是技术博客的好处再于其有效期更长,所以许多东西仍很可以参考,读者如果对NLP,IR或者机器学习感兴趣,不妨按时间顺序读读他的日志,定会有不小收获的,这里绝非广告。他目前在MSRA工作,以下是他的“About me”:
  ”A man full of enthusiasm for advanced technology business, natrual language processing, IR and search engine technology. I’m finding my way. You never do a bad job only if you choose the right time. So keep your pace accordingly.“
  我在上面最大的发现是这个关于机器学习的英文博客:

几种不同程序语言的HMM版本

  “纸上得来终觉浅,绝知此事要躬行”,在继续翻译《HMM学习最佳范例》之前,这里先补充几个不同程序语言实现的HMM版本,主要参考了维基百科。读者有兴趣的话可以研究一下代码,这样对于HMM的学习会深刻很多!

C语言版:
1、 HTK(Hidden Markov Model Toolkit):
  HTK是英国剑桥大学开发的一套基于C语言的隐马尔科夫模型工具箱,主要应用于语音识别、语音合成的研究,也被用在其他领域,如字符识别和DNA排序等。HTK是重量级的HMM版本。
  HTK主页:http://htk.eng.cam.ac.uk/
2、 GHMM Library:
  The General Hidden Markov Model library (GHMM) is a freely available LGPL-ed C library implementing efficient data structures and algorithms for basic and extended HMMs.
  GHMM主页:http://www.ghmm.org/
3、 UMDHMM(Hidden Markov Model Toolkit):
  Hidden Markov Model (HMM) Software: Implementation of Forward-Backward, Viterbi, and Baum-Welch algorithms.
  这款属于轻量级的HMM版本。
  UMDHMM主页:http://www.kanungo.com/software/software.html

Java版:
4、 Jahmm Java Library (general-purpose Java library):
  Jahmm (pronounced “jam”), is a Java implementation of Hidden Markov Model (HMM) related algorithms. It’s been designed to be easy to use (e.g. simple things are simple to program) and general purpose.
  Jahmm主页:http://code.google.com/p/jahmm/

Malab版:
5、 Hidden Markov Model (HMM) Toolbox for Matlab:
  This toolbox supports inference and learning for HMMs with discrete outputs (dhmm’s), Gaussian outputs (ghmm’s), or mixtures of Gaussians output (mhmm’s).
  Matlab-HMM主页:http://www.cs.ubc.ca/~murphyk/Software/HMM/hmm.html

Common Lisp版:
6、CL-HMM Library (HMM Library for Common Lisp):
  Simple Hidden Markov Model library for ANSI Common Lisp. Main structures and basic algorithms implemented. Performance speed comparable to C code. It’s licensed under LGPL.
  CL-HMM主页:http://www.ashrentum.net/jmcejuela/programs/cl-hmm/

Haskell版:
7、The hmm package (A Haskell library for working with Hidden Markov Models):
  A simple library for working with Hidden Markov Models. Should be usable even by people who are not familiar with HMMs. Includes implementations of Viterbi’s algorithm and the forward algorithm.
  Haskell-HMM主页:http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hmm
  注:Haskell是一种纯函数式编程语言,它的命名源自美国数学家Haskell Brooks Curry,他在数学逻辑方面上的工作使得函数式编程语言有了广泛的基础。

  是否还有C++版、Perl版或者Python版呢?欢迎补充!

HMM学习最佳范例一:介绍

  隐马尔科夫模型(HMM)依然是读者访问“我爱自然语言处理”的一个热门相关关键词,我曾在《HMM学习最佳范例与崔晓源的博客》中介绍过国外的一个不错的HMM学习教程,并且国内崔晓源师兄有一个相应的翻译版本,不过这个版本比较简化和粗略,有些地方只是概况性的翻译了一下,省去了一些内容,所以从今天开始计划在52nlp上系统的重新翻译这个学习教程,希望对大家有点用。

一、介绍(Introduction)

  我们通常都习惯寻找一个事物在一段时间里的变化模式(规律)。这些模式发生在很多领域,比如计算机中的指令序列,句子中的词语顺序和口语单词中的音素序列等等,事实上任何领域中的一系列事件都有可能产生有用的模式。
  考虑一个简单的例子,有人试图通过一片海藻推断天气——民间传说告诉我们‘湿透的’海藻意味着潮湿阴雨,而‘干燥的’海藻则意味着阳光灿烂。如果它处于一个中间状态(‘有湿气’),我们就无法确定天气如何。然而,天气的状态并没有受限于海藻的状态,所以我们可以在观察的基础上预测天气是雨天或晴天的可能性。另一个有用的线索是前一天的天气状态(或者,至少是它的可能状态)——通过综合昨天的天气及相应观察到的海藻状态,我们有可能更好的预测今天的天气。
  这是本教程中我们将考虑的一个典型的系统类型。
  首先,我们将介绍产生概率模式的系统,如晴天及雨天间的天气波动。
      然 后 , 我 们 将 会 看 到 这 样 一 个 系 统 , 我 们 希 望 预 测 的 状 态 并 不 是 观 察 到 的 — — 其 底 层 系 统 是 隐 藏 的 。     在 上 面 的 例 子 中 , 观 察 到 的 序 列 将 是 海 藻 而 隐 藏 的 系 统 将 是 实 际 的 天 气 。
  最后,我们会利用已经建立的模型解决一些实际的问题。对于上述例子,我们想知道:
  1. 给出一个星期每天的海藻观察状态,之后的天气将会是什么?
  2. 给定一个海藻的观察状态序列,预测一下此时是冬季还是夏季?直观地,如果一段时间内海藻都是干燥的,那么这段时间很可能是夏季,反之,如果一段时间内海藻都是潮湿的,那么这段时间可能是冬季。

二、生成模式(Generating Patterns)

1、确定性模式(Deterministic Patterns)

  考虑一套交通信号灯,灯的颜色变化序列依次是红色-红色/黄色-绿色-黄色-红色。这个序列可以作为一个状态机器,交通信号灯的不同状态都紧跟着上一个状态。
hmm确定性模式
    
  注意每一个状态都是唯一的依赖于前一个状态,所以,如果交通灯为绿色,那么下一个颜色状态将始终是黄色——也就是说,该系统是确定性的。确定性系统相对比较容易理解和分析,因为状态间的转移是完全已知的。

2、非确定性模式(Non-deterministic patterns)

  为了使天气那个例子更符合实际,加入第三个状态——多云。与交通信号灯例子不同,我们并不期望这三个天气状态之间的变化是确定性的,但是我们依然希望对这个系统建模以便生成一个天气变化模式(规律)。
  一种做法是假设模型的当前状态仅仅依赖于前面的几个状态,这被称为马尔科夫假设,它极大地简化了问题。显然,这可能是一种粗糙的假设,并且因此可能将一些非常重要的信息丢失。
  当考虑天气问题时,马尔科夫假设假定今天的天气只能通过过去几天已知的天气情况进行预测——而对于其他因素,譬如风力、气压等则没有考虑。在这个例子以及其他相似的例子中,这样的假设显然是不现实的。然而,由于这样经过简化的系统可以用来分析,我们常常接受这样的知识假设,虽然它产生的某些信息不完全准确。

  一个马尔科夫过程是状态间的转移仅依赖于前n个状态的过程。这个过程被称之为n阶马尔科夫模型,其中n是影响下一个状态选择的(前)n个状态。最简单的马尔科夫过程是一阶模型,它的状态选择仅与前一个状态有关。这里要注意它与确定性系统并不相同,因为下一个状态的选择由相应的概率决定,并不是确定性的。
  下图是天气例子中状态间所有可能的一阶状态转移情况:
  这里写图片描述
    
  对于有M个状态的一阶马尔科夫模型,共有个状态转移,因为任何一个状态都有可能是所有状态的下一个转移状态。每一个状态转移都有一个概率值,称为状态转移概率——这是从一个状态转移到另一个状态的概率。所有的个概率可以用一个状态转移矩阵表示。注意这些概率并不随时间变化而不同——这是一个非常重要(但常常不符合实际)的假设。
  下面的状态转移矩阵显示的是天气例子中可能的状态转移概率:
这里写图片描述

也就是说,如果昨天是晴天,那么今天是晴天的概率为0.5,是多云的概率为0.375。注意,每一行的概率之和为1。
  要初始化这样一个系统,我们需要确定起始日天气的(或可能的)情况,定义其为一个初始概率向量,称为 π π 向量。
  这里写图片描述        
  -也就是说,第一天为晴天的概率为1。
  现在我们定义一个一阶马尔科夫过程如下:
   状态:三个状态——晴天,多云,雨天。
    π π 向量:定义系统初始化时每一个状态的概率。
   状态转移矩阵:给定前一天天气情况下的当前天气概率。
  任何一个可以用这种方式描述的系统都是一个马尔科夫过程。

3、总结

  我们尝试识别时间变化中的模式,并且为了达到这个目我们试图对这个过程建模以便产生这样的模式。我们使用了离散时间点、离散状态以及做了马尔科夫假设。在采用了这些假设之后,系统产生了这个被描述为马尔科夫过程的模式,它包含了一个向量(初始概率)和一个状态转移矩阵。关于假设,重要的一点是状态转移矩阵并不随时间的改变而改变——这个矩阵在整个系统的生命周期中是固定不变的。

三、隐藏模式(Hidden Patterns)

1、马尔科夫过程的局限性

  在某些情况下,我们希望找到的模式用马尔科夫过程描述还显得不充分。回顾一下天气那个例子,一个隐士也许不能够直接获取到天气的观察情况,但是他有一些水藻。民间传说告诉我们水藻的状态与天气状态有一定的概率关系——天气和水藻的状态是紧密相关的。在这个例子中我们有两组状态,观察的状态(水藻的状态)和隐藏的状态(天气的状态)。我们希望为隐士设计一种算法,在不能够直接观察天气的情况下,通过水藻和马尔科夫假设来预测天气。
  一个更实际的问题是语音识别,我们听到的声音是来自于声带、喉咙大小、舌头位置以及其他一些东西的组合结果。所有这些因素相互作用产生一个单词的声音,一套语音识别系统检测的声音就是来自于个人发音时身体内部物理变化所引起的不断改变的声音。
  一些语音识别装置工作的原理是将内部的语音产出看作是隐藏的状态,而将声音结果作为一系列观察的状态,这些由语音过程生成并且最好的近似了实际(隐藏)的状态。在这两个例子中,需要着重指出的是,隐藏状态的数目与观察状态的数目可以是不同的。一个包含三个状态的天气系统(晴天、多云、雨天)中,可以观察到4个等级的海藻湿润情况(干、稍干、潮湿、湿润);纯粹的语音可以由80个音素描述,而身体的发音系统会产生出不同数目的声音,或者比80多,或者比80少。
  在这种情况下,观察到的状态序列与隐藏过程有一定的概率关系。我们使用隐马尔科夫模型对这样的过程建模,这个模型包含了一个底层隐藏的随时间改变的马尔科夫过程,以及一个与隐藏状态某种程度相关的可观察到的状态集合

2、隐马尔科夫模型(Hidden Markov Models)

  下图显示的是天气例子中的隐藏状态和观察状态。假设隐藏状态(实际的天气)由一个简单的一阶马尔科夫过程描述,那么它们之间都相互连接。
  hidden-weather-example
  
  隐藏状态和观察状态之间的连接表示:在给定的马尔科夫过程中,一个特定的隐藏状态生成特定的观察状态的概率。这很清晰的表示了‘进入’一个观察状态的所有概率之和为1,在上面这个例子中就是Pr(Obs|Sun), Pr(Obs|Cloud) 及 Pr(Obs|Rain)之和。这里再引用一下读者jiuren的注解:

这里作者是把obs作为参数来用,是说

Obs=Dry,Dryish,Damp,Soggy(Obs|Sun)=1 ∑ O b s = D r y , D r y i s h , D a m p , S o g g y ( O b s | S u n ) = 1
;
Obs=Dry,Dryish,Damp,Soggy(Obs|Cloud)=1 ∑ O b s = D r y , D r y i s h , D a m p , S o g g y ( O b s | C l o u d ) = 1
;
Obs=Dry,Dryish,Damp,Soggy(Obs|Rain)=1 ∑ O b s = D r y , D r y i s h , D a m p , S o g g y ( O b s | R a i n ) = 1
;

  除了定义了马尔科夫过程的概率关系,我们还有另一个矩阵,定义为混淆矩阵(confusion matrix),它包含了给定一个隐藏状态后得到的观察状态的概率。对于天气例子,混淆矩阵是:

weather-b-matrix  
  注意矩阵的每一行之和是1。

3、总结(Summary)

  我们已经看到在一些过程中一个观察序列与一个底层马尔科夫过程是概率相关的。在这些例子中,观察状态的数目可以和隐藏状态的数量不同。

我们使用一个隐马尔科夫模型(HMM)对这些例子建模。这个模型包含两组状态集合和三组概率集合:

* 隐藏状态:一个系统的(真实)状态,可以由一个马尔科夫过程进行描述(例如,天气)。

* 观察状态:在这个过程中‘可视’的状态(例如,海藻的湿度)。

* 向量:包含了(隐)模型在时间t=1时一个特殊的隐藏状态的概率(初始概率)。

* 状态转移矩阵:包含了一个隐藏状态到另一个隐藏状态的概率

* 混淆矩阵:包含了给定隐马尔科夫模型的某一个特殊的隐藏状态,观察到的某个观察状态的概率。

因此一个隐马尔科夫模型是在一个标准的马尔科夫过程中引入一组观察状态,以及其与隐藏状态间的一些概率关系。

四、隐马尔科夫模型(Hidden Markov Models)

1、定义(Definition of a hidden Markov model)

  一个隐马尔科夫模型是一个三元组 (,A,B) ( ∏ , A , B ) =(πi) ∏ = ( π i )
  
  初始化概率向量: =(πi) ∏ = ( π i )
  隐藏状态: A=(aij) A = ( a i j )
  观察状态: B=(bij) B = ( b i j )
  状态转移矩阵: Pr(ai

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值