隐马尔可夫模型

来源:互联网 发布:kof98um出招优化 编辑:程序博客网 时间:2024/05/21 22:56

先介绍一下马尔可夫链:按我的理解,马尔可夫链记录了一种状态转移的规则。假设A是一个具有各种状态的人,那么A在时间为t+1时的状态则仅仅是A在时间为t时的状态的函数。特别说明,A在t+1时的状态与t之前和t+1之后的状态无关。

隐马尔可夫模型则是马尔可夫链的加强版。继续刚才的例子,若我们可以轻易地获取A在各个时间的状态,那么用马尔可夫链模型就能预测出A在下一时刻的状态。但是,假如我们无法直接获取A的状态,只能通过看A的表情来猜测A的状态,那该怎么办呢?比如,如果A在哈哈笑,我们可能倾向于认为A现在很高兴,但是也不能排除他被人挠痒痒了;如果A正在流眼泪,我们可能倾向于认为A现在很伤心,但是也不能排除他被人感动了。遇到这种情况——我们要先通过观察到的信息,来猜一个事物的真正状态。然后,根据这个真正的状态来预测下一时刻的真正状态。这时,我们就必须通过隐马尔可夫模型来解决问题了。

在隐马尔可夫模型中,有三个基本问题需要解决:

1.概率计算问题,给定模型和观测序列,计算在这个模型的前提下观测序列O出现的概率

2.学习问题,已知观测序列,估计模型的参数,使得在该模型下观测序列概率最大。

3.解码问题(decoding),已知模型和观测序列,求对给定观测序列条件概率最大的状态序列,即给定观测序列,求最有可能的对应的状态序列。

如果能解决这三个问题,我们就可以在已知系统模型的情况下计算出观测结果的合理性;根据观测序列估计出系统模型的参数;根据系统模型和观测序列,估计出最有可能的状态序列。那么,关于隐马尔可夫模型的大部分问题都能引刃而解了。

在介绍这三个问题的解决方案前,先要介绍一下各个参数:

A是状态转移矩阵,记录的是时刻t到t+1时,状态q1转移到q2的概率。

B是观测概率矩阵,记录的是状态qi被观测成现象vk的概率。其中,v1到vk表示所有现象的观测集合。

π是初始状态向量,存储了t=1时,系统处于各个状态的概率。

下面介绍解决方案:

概率计算问题

解决这个问题最直接的方法是先列出所有可能的长度为T的状态序列,然后求各个状态序列和原来的观测序列的联合概率,再根据全概率公式计算出。但是,这个方法因为计算量太大,而导致实际中它是不可行的。现在我们来思考一下为什么直接计算的方法会有那么大的计算量呢?观察我们列出的所有状态序列,我们发现其实在每个时刻n,所有状态序列序列在此时的状态in其实是有可能重复的。也就是说,在直接计算中我们是分别计算了每一个状态序列和原来的观测序列的联合概率;但是,由于在计算联合概率时我们是按状态转移矩阵一个时刻一个时刻的计算的,所以这其中每个时刻的概率计算可定存在着大量的重复计算,从而导致了计算资源的浪费。根据这个特点,我们发现其实联合概率的计算是一个递推的过程,并且每个递推的子问题还有相互交叠的可能,所以可以利用动态规划算法来优化这个直接算法,优化完的算法我们成为前向-后向算法,步骤如下:
在给定模型的前提下,定义到时刻t,部分观测序列为o1,o2,....ot且此时状态为qi的概率为前向概率,记作


1.计算前向概率的初值


2.递推计算每一时刻的前向概率对



3.直到最终状态,计算联合概率



步骤一是初始化最初的联合概率,步骤二是前向概率的递推公式,步骤三则最后计算最终的联合概率。每个公式的具体意义可以参照《统计学习方法》里的具体章节,这里不再赘述。以上描述的是前向算法,后向算法则是从后向前推导,思路是一样的。


解码问题

因为概率计算问题和解码问题有一些共同点,所以我们先跳过第二个问题,直接来看第三个。

解码问题的核心在于给定观测序列,求最有可能的状态序列。同样我们可以跟概率计算问题一样计算出给定观测序列后所有的可能的状态序列的概率,然后最大的就是最有可能的状态序列了。当然,这种方法也同样得效率低下。所以,改进方法再次同样还是动态规划。改进后的算法叫做维特比算法(Viterbi algorithm)。它的主要思路如下:

我们先把最有可能的状态序列称为最优路径,我们从t=1开始,递推地计算在时刻t状态为i的各条部分路径的最大概率,直到得到t=T状态为i的各条路径的最大概率,其中最大的那个概率就是最优路径的概率P。这么讲非常抽象,我们举个例子来说明这个问题:假设有A,B,C三种状态,X,Y两种观察结果,观察结果是[X,X,Y,Y,X],一开始,我们可以计算得到对于时刻1,系统处于A,B,C三种状态的概率。对于时刻2(观察的结果是X),我们可以计算由时刻1的三种状态转移到时刻2的三种状态的最大概率(指时刻1的A,B,C状态转移到时刻2的A状态的最大概率,时刻1的A,B,C状态转移到时刻2的B状态的最大概率,时刻1的A,B,C状态转移到时刻2的C状态的最大概率)。然后对于时刻3,就是计算[时刻1的A,B,C状态转移到时刻2的A状态的最大概率][时刻1的A,B,C状态转移到时刻2的B状态的最大概率][时刻1的A,B,C状态转移到时刻2的C状态的最大概率]转移到时刻3的A状态的最大概率等等(也是3个值)。这样由初始时刻地推着计算到最终时刻,就是维特比算的的思路了。看到这里,你可能会问为什么这么做就能保证是最优路径呢?其实道理很简单,因为我们这里的隐马尔可夫模型是一阶的,t时刻的状态只与t-1时刻的状态相关,当我们用t-1时刻的最大概率去计算t时刻的最大概率时,其实也就保证了这个最大概率时全局的。

具体算法过程如下:

定义在时刻t状态为i的所有单个路径中概率最大值为


定义在时刻t状态为i的所有单个路径中概率最大的第t-1个结点(即这个概率最大的结点是由上一结点的哪个状态改变得来的)为



1.根据观测概率矩阵和转移概率矩阵初试化递推公式初值




2.递推公式




3.到最终时刻,终止递推




4.再回溯最优路径


回溯得到的i就是要求的状态。


学习问题

学习问题其实就是一个参数估计问题。如果我们既知道观测序列,又知道对应的状态序列的值,那么学习就问就是一个非常简单的极大似然估计问题。而对于只知道观测序列的学习问题,由于隐藏变量的存在,EM算法自然就是针对这个问题比较好的解决方法之一。具体的解决方法叫做Baum-Welch算法,它的思路如下:
1.先随便地估计一下要求的A,B,π的值。
2.根据估计的值去计算出对应的模型和观测序列下,状态序列(隐藏变量)的期望(EM算法E步)。
3.极大化这个期望。并且用新算出来的A,B,π的值去重复第二步的迭代。
具体的公式可以参考《统计学习方法》这本书,这里也不再赘述了。

0 0
原创粉丝点击