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

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

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

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

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

近似算法

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

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

γt(i)=αt(i)βt(i)i=1Nα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)}

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

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

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

维特比算法

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

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

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

首先定义一个二维的表 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):表示在 tt 时刻,状态为 ii 的所有路径中,概率的最大值。

δt(i)=maxi1,i2,...,it1P(it=i,it1,it2,...,i1,ot,ot1,...,o1λ)\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(i1=i,o1λ)=P(o1i1=i,λ)P(i1=iλ)=πibi(o1)\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)=maxi1,i2,...,itP(it+1=i,it,...,i1,ot+1,...,o1λ)=max1jN(δt(j)aji)bi(ot+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=max1iNδT(i)P^*=\max\limits_{1\leq i \leq N}\delta_{T}(i)

对于递推过程的递推公式

(δ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,λ)(\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)

通过贝叶斯网络知道,在it=ji_t=j的条件下 it1,it2,...,i1,ot,ot1,...,o1i_{t-1},i_{t-2},...,i_1,o_t,o_{t-1},...,o_1it+1=ii_{t+1}=i 是条件独立的,所以有:
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λ)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)aji)bi(ot+1)(\delta_t(j)a_{ji})b_i(o_{t+1}),得到

(δ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,λ)(\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+1,ot,ot1,...,o1λ)(\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)

那么max1jN(δt(j)aji)bi(ot+1)=max1jNP(it+1=i,it=j,it1,it2,...,i1,ot+1,ot,ot1,...,o1λ)=maxi1,i2,...,itP(it+1=i,it,...,i1,ot+1,...,o1λ)\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={i1,...,iT}I^*=\{i^*_1,...,i^*_T\} 那么只要回溯去求即可。

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

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

相关文章:

  • 2021-12-18
  • 2021-07-01
  • 2022-01-04
  • 2021-11-07
  • 2022-01-30
  • 2021-12-03
  • 2022-12-23
猜你喜欢
  • 2021-04-02
  • 2022-01-10
  • 2022-12-23
  • 2021-04-13
  • 2021-09-05
  • 2022-01-15
相关资源
相似解决方案