HMM及维特比算法

参考

HMM:https://blog.csdn.net/sinat_25346307/article/details/79119366

Viterbi算法:https://blog.csdn.net/shenxiaoming77/article/details/79228378

 

一、HMM定义  以词性标注为例说明

图1 词性标注任务

1、问题:如图1所示,已知x,求x的词性标注y。

    该问题转化为数学语言即为:在已知x的条件下计算得y的最大概率,如公式(1)所示

(1)

     由条件概率公式可得公式(2)

(2)

   由于x是已知的,所以公式(2)中的p(x)可以省去,故公式(2)可以用公式(3)

(3)

    在HMM中,我们实际使用公式(4)的形式来求解,公式(3)使用条件概率公式可得公式(4)

(4)

 

2、HMM是一种有监督学习,需要有训练数据训练参数。

    图2为一条训练数据,已知句子x的词性y,其中PN为名词,V为动词,D为冠词,N为名词。

图2已知句子x的词性y

可得P(y)公式(5)

   

                                      

                                         

                                         

(5)

则可得公式(6)

                                   

                                      

                                      

(6)

将其一般化,可将第一步的概率P(y)称为转移概率(transition probability),第二步的概率称为输出概率(emission probability)。其概率值都可以通过训练数据得到。

第1步P(y) 转移概率可表示为公式(7)

(7)

第2步输出概率可表示为公式(8)

(8)

将公式(7)(8)带入公式(4)即为HMM模型,如公式(9)所示。

 

             

(9)

 

 

二、HMM具体举例,使用Viterbi算法

1、问题

假设已知:

                   第1天小明感觉正常。

                  第2天小明感觉有点冷。

                  第3天小明觉有点头晕。

      小明的身体观察序列x为:正常、冷、头晕

      小明身体的隐藏状态有2种分别为:健康、发烧

求已知x的情况下,推断出小明每一天的身体状态呢?

 

2、转化为数学语言

     正常、冷、头晕分别用0、1、2表示;健康、发烧分别用A、B表示。

    则小明的观察序列x为:0,1,2

   小明身体的隐藏状态有2种分别为:A、B

 

已知概率:

1)初始概率

                      

                     

2)转移概率

               

              

3)输出概率

             

             

 

3、问题进一步具体化

求:推断出小明每一天的身体状态呢?

已知:观察序列x和HMM模型。HMM模型即为初始概率、转移概率、输出概率。

 

4、求解,使用维特比算法

1)第1天 l=1, 取值为0,  的取值为A或B

       由HMM模型公式(9)可得到公式(10)

(10)

            注意:这里实际为

       当时, 带入公式(10)可得到公式(11)

        

                                           

       

(11)

       当时, 带入公式(10)可得到公式(12)                         

 

                             

                            

                            

(12)

 

2)第2天 l=2,取值为1,  的取值为A或B

           由HMM模型公式(9)可得到公式(13)

(13)

       1、)当时,公式(13)可化为公式(14)

                    

                  

                   

                  

(14)

               公式(14)中的可取A或B,此时由公式(9)可得公式(15)

                              

                              

                              

                              

                              

(15)

                由公式(15)可看出,当取A时,概率最大,记录此条路径。

这里在解释一下:

       当前观测值为1,假定当前隐含状态为健康A,求当前的联合概率分布 。首先从昨天的状态到当前的健康A状态有两种路径(昨天的状态还没确定,而只是先计算出每个状态的概率分布): 昨天健康A ----> 今天健康A,   昨天发烧 B-----> 今天健康A。 这两个路径分别的概率为 0.3 * 0.7 以及 0.04 * 0.4, 可以看到 当前如果为健康A时,昨天为健康A的概率更大,因此我们选定昨天健康 A----> 今天健康A 这条路径,即记录下当前为健康A时,昨天也为健康A状态, 然后求得当前的联合概率分布 = (0.3 * 0.7 ) * 0.4即如下:

  = max{0.3*0.7, 0.04*0.4} * 0.4=0.3* 0.7 * 0.4=0.084

此时我们需要记录概率最大的路径的前一个状态,即0.084路径的前一个状态,我们在小本本上记下,第二天健康A时,第一天的状态也为健康A。

        2、)当时,公式(13)可化为公式(16)

                    

                  

                  

                  

(16)

                 公式(16)中的可取A或B,此时由公式(9)可得公式(17)

                                

                                                                        

                                

                                

                                

