隐马尔科夫模型(上)

  隐马尔科夫模型在语音识别,自然语言处理等领域有着广泛的应用,80年代李开复博士就是采用隐含马尔可夫模型的框架, 成功地开发了世界上第一个大词汇量连续语音识别系统 Sphinx。本文先介绍隐马尔科夫模型的定义及观察序列的概率计算问题。

模型定义

  隐马尔科夫模型定义如下:$$\lambda = (Q,V,A,B,\pi);$$

  I是长度为T的状态序列:$I=(i_1,i_2,...,i_T)$;

  O是对应的观测序列: $O = (o_1,o_2,...,o_t)$;

  其中:

  1) Q为状态的集合:$Q={q_1,q_2,...,q_N}$, N为状态的数量;

  2) V为观测的集合:$V={v_1,v_2,...,v_M}$,M为观测的数量;

  3) A为状态转移概率矩阵:$A=[a(i,j)]  (1<=i,j <= N)$,$a(i,j)=P(i_{t+1}=q_j|i_t=q_i)$表示在t时刻处于状态$q_i$的条件下t+1时刻转移到$q_j$的概率;

  4) B为观测生成概率矩阵:$B=[b(j,k)] (1<=j <= N, 1<= k <=M)$, $b(j,k)=P(o_t=v_k|i_t=q_j)$表示在t时刻处于状态$q_j$的条件下生成观测$v_k$的概率;

  5) $\pi$是初试概率向量:$\pi =(\pi(i) )  (1<=i <= N)$, $\pi(i)=P(i_1=q_i)$表示t=1时处于状态$q_i$的概率。

  只要上述的五个参数确定了一个马尔科夫模型。

假设前提

  隐马尔科夫模型作了两个基本的假设:

  1) 其次马尔科夫假设:任意时刻t的状态只依赖于其前一刻的状态,与观测和其他时刻的状态无关,即:$$P(i_t|t_{t-1},o_{t-1},..,i_1,o_1)=P(i_t|i_{t-1}), t=1,2,..,T;$$

  2) 观测独立性假设: 任意时刻的观测值只依赖于该时刻的状态,与观测和其他时刻的状态无关,即:$$P(o_t|i_t,o_T,..,i_1,o_1)=P(o_t|i_t)$$

  下面是一个例子,希望能通过这个例子理解什么是状态什么是观测,只有把这两个概念理清楚了,才能理解下去,不然真是一团乱麻。

赌场的欺诈(示例)

  某赌场在掷骰子根据点数决定胜负时 , 采取暗中作弊的手段,连续多次使用正常骰子A后,偶尔使用一个灌铅骰子 B,骰子A的6个字码出现的概率是相等的,而骰子B的6个字码出现的概率是不相等,甚至某个字码出现的概率为0,这样在使用骰子B时,老板可以大赚一笔。

  下面是两个骰子的各个字码出现的概率分布:

 字码

骰子A

骰子B

1点

1/6

0

2点

1/6

1/8

3点

1/6

1/8

4点

1/6

3/16

5点

1/6

3/16

6点

1/6

3/8

  另外假设,骰子使用的概率如下:

  再设第一次挣骰子一定使用骰子A,即初始概率向量为:$\pi={1,0}$。

  于是赌场骰子的隐马尔科夫模型如下:

  状态集合:Q={骰子A,骰子B};

  观测集合:V={1,2,3,4,5,6};

  状态转移矩阵:A={{0.9,0.1},

           {0.8,0.2}};

  生成概率矩阵:B={{1/6,1/6,1/6,1/6,1/6,1/6},

           {0,1/8,1/8,3/16,3/16,3/8}};

  可以描述为如下图:

  实际上,状态应该叫隐状态,即状态时不可见的,我们可见的是观测,就好比医生给病人看病,医生不能直接看到病人的内部器官哪里出了毛病,但是看病人的舌头、肤色等能够得到一些观测数据,即通过观察来推测内部状态。上例中状态是骰子的类别,观测是挣骰子得到的字码。

隐马尔科夫模型的三个问题

  1) 概率计算问题: 给定模型$\lambda = (Q,V,A,B,\pi)$和观测序列$O=(o_1,o_2,...,o_T)$,计算在模型$\lambda$下观察序列O出现的概率$P(O|\lambda)$; 比如对于上述示例,骰子挣出的点数序列记录为:124552646214614613613666166466163661636616361651561511514612356234,问这个序列出现的概率为多少?

  2) 学习问题: 已知观测序列$O=(o_1,o_2,...,o_T)$,估计模型$\lambda = (Q,V,A,B,\pi)$的参数,使得该模型下观测序列概率$P(O|\lambda)$最大;比如骰子挣出的点数序列记录为:124552646214614613613666166466163661636616361651561511514612356234,求初始概率向量$\pi$,状态转移矩阵A,观测生成概率矩阵B。

  3) 预测问题(解码问题): 已经模型$\lambda = (Q,V,A,B,\pi)$和观测序列$O=(o_1,o_2,...,o_T)$,求最可能的对应的观测序列。比如骰子挣出的点数序列记录为:124552646214614613613666166466163661636616361651561511514612356234,求哪些点数是用骰子B挣出的?

概率计算问题

  直接计算观测序列的概率计算复杂度很高,可以采用动态规划来加速求解,有两个求解方法:前向算法、后向算法。

