HMM学习笔记(三):动态规划与维特比算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37334135/article/details/86314856

学习隐马尔可夫模型(HMM),主要就是学习三个问题:概率计算问题,学习问题和预测问题。在前面讲了概率计算问题:前后向算法推导Baum-Welch算法。最后在这里讲最后的一个问题,预测问题。

预测问题:给定HMM参数 λ = { π , A , B } \lambda=\{\pi,A,B\} ,观测序列 O = { o 1 , o 2 , . . . , o T } O=\{o_1,o_2,...,o_T\} ,求条件概率 P ( I O , λ ) P(I|O,\lambda) ,即给定观测序列求最优可能的状态序列。

记: Q = { q 1 , q 2 , . . . , q N } Q=\{q_1,q_2,...,q_N\} 表示所有可能的状态集合(后面可能也会直接用数字来表示), V = { v 1 , v 2 , . . . , v M } V=\{v_1,v_2,...,v_M\} 表示所有可能的观测集合。

I = { i 1 , i 2 , . . . , i T } I=\{i_1,i_2,...,i_T\} 表示状态序列, O = { o 1 , o 2 , . . . , o N } O=\{o_1,o_2,...,o_N\} 为对应的观测序列。

下面给出HMM预测问题的两种算法:近似算法和维特比算法

近似算法

近似算法的思想是,在每个时刻 t t 选择最有可能的状态 i t i^*_{t} t t 从1开始直到 T T ,所以可以求出状态序列 I = ( i 1 , i 2 , . . . , i T ) I^*=(i^*_{1},i^*_{2},...,i^*_{T}) ,将 I I^* 作为预测结果。

γ t ( i ) = P ( i t = q i O , λ ) \gamma_t(i)=P(i_t=q_i|O,\lambda) ,即已知模型 λ \lambda ,给定观测序列条件下,在 t t 时刻状态为 q i q_i 的概率,根据前后向算法得出的结论1、2中有:

γ t ( i ) = α t ( i ) β t ( i ) i = 1 N α t ( i ) β t ( i ) \gamma_t(i)=\frac{\alpha_t(i)\beta_t(i)}{\sum\limits_{i=1}^{N}\alpha_t(i)\beta_t(i)}

那么在每一时刻 t t 最有可能的状态 i t i^*_t 为:

i t = arg max i γ t ( i ) i^*_t=\arg\max\limits_{i}\gamma_t(i)

从而得到最有可能的状态序列 I = ( i 1 , i 2 , . . . , i T ) I^*=(i^*_{1},i^*_{2},...,i^*_{T})
该算法简单,但是不能保证整体是最有可能的预测状态序列。

维特比算法

维特比算法实际上是用动态规划(dp)来求解HMM预测问题。

关于动态规划,也就是将大问题分解分众多小问题,通过小问题的解来得到大问题的解。对各个小问题进行求解后,会将结果填入表中,下次要用的时候就不用再去计算而是直接拿来用了,这样能有效避免重复计算问题(以空间换时间),基本上都会涉及到递推。具体的可以去leetcode上刷两题感受一下,下面写个常见机器人走格子的动态规划问题。

在这里插入图片描述

首先定义一个二维的表 int[][] dp,其中dp[i][j]表示从初始位置走到 ( i , j ) (i,j) 位置有多少种走法。现在我们需要得到的是 dp[m-1][n-1],即从初始位置走到终点有多少种走法。初始有dp[0][0]=1,那么递推公式是怎样的呢?考虑dp[i][j],由于到 ( i , j ) (i,j) 位置只能从该位置的左边或者上边走过来,左边走过来的方法数为dp[i][j-1],上边走过来的方法数为dp[i-1][j],两者之和就是走到该位置的方法数。根据dp[i][j-1],dp[i-1][j],需要初始化表的第一行和第一列。

class Solution {
    //dp[i][j]表示从左上角走到i,j位置的路径数 dp[i][j] = dp[i-1][j]+dp[i][j-1]
    //因为(i,j)位置只能由它上面走过来和左边走过来
    public int uniquePaths(int m, int n) {
		int[][] dp = new int[m][n];
		for(int i = 0; i < m; i ++){
			dp[i][0] = 1;
		}
		for(int j = 1; j < n; j ++){
			dp[0][j] = 1;
		}
		for(int i = 1; i < m; i ++){
			for(int j = 1; j < n; j ++){
				dp[i][j] = dp[i-1][j] + dp[i][j-1];
			}
		}
		return dp[m-1][n-1];
    }
}

再来看维特比算法

定义变量 δ t ( i ) \delta_t(i) :表示在 t t 时刻,状态为 i i 的所有路径中,概率的最大值。

δ t ( i ) = max i 1 , i 2 , . . . , i t 1 P ( i t = i , i t 1 , i t 2 , . . . , i 1 , o t , o t 1 , . . . , o 1 λ ) \delta_t(i)=\max\limits_{i_{1},i_{2},...,i_{t-1}}P(i_t=i,i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1|\lambda)

递推过程:

δ 1 ( i ) = P ( i 1 = i , o 1 λ ) = P ( o 1 i 1 = i , λ ) P ( i 1 = i λ ) = π i b i ( o 1 ) \delta_1(i)=P(i_1=i,o_1|\lambda)=P(o_1|i_1=i,\lambda)P(i_1=i|\lambda)=\pi_ib_i(o_1)