(17)

            由公式(17)可看出,当取A时,概率最大,记录此条路径。

                   一样的道理,从昨天的状态到当前的发烧B状态也有两种路径:  昨天健康A ----> 今天发烧B,   昨天发烧B -----> 今天发烧B,这两个路径分别的概率为 0.3 * 0.3以及 0.04 * 0.6, 可以看到 当前如果为发烧B时,昨天为健康A的概率更大,因此我们选定昨天健康A ----> 今天发烧B 这条路径,即记录下当前为发烧B时,昨天也为健康B状态, 当前的联合概率分布= (0.3 * 0.3 ) * 0.3, 即如下:

= max{0.3*0.3,  0.04*0.6} * 0.3=0.027,

同样的在0.027这个路径上,第二天为发烧B时,第一天也是健康A的。

 

3) 第3天 l=3, 取值为2, 的取值为A或B

           由HMM模型公式(9)可得到公式(18)

                      

        

       

(18)

          1、) 的取值为A,公式(18)可化为公式(19)

                   

      

      

(19)

                   公式(19)中的可取A或B,此时由公式(9)可得公式(20)

                           

                          

                          

                          

                          

(20)

               由公式(20)可看出,当取A时,取A时;概率最大,记录此条路径。

 

                2、)  的取值为B,公式(18)可化为公式(21)

                                 

                    

                    

(21)

                     公式(21)中的可取A或B,此时由公式(9)可得公式(22)

                           

                                                                  

                                                               

                                                               

                                                               

(22)

                      由公式(22)可看出,当取B时,取A时;概率最大,记录此条路径。

4)到第三天是最后一天, 此时看第三天为发烧B时状态概率最大,即为最优状态,即P(最优)=0.01512,这样我们可以得到最优路径的终点,是发烧B状态。

             由最优状态开始回溯。根据前面所记录的, 在求得第三天发烧的时候,我们记录的第二天最大概率的状态为健康A,因此确定第二天为健康A状态,继续回溯,当第二天为健康A状态时,我们记录的第一天是健康A的。这样,我们的状态序列逆推出来了。即为:健康A,健康A,发烧B;这就是小明这3天的身体状态。

 

5)别人也给出了一个HMM概率图 可以参考下:

图3   HMM概率图

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是维特比算法的C语言实现: ``` #include <stdio.h> #include <stdlib.h> #define N 3 // 状态数 #define M 4 // 观测符号数 int main() { int i, j, t; int obs_seq[] = {0, 1, 2, 0}; // 观测序列 double a[N][N] = {{0.5, 0.2, 0.3}, {0.3, 0.5, 0.2}, {0.2, 0.3, 0.5}}; // 转移概率矩阵 double b[N][M] = {{0.5, 0.5, 0.0, 0.0}, {0.0, 0.5, 0.5, 0.0}, {0.0, 0.0, 0.5, 0.5}}; // 发射概率矩阵 double pi[N] = {0.2, 0.4, 0.4}; // 初始状态概率 double delta[M][N]; // delta矩阵 int psi[M][N]; // psi矩阵 int q[M]; // 最优状态序列 // 初始化 for (i = 0; i < N; i++) { delta[0][i] = pi[i] * b[i][obs_seq[0]]; psi[0][i] = 0; } // 递推 for (t = 1; t < M; t++) { for (j = 0; j < N; j++) { double max_delta = 0.0; int max_i = 0; for (i = 0; i < N; i++) { double tmp_delta = delta[t - 1][i] * a[i][j] * b[j][obs_seq[t]]; if (tmp_delta > max_delta) { max_delta = tmp_delta; max_i = i; } } delta[t][j] = max_delta; psi[t][j] = max_i; } } // 终止 double max_delta = 0.0; int max_i = 0; for (i = 0; i < N; i++) { if (delta[M - 1][i] > max_delta) { max_delta = delta[M - 1][i]; max_i = i; } } // 回溯 q[M - 1] = max_i; for (t = M - 2; t >= 0; t--) { q[t] = psi[t + 1][q[t + 1]]; } // 输出结果 printf("最优状态序列为:"); for (t = 0; t < M; t++) { printf("%d ", q[t]); } printf("\n"); return 0; } ``` 其中,`a`数组为转移概率矩阵,`b`数组为发射概率矩阵,`pi`数组为初始状态概率,`obs_seq`数组为观测序列。程序中使用了`delta`和`psi`两个矩阵来辅助计算。最终,程序输出最优状态序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值