HMM基础理论-前向算法

来源:互联网 发布:python灰帽子讲的什么 编辑:程序博客网 时间:2024/05/17 06:37

本文主要讨论HMM要解决的三个基本问题。

并对第一个问题求似然概率进行公式推导和说明。

首先,HMM由以下几个组件构成:

1.  Q=q1q2...qN   状态集合

2.  A=a11a12...an1...ann   状态转移矩阵,aij 表示从状态i到状态j的概率 p(qj|qi

3.  O=o1o2...oT   长度为T序列的观测值

4.  B=bi(ot)  观测似然,也叫发射概率,观测值ot 由状态i产生的概率

5.  q0,qF   初始状态,结束状态

π π1,π2,...,πN  初始概率分布    πi  表示HMM初始由状态i开始的概率

前提:

1.Markov假设:

P(qi|q1...qi1) = P(qi|qi1)     =>  当前状态只和前一个状态有关。

2.输出独立假设:P(oi|q1...qi,...,qT,o1,...,oi,...,oT)=P(oi|qi)  即输出只和一个状态qi有关,不和其他状态或者输出相关。

有了以上基础概念,我们看HMM有三个问题需要解决:

问题1,计算似然(likelihood):给定HMM的λ= (A,B) 和观测序列O ,计算似然概率P(O|λ

问题2,解码问题(decoding):给定HMM的λ = (A,B) 和观测序列O,找到最佳状态序列

问题3,训练问题(Learning):给定观测序列O和状态集合,训练HMM参数A和B

接下来,我们就要讨论第一个问题

针对问题1,首先,在一定的状态序列,观测概率的联合概率计算如下所示:


在HMM中,有N个隐藏状态,观测值为T个观测序列情况下:

N个可能的状态序列,当N和T很大的情况下,所以通过计算每个隐藏状态序列的似然概率,然后求和算出总的似然概率变得非常不现实了。

我们使用前向(forward)算法来高效的解决以上问题,其中用一个table用来存储中间值,其时间复杂度为O(N2T) 。

首先,使αt(j)记做:在给定λ前提下,观测到前t个观测值(O1-Ot)且状态在j的概率

        

其计算公式如下:

1.初始化:


2.递归:


3.终止:(状态qF 没有发射概率


算法代码如下所示:


可视化的图例如下所示:


上图中,forward[s,t]  代表αt(s

forward[qF,T] 表示αT(qF) ,即:

在给定λ前提下,观测到T个观测序列(O),且状态在结束状态qF的概率,即P(O|λ) 

以上就是求似然概率的公式推导。

下一章会讨论HMM第二个问题,解码(decoding)的公式推导.



0 0