HMM和Viterbi

1. 隐马尔可夫模型的定义和构成

2. 隐马尔可夫模型的三个问题

3. 基于隐马尔可夫模型的分词算法实现


1.1. 介绍隐马尔科夫模型之前首先说一下几个重要的概念,

(1)马尔可夫假设:模型的当前状态仅仅依赖于前面n个状态,可以看到这种假设有可能会丢失信息。

(2)马尔可夫过程:状态间的转移仅仅依赖于前n个状态的过程,也就是当前的状态跟前n个状态之前的状态无关。

(3)马尔可夫链:时间和状态都是离散的马尔可夫过程叫做马尔可夫链,这里的重点是离散

(4)马尔科夫模型:独立于时间t的随机过程,也就是跟时间t没关系,状态跟具体哪个时刻没关系,t只用来说明状态的顺序


1.2 隐马尔可夫模型(hidden Markov model, HMM)

马尔可夫模型有时又叫做可视马尔可夫模型,因为状态是可以看到的,隐马尔可夫模型的状态是看不的,可以观察到的是一些观察值,这些观察值是由状态按照一定的概率产生的,所以可以看到这里有两个随机过程,一个是一个状态到另一个状态的随机,一个是状态到观察值的随机。

一个HMM由如下几个部分组成:

(1)状态的数目N

(2)观察值得数目M

(3)状态的概率转移矩阵A={aij},即从第i个状态到第j个状态的概率,且概率和为1。

(4)状态到观察值的概率B={bij},即从第i个状态到第j个观察值得概率,且概率和为1。

(5)第一次选择哪个状态的概率qi,即一个序列中第i个状态为第一个状态的概率,概率和为1。

例:一个暗室里有N个口袋,每个口袋中有M种不同颜色的球,一个人按照一定的概率分布(p1)随机的选取一个初始口袋,从中根据不同颜色的概率分布p2选取一个球,并报告该球的初始颜色,然后再根据口袋的概率分布p3选取另外一个口袋,根据不同颜色球的概率分布选取一个球并报告该球的颜色,重复这个过程。这里的N个口袋就是HMM的N个状态,M个颜色就是HMM的M个观察值,p1就是HMM的初始状态概率,p3就是HMM的状态转移概率A,p2HMM的状态到观察值的概率B

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

2.1 估值问题,如何根据已知的参数,估计一个观察值的概率。就是在1.2中5个部分已知的情况下,估计一个观察值的概率。

例如:给定一个观察序列   和模型,计算在给定u的情况下,观察序列O的概率,即P(O|u)

解决方法:前向算法

具体的程序实现为:

[java] view plaincopy
  1. /** 
  2.      * 前向算法 
  3.      * @param phmm 
  4.      * @param O 
  5.      * @return:输出所有的前向概率,p(O|u)只要将T时刻的前向概率求和即可 
  6.      */  
  7.     public static double [][] forward(HMMEntity phmm, int []O){  
  8.           
  9.         int i,j;  
  10.         int t;  
  11.         double sum;  
  12.         int T = O.length;  
  13.         double [][] alpha = new double[T][phmm.getN()];  
  14.           
  15.         //初始化,计算t1时刻所有状态的局部概率  
  16.         for(i=0;i<phmm.getN();i++){  
  17.             alpha[0][i] = phmm.getPi()[i] * phmm.getB()[i][O[0]];   
  18.             System.out.println("alpha[0]["+i+"] = "+alpha[0][i]);  
  19.         }  
  20.           
  21.         //递归计算每个时间点的局部概率  
  22.         for(t=0;t<T-1;t++){  
  23.             for(j=0;j<phmm.getN();j++){  
  24.                 sum = 0.0;  
  25.                 for(i=0;i<phmm.getN();i++){  
  26.                     sum += alpha[t][i] * phmm.getA()[i][j];  
  27.                 }  
  28.                 alpha[t+1][j] = sum * phmm.getB()[j][O[t+1]];  
  29.                 System.out.println("alpha["+(t+1)+"]["+j+"] = "+alpha[t+1][j]);  
  30.             }  
  31.         }  
  32.         return alpha;  
  33.     }  

2.2 解码问题:给定一个观察序列和模型,如何快速有效的选择最优的状态序列,是的该状态序列最好的解释观察序列

解决方法:维特比算法

实现:

[java] view plaincopy
  1. /** 
  2.      * 维特比算法 
  3.      * @param phmm 
  4.      * @param O 
  5.      */  
  6.     public static int[] viterbi(HMMEntity phmm,int []O){  
  7.           
  8.         int i,j;  
  9.         int t;  
  10.           
  11.         int maxvalind;  
  12.         double maxval,val;  
  13.         int T = O.length;  
  14.         double[][] delta = new double[T][phmm.getN()];  
  15.         int[][]psi = new int[T][phmm.getN()];  
  16.           
  17.         for(i=0;i<phmm.getN();i++){  
  18.             delta[0][i] = phmm.getPi()[i]* phmm.getB()[i][O[0]];  
  19.             psi[0][i] = 0;  
  20.         }  
  21.           
  22.         for(t=1;t<T;t++){  
  23.             for(j=0;j<phmm.getN();j++){  
  24.                 maxval = 0.0;  
  25.                 maxvalind = 1;  
  26.                 for(i=0;i<phmm.getN();i++){  
  27.                     val = delta[t-1][i]*phmm.getA()[i][j];  
  28.                     if(val > maxval){  
  29.                         maxval = val;  
  30.                         maxvalind = i;  
  31.                     }  
  32.                 }  
  33.                 delta[t][j] = maxval*phmm.getB()[j][O[t]];  
  34.                 psi[t][j] = maxvalind;  
  35.             }  
  36.         }  
  37.           
  38.         double pprob = 0;  
  39.         int q[] = new int[T];  
  40.         for(i=0;i<phmm.getN();i++){  
  41.             if(delta[T-1][i]>pprob){  
  42.                 pprob = delta[T-1][i];  
  43.                 q[T-1] = i;  
  44.             }  
  45.         }  
  46.           
  47.         for(t=T-2;t>=0;t--){  
  48.             q[t] = psi[t+1][q[t+1]];  
  49.         }  
  50.           
  51.         return q;  
  52.   
  53.     }  
posted @ 2015-12-05 21:08  StevenLuke  阅读(238)  评论(0编辑  收藏  举报