前向算法

  根据隐马尔科夫模型的假设,时刻t+1的观测只依赖于t+1时刻的状态,而t+1时刻的状态又只依赖于t时刻的状态,因此从直观上来说,我们就可以先求出观测序列$o_1,o_2,..o_t$的概率,再求$o_1,o_2,..o_t,o_{t+1}$的概率,最终求得$o_1,o_2,..o_T$的概率,即$P(O|\lambda)$。

  定义前向概率:前t时刻部分的观测序列为$o_1,o_2,..o_t$且t时刻状态为$q_i$的概率,记为:$$\alpha(t,i)=P(o_1,o_2,...,o_t,i_t=q_i|\lambda)$$

  1) 初始化:$$\alpha(1,i)=\pi_ib(i,o_1), i=1,2,..,N$$

  2) 递推:对T=1,2,...,T-1,$$\alpha(t+1,i)=[\sum_{j=1}^N\alpha(t,j)a(j,i)]b(i,o_{i+1}), i=1,2,...,N$$

  3) 终止:$$P(O|\lambda)=\sum_{i=1}^N\alpha(T,i)$$  

  解释一下递推公式,$\alpha(t+1,i)=P(o_1,o_2,...,o_{t+1},i_t+1=q_i|\lambda)$要求t+1时刻的状态是$q_i$并且观测是$o_{t+1}$,首先t+1时刻的状态$q_i$可能是t时刻的任意一种状态转移过来的,因此对前t时刻的前向概率乘以对应的转移概率并累加,最后乘以$b(i,o_{i+1})$是t+1时状态$q_i$生成观测$o_{i+1}$的概率。

  为了说明计算过程,我们用一个长度为3的观测序列O=(124)来演示前向计算的过程,模型为示例所示:

  1) 初始化计算:$$\alpha(1,1)=\pi(1)b(1,o_1)=\pi(1)b(1,1)=1*\frac{1}{6}=\frac{1}{6}$$$$\alpha(1,2)=\pi(2)b(2,o_1)=\pi(2)b(2,1)=0*0=0$$

  2) 递推计算:$$\alpha(2,1)=[\alpha(1,1)a(1,1)+\alpha(1,2)a(2,1)]b(1,o_2)=[\frac{1}{6}*0.9+0*0.8]*\frac{1}{6}= 0.025$$

    $$\alpha(2,2)=[\alpha(1,1)a(1,2)+\alpha(1,2)a(2,2)]b(2,o_2)=[\frac{1}{6}*0.1+0*0.8]*\frac{1}{8}= 0.002083$$

    $$\alpha(3,1)=[\alpha(2,1)a(1,1)+\alpha(2,2)a(2,1)]b(1,o_3)=[0.025*0.9+0.002083*0.8]*\frac{1}{6}=0.004027$$

    $$\alpha(3,2)=[\alpha(2,1)a(1,2)+\alpha(2,2)a(2,2)]b(2,o_3)=[0.025*0.1+0.002083*0.2]*\frac{3}{16}=0.000547$$

  3) 终止:$$P(O|\lambda)=P(124|\lambda)=\alpha(3,1)+\alpha(3,2)=0.004574$$

后向算法

  前向算法是从前往后递推计算,而后向算法则相反,从后往前计算。

  定义后向概率:在时刻t状态为$q_i$的条件下,从t+1到T时刻部分观测序列为$(o_{t+1},o_{t+2},..o_T)$的概率,记作:$$\beta(t,i)=P((o_{t+1},o_{t+2},..o_T|i_t=q_i,\lambda)$$

  1) 初始化:$$\beta(T,i)=1, i=1,2,...,N$$

  2) 递推:对t=T-1,T-2,..,1 $$\beta(t,i)=\sum_{j=1}^Na(i,j)b(j,o_{i+1})\beta(t+1,j), i=1,2,..,N$$

  3) 终止:$$P(O|\lambda)=\sum_{i=1}^N\pi(i)b(i,o_1)\beta(1,i)$$

  同样,我们以观测序列O=(124)来演示后向计算的过程:

  1) 初始化计算:$$\beta(3,1)=\beta(3,2)=1$$

  2) 递推计算:$$\beta(2,1)=a(1,1)b(1,o_3)\beta(3,1)+a(1,2)b(2,o_3)\beta(3,2)=0.9*\frac{1}{6}*1+0.1*\frac{3}{16}*1=0.1687$$
      $$\beta(2,2)=a(2,1)b(1,o_3)\beta(3,1)+a(2,2)b(2,o_3)\beta(3,2)=0.8*\frac{1}{6}*1+0.2*\frac{3}{16}*1=0.1708$$
      $$\beta(1,1)=a(1,1)b(1,o_2)\beta(2,1)+a(1,2)b(2,o_2)\beta(2,2)=0.9*\frac{1}{6}*0.1687+0.1*\frac{1}{8}*0.1708=0.0274$$
      $$\beta(1,2)=a(2,1)b(1,o_2)\beta(2,1)+a(2,2)b(2,o_2)\beta(2,2)=0.8*\frac{1}{6}*0.1687+0.2*\frac{1}{8}*0.1708=0.02677$$

  3) 终止:$$P(O|\lambda)=P(124|\lambda)=\pi(1)b(1,o_1)\beta(1,1)+\pi(2)b(2,o_1)\beta(1,2)=1*\frac{1}{6}*0.0274+0=0.004574$$

  可以看到前向计算和后向计算的结果是一致的。

  本文先介绍模型的定义和概率计算问题,学习问题和预测问题留在下文介绍。

参考文献

  [1].李航.统计学习方法

  [2].http://wenku.baidu.com/view/39835f727fd5360cba1adb23.html

  转载请注明出处:http://www.cnblogs.com/fengfenggirl/

posted @ 2014-08-31 22:44  CodeMeals  阅读(6757)  评论(1编辑  收藏  举报
reliable statistics
Visitors