zoukankan      html  css  js  c++  java
  • 隐马尔科夫模型(上)

      隐马尔科夫模型在语音识别,自然语言处理等领域有着广泛的应用,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}^Nalpha(t,j)a(j,i)]b(i,o_{i+1}), i=1,2,...,N$$

      3) 终止:$$P(O|lambda)=sum_{i=1}^Nalpha(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)$的概率,记作:$$eta(t,i)=P((o_{t+1},o_{t+2},..o_T|i_t=q_i,lambda)$$

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

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

      3) 终止:$$P(O|lambda)=sum_{i=1}^Npi(i)b(i,o_1)eta(1,i)$$

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

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

      2) 递推计算:$$eta(2,1)=a(1,1)b(1,o_3)eta(3,1)+a(1,2)b(2,o_3)eta(3,2)=0.9*frac{1}{6}*1+0.1*frac{3}{16}*1=0.1687$$
          $$eta(2,2)=a(2,1)b(1,o_3)eta(3,1)+a(2,2)b(2,o_3)eta(3,2)=0.8*frac{1}{6}*1+0.2*frac{3}{16}*1=0.1708$$
          $$eta(1,1)=a(1,1)b(1,o_2)eta(2,1)+a(1,2)b(2,o_2)eta(2,2)=0.9*frac{1}{6}*0.1687+0.1*frac{1}{8}*0.1708=0.0274$$
          $$eta(1,2)=a(2,1)b(1,o_2)eta(2,1)+a(2,2)b(2,o_2)eta(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)eta(1,1)+pi(2)b(2,o_1)eta(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/

  • 相关阅读:
    看《环太平洋》归来
    在Fedora8上安装MySQL5.0.45的过程
    在Win7上安装MySql5.2遇到Write configuration file的解决
    每一个问题都是一把锁
    Fedora8上Apache Httpd与Tomcat6初集成
    在Fedora8上的Tomcat上deploy一个war
    在Fedora8上配置Tomcat6.0.37
    在Fedora8上配置Apache Httpd
    在Fedora8上安装jdk-7u25-linux-i586.rpm的步骤
    Java继承中的几道面试题
  • 原文地址:https://www.cnblogs.com/fengfenggirl/p/HMM_1.html
Copyright © 2011-2022 走看看