HMM(隐马尔科夫链)介绍

本文详细介绍了HMM(隐马尔科夫模型)的概念,包括生成模式、马尔科夫过程的局限性和隐藏模式。通过天气和海藻状态的例子,展示了HMM如何描述隐藏状态与观察状态之间的关系。此外,文章还讨论了HMM的定义、应用,如评估、解码和学习,并解释了前向算法的原理及其在降低计算复杂度中的作用。
摘要由CSDN通过智能技术生成

HMM 隐马尔科夫链介绍

标签(空格分隔): HMM 马尔科夫


最近时间需要了解HMM算法,在此做了一些了解。本文主要基于我爱自然语言处理总结而成。

介绍

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

生成模式(Generating Patterns)

确定性系统

这种系统比较常见,例如红绿灯系统:当前是红色或者绿色,下一个一定是黄色,也就是说,该系统是确定性的。

非确定性系统

前面的天气状态中,我们提到有两种状态:雨天或者晴天,在这里我们加入第三种状态:多云。跟信号灯的例子不同,天气状态不是确定性的,他可以随机的切换到下一个状态中去。但是,我们仍然希望能够找到一个模式或者规律。
一种做法就是,我们假设当前的状态仅仅依赖前面的一个状态,这就是马尔科夫假设。通常情况下,这是不符合现实的。因为天气的下一个状态不仅仅依赖上一个状态,还要依赖风力、气压等状况。但是通过这种简化的手段,我们可以更好的去理解系统。
一个马尔科夫过程是状态间的转移仅依赖于前n个状态的过程。这个过程被称之为n阶马尔科夫模型,其中n是影响下一个状态选择的(前)n个状态。最简单的马尔科夫过程是一阶模型,它的状态选择仅与前一个状态有关。这里要注意它与确定性系统并不相同,因为下一个状态的选择由相应的概率决定,并不是确定性的
下图是天气例子中状态间所有可能的一阶状态转移情况:
天气转移情况

对于有M个状态的一阶马尔科夫模型,共有M^2个状态转移,因为任何一个状态都有可能是所有状态的下一个转移状态。也就是说,可以从任意M个状态开始,转移到任意M个状态,因此有M^2种可能。

每一个状态转移都有一个概率值,称为状态转移概率——这是从一个状态转移到另一个状态的概率。所有的M^2个概率可以用一个状态转移矩阵表示。注意这些概率并不随时间变化而不同——这是一个非常重要(但常常不符合实际)的假设。
下面的状态转移矩阵显示的是天气例子中可能的状态转移概率:
状态转移概率
-也就是说,如果昨天是晴天,那么今天是晴天的概率为0.5,是多云的概率为0.375。注意,每一行的概率之和为1。
要初始化这样一个系统,我们需要确定起始日天气的(或可能的)情况,定义其为一个初始概率向量,称为pi向量。

-也就是说,第一天为晴天的概率为1。
现在我们定义一个一阶马尔科夫过程如下:
状态:
三个状态——晴天,多云,雨天。
pi向量:定义系统初始化时每一个状态的概率。
状态转移矩阵:给定前一天天气情况下的当前天气概率。

任何一个可以用这种方式描述的系统都是一个马尔科夫过程。

隐藏模式

马尔科夫过程的局限性

在某些情况下,我们希望找到的模式用马尔科夫过程描述还显得不充分。回顾一下天气那个例子,一个隐士也许不能够直接获取到天气的观察情况,但是他有一些水藻。民间传说告诉我们水藻的状态与天气状态有一定的概率关系——天气和水藻的状态是紧密相关的。
在这个例子中,我们有两组状态,观察的状态(水藻的状态)和隐藏的状态(天气的状态)。我们希望为隐士设计一种算法,在不能够直接观察天气的情况下,通过水藻和马尔科夫假设来预测天气。
需要着重指出的是,隐藏状态的数目与观察状态的数目可以是不同的。一个包含三个状态的天气系统(晴天、多云、雨天)中,可以观察到4个等级的海藻湿润情况(干、稍干、潮湿、湿润)。
在这种情况下,观察到的状态序列与隐藏过程有一定的概率关系。我们使用隐马尔科夫模型对这样的过程建模,这个模型包含了一个底层隐藏的随时间改变的马尔科夫过程,以及一个与隐藏状态某种程度相关的可观察到的状态集合。

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

  下图显示的是天气例子中的隐藏状态和观察状态。假设隐藏状态(实际的天气)由一个简单的一阶马尔科夫过程描述,那么它们之间都相互连接。
hidden-weather-example

在这个例子中,上面的状态时观察状态,下面的状态是隐藏状态。他们之间的连线,实际上应该从底下指向上面的观察状态:也就是说,这种连接表示,在给定的马尔科夫过程中,一个特定的隐藏状态生成特定的观察状态的概率。因此,在该连接中,我们可以看到:从某个隐藏状态,例如sun,到其他所有观察状态的概率之和应该为1,也就是说:
Sum_{Obs=Dry,Dryish,Damp,Soggy}(Obs|Sun) = 1;
Sum_{Obs=Dry,Dryish,Damp,Soggy}(Obs|Cloud) = 1;
Sum_{Obs=Dry,Dryish,Damp,Soggy}(Obs|Rain) = 1;
obs即观察状态。
因此,从上面的连接关系,我们除了定义了马尔科夫过程的概率关系,我们还可以定义另一个矩阵,定义为混淆矩阵(confusion matrix),它包含了给定一个隐藏状态后得到的观察状态的概率。对于天气例子,混淆矩阵是:
weather-b-matrix
注意矩阵的每一行之和是1。

总结(Summary)

