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

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

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

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

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

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

近似算法

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

γ t ( i ) = P ( i t = q i ∣ O , λ ) \gamma_t(i)=P(i_t=q_i|O,\lambda) γt(i)=P(it=qiO,λ),即已知模型 λ \lambda λ,给定观测序列条件下,在 t t t 时刻状态为 q i q_i qi 的概率,根据前后向算法得出的结论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(i)=i=1Nαt(i)βt(i)αt(i)βt(i)

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

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

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

维特比算法

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

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

HMM学习笔记(三):动态规划与维特比算法_第1张图片

首先定义一个二维的表 int[][] dp,其中dp[i][j]表示从初始位置走到 ( i , j ) (i,j) (i,j) 位置有多少种走法。现在我们需要得到的是 dp[m-1][n-1],即从初始位置走到终点有多少种走法。初始有dp[0][0]=1,那么递推公式是怎样的呢?考虑dp[i][j],由于到 ( 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(i):表示在 t t t 时刻,状态为 i 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) δt(i)=i1,i2,...,it1maxP(it=i,it1,it2,...,i1,ot,ot1,...,o1λ)

递推过程:

δ 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) δ1(i)=P(i1=i,o1λ)=P(o1i1=i,λ)P(i1=iλ)=πibi(o1)

δ 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}) δt+1(i)=i1,i2,...,itmaxP(it+1=i,it,...,i1,ot+1,...,o1λ)=1jNmax(δt(j)aji)bi(ot+1)

终止:

P ∗ = max ⁡ 1 ≤ i ≤ N δ T ( i ) P^*=\max\limits_{1\leq i \leq N}\delta_{T}(i) P=1iNmaxδ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) (δt(j)aji)bi(ot+1)=P(it=j,it1,it2,...,i1,ot,ot1,...,o1λ)P(it+1=iit=j,λ)P(ot+1it+1=i,λ)=P(it1,it2,...,i1,ot,ot1,...,o1it=j,λ)P(it=jλ)P(it+1=iit=j,λ)P(ot+1it+1=i,λ)

通过贝叶斯网络知道,在 i t = j i_t=j it=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 it1,it2,...,i1,ot,ot1,...,o1 i t + 1 = i i_{t+1}=i it+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) P(it1,it2,...,i1,ot,ot1,...,o1it=j,λ)P(it=jλ)P(it+1=iit=j,λ)=P(it+1=i,it1,it2,...,i1,ot,ot1,...,o1it=j,λ)P(it=jλ)=P(it+1=i,it=j,it1,it2,...,i1,ot,ot1,...,o1λ)

带入到 ( δ t ( j ) a j i ) b i ( o t + 1 ) (\delta_t(j)a_{ji})b_i(o_{t+1}) (δt(j)aji)bi(ot+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)aji)bi(ot+1)=P(it+1=i,it=j,it1,it2,...,i1,ot,ot1,...,o1λ)P(ot+1it+1=i,λ)=P(it=j,it1,it2,...,i1,ot,ot1,...,o1λ)P(it+1=iλ)P(ot+1it+1=i,λ)

同样的方法得到

( δ 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) (δt(j)aji)bi(ot+1)=P(it+1=i,it=j,it1,it2,...,i1,ot+1,ot,ot1,...,o1λ)

那么 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) 1jNmax(δt(j)aji)bi(ot+1)=1jNmaxP(it+1=i,it=j,it1,it2,...,i1,ot+1,ot,ot1,...,o1λ)=i1,i2,...,itmaxP(it+1=i,it,...,i1,ot+1,...,o1λ)

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

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

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

你可能感兴趣的:(机器学习)