先介绍一下马尔可夫链:按我的理解,马尔可夫链记录了一种状态转移的规则。假设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时,系统处于各个状态的概率。
下面介绍解决方案:
概率计算问题
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就是要求的状态。