1、我们已经看到在一些过程中一个观察序列与一个底层马尔科夫过程是概率相关的。在这些例子中,观察状态的数目可以和隐藏状态的数码不同。
2、我们使用一个隐马尔科夫模型(HMM)对这些例子建模。这个模型包含两组状态集合和三组概率集合:
  * 隐藏状态:一个系统的(真实)状态,可以由一个马尔科夫过程进行描述(例如,天气)。
  * 观察状态:在这个过程中‘可视’的状态(例如,海藻的湿度)。
  * pi向量:包含了(隐)模型在时间t=1时一个特殊的隐藏状态的概率(初始概率)。
  * 状态转移矩阵:包含了一个隐藏状态到另一个隐藏状态的概率
  * 混淆矩阵:包含了给定隐马尔科夫模型的某一个特殊的隐藏状态,观察到的某个观察状态的概率。
  因此一个隐马尔科夫模型是在一个标准的马尔科夫过程中引入一组观察状态,以及其与隐藏状态间的一些概率关系。

隐马尔可夫模型

定义

一个隐马尔科夫模型,是一个三元组:
Π=(πi) :初始化概率向量
A=(aij) : 状态转移转移矩阵;
B=(bij) : 混淆矩阵
在状态转移矩阵及混淆矩阵中的每一个概率都是时间无关的——也就是说,当系统演化时这些矩阵并不随时间改变。实际上,这是马尔科夫模型关于真实世界最不现实的一个假设。

应用(Uses associated with HMMs)

一旦一个系统可以作为HMM被描述,就可以用来解决三个基本问题。
其中前两个是模式识别的问题:
1、给定HMM求一个观察序列的概率(评估),例如:我们有了HMM的三个要素之后,给你一个序列,序列值是观察状态组成的,那么你来求解这个状态出现的概率是多少;

考虑这样的问题,我们有一些描述不同系统的多个隐马尔科夫模型(也就是一些( pi,A,B)三元组的集合)及一个观察序列。我们想知道哪一个HMM最有可能产生了这个给定的观察序列。例如,对于海藻来说,我们也许会有一个“夏季”模型和一个“冬季”模型,因为不同季节之间的情况是不同的——我们也许想根据海藻湿度的观察序列来确定当前的季节。
因此,我们可以用这几个HMM分别计算其生成该序列的概率,然后选择概率最大的那个即可。
我们使用前向算法(forward algorithm)来计算给定隐马尔科夫模型(HMM)后的一个观察序列的概率,并因此选择最合适的隐马尔科夫模型(HMM)。
  
2、搜索最有可能生成一个观察序列的隐藏状态序列(解码)。例如:有了HMM的三个要素之后,给了一个观察的序列,你要来求最有可能的那个隐藏序列是什么样的。
也就是说,就是搜索生成输出序列的隐藏状态序列。在许多情况下我们对于模型中的隐藏状态更感兴趣,因为它们代表了一些更有价值的东西,而这些东西通常不能直接观察到。
考虑海藻和天气这个例子,一个盲人隐士只能感觉到海藻的状态,但是他更想知道天气的情况,天气状态在这里就是隐藏状态。在看到海藻状态之后,他开始思考:这两天的天气,究竟是什么样子的呢?或者说,最有可能是什么样子呢?
我们使用Viterbi 算法(Viterbi algorithm)确定(搜索)已知观察序列及HMM下最可能的隐藏状态序列。
  Viterbi算法(Viterbi algorithm)的另一广泛应用是自然语言处理中的词性标注。在词性标注中,句子中的单词是观察状态,词性(语法类别)是隐藏状态(注意对于许多单词,如wind,fish拥有不止一个词性)。对于每句话中的单词,通过搜索其最可能的隐藏状态,我们就可以在给定的上下文中找到每个单词最可能的词性标注。

3、给定观察序列生成一个HMM(学习)
  根据观察序列生成隐马尔科夫模型。
  第三个问题,也是与HMM相关的问题中最难的,根据一个观察序列(来自于已知的集合),以及与其有关的一个隐藏状态集,估计一个最合适的隐马尔科夫模型(HMM),也就是确定对已知序列描述的最合适的(pi,A,B)三元组。
  当矩阵A和B不能够直接被(估计)测量时,前向-后向算法(forward-backward algorithm)被用来进行学习(参数估计),这也是实际应用中常见的情况。

总结(Summary)

  由一个向量和两个矩阵(pi,A,B)描述的隐马尔科夫模型对于实际系统有着巨大的价值,虽然经常只是一种近似,但它们却是经得起分析的。隐马尔科夫模型通常解决的问题包括:
  1. 对于一个观察序列匹配最可能的系统——评估,使用前向算法(forward algorithm)解决;
  2. 对于已生成的一个观察序列,确定最可能的隐藏状态序列——解码,使用Viterbi 算法(Viterbi algorithm)解决;
  3. 对于已生成的观察序列,决定最可能的模型参数——学习,使用前向-后向算法(forward-backward algorithm)解决。

前向算法

给定一个HMM,和一个观察序列,计算该观察序列的概率。

穷举搜索

想想一下,加入我们有一个观察序列:(干燥、潮湿、湿、干燥),那么直接计算的话,其概率是多少呢?很简单,我们每个观察序列值都可以是隐藏状态(阴天、晴天,多云)中的一个,总共有3^4中可能,也就是P(干燥、潮湿
湿、干燥|,,,),*是三个状态中的任意一个。
可以知道,这种概率观察算法代价非常大。

使用递归降低问题复杂度

给定一个隐马尔科夫模型(HMM),我们将考虑递归地计算一个观察序列的概率。我们首先定义局部概率(partial probability),它是到达网格中的某个中间状态时的概率。然后,我们将介绍如何在t=1和t=n(>1)时计算这些局部概率。
  假设一个T-长观察序列是:
t-long 序列
每个Y值都是观测值中的一种。
  

局部概率( α

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值