δ t + 1 ( i ) = max i 1 , i 2 , . . . , i t P ( i t + 1 = i , i t , . . . , i 1 , o t + 1 , . . . , o 1 λ ) = max 1 j N ( δ t ( j ) a j i ) b i ( o t + 1 ) \delta_{t+1}(i)=\max\limits_{i_{1},i_{2},...,i_{t}}P(i_{t+1}=i,i_{t},...,i_1,o_{t+1},...,o_1|\lambda)\\=\max\limits_{1\leq j \leq N}(\delta_t(j)a_{ji})b_i(o_{t+1})

终止:

P = max 1 i N δ T ( i ) P^*=\max\limits_{1\leq i \leq N}\delta_{T}(i)

对于递推过程的递推公式

( δ t ( j ) a j i ) b i ( o t + 1 ) = P ( i t = j , i t 1 , i t 2 , . . . , i 1 , o t , o t 1 , . . . , o 1 λ ) P ( i t + 1 = i i t = j , λ ) P ( o t + 1 i t + 1 = i , λ ) = P ( i t 1 , i t 2 , . . . , i 1 , o t , o t 1 , . . . , o 1 i t = j , λ ) P ( i t = j λ ) P ( i t + 1 = i i t = j , λ ) P ( o t + 1 i t + 1 = i , λ ) (\delta_t(j)a_{ji})b_i(o_{t+1})=P(i_t=j,i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1|\lambda)P(i_{t+1}=i|i_t=j,\lambda)P(o_{t+1}|i_{t+1}=i,\lambda)\\=P(i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1|i_t=j,\lambda)P(i_t=j|\lambda)P(i_{t+1}=i|i_t=j,\lambda)P(o_{t+1}|i_{t+1}=i,\lambda)

通过贝叶斯网络知道,在 i t = j i_t=j 的条件下 i t 1 , i t 2 , . . . , i 1 , o t , o t 1 , . . . , o 1 i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1 i t + 1 = i i_{t+1}=i 是条件独立的,所以有:
P ( i t 1 , i t 2 , . . . , i 1 , o t , o t 1 , . . . , o 1 i t = j , λ ) P ( i t = j λ ) P ( i t + 1 = i i t = j , λ ) = P ( i t + 1 = i , i t 1 , i t 2 , . . . , i 1 , o t , o t 1 , . . . , o 1 i t = j , λ ) P ( i t = j λ ) = P ( i t + 1 = i , i t = j , i t 1 , i t 2 , . . . , i 1 , o t , o t 1 , . . . , o 1 λ ) P(i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1|i_t=j,\lambda)P(i_t=j|\lambda)P(i_{t+1}=i|i_t=j,\lambda)\\=P(i_{t+1}=i,i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1|i_t=j,\lambda)P(i_t=j|\lambda)\\=P(i_{t+1}=i,i_t=j,i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1|\lambda)

带入到 ( δ t ( j ) a j i ) b i ( o t + 1 ) (\delta_t(j)a_{ji})b_i(o_{t+1}) ,得到

( δ t ( j ) a j i ) b i ( o t + 1 ) = P ( i t + 1 = i , i t = j , i t 1 , i t 2 , . . . , i 1 , o t , o t 1 , . . . , o 1 λ ) P ( o t + 1 i t + 1 = i , λ ) = P ( i t = j , i t 1 , i t 2 , . . . , i 1 , o t , o t 1 , . . . , o 1 λ ) P ( i t + 1 = i λ ) P ( o t + 1 i t + 1 = i , λ ) (\delta_t(j)a_{ji})b_i(o_{t+1})=P(i_{t+1}=i,i_t=j,i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1|\lambda)P(o_{t+1}|i_{t+1}=i,\lambda)\\=P(i_t=j,i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1|\lambda)P(i_{t+1}=i|\lambda)P(o_{t+1}|i_{t+1}=i,\lambda)

同样的方法得到

( δ t ( j ) a j i ) b i ( o t + 1 ) = P ( i t + 1 = i , i t = j , i t 1 , i t 2 , . . . , i 1 , o t + 1 , o t , o t 1 , . . . , o 1 λ ) (\delta_t(j)a_{ji})b_i(o_{t+1})=P(i_{t+1}=i,i_t=j,i_{t-1},i_{t-2},...,i_1,o_{t+1},o_t,o_{t-1},...,o_1|\lambda)

那么 max 1 j N ( δ t ( j ) a j i ) b i ( o t + 1 ) = max 1 j N P ( i t + 1 = i , i t = j , i t 1 , i t 2 , . . . , i 1 , o t + 1 , o t , o t 1 , . . . , o 1 λ ) = max i 1 , i 2 , . . . , i t P ( i t + 1 = i , i t , . . . , i 1 , o t + 1 , . . . , o 1 λ ) \max\limits_{1\leq j \leq N}(\delta_t(j)a_{ji})b_i(o_{t+1})=\max\limits_{1\leq j \leq N}P(i_{t+1}=i,i_t=j,i_{t-1},i_{t-2},...,i_1,o_{t+1},o_t,o_{t-1},...,o_1|\lambda)=\max\limits_{i_{1},i_{2},...,i_{t}}P(i_{t+1}=i,i_{t},...,i_1,o_{t+1},...,o_1|\lambda)

如果要求对应的路径 I = { i 1 , . . . , i T } I^*=\{i^*_1,...,i^*_T\} 那么只要回溯去求即可。

还有明明是求 P ( I O , λ ) P(I|O,\lambda) 为什么这里是 P ( I , O λ ) P(I,O|\lambda)

P ( I O , λ ) = P ( I , O λ ) P ( O λ ) P(I|O,\lambda)=\frac{P(I,O|\lambda)}{P(O|\lambda)} ,由于预测前是知道了模型和观测序列,所以分母就是一常数,忽略掉。

猜你喜欢

转载自blog.csdn.net/qq_37334135/article/details/86314856