学习隐马尔可夫模型(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(I∣O,λ),即给定观测序列求最优可能的状态序列。
记: 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=qi∣O,λ),即已知模型 λ \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=1∑Nα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上刷两题感受一下,下面写个常见机器人走格子的动态规划问题。
首先定义一个二维的表 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,...,it−1maxP(it=i,it−1,it−2,...,i1,ot,ot−1,...,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(o1∣i1=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∣λ)=1≤j≤Nmax(δ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∗=1≤i≤Nmaxδ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,it−1,it−2,...,i1,ot,ot−1,...,o1∣λ)P(it+1=i∣it=j,λ)P(ot+1∣it+1=i,λ)=P(it−1,it−2,...,i1,ot,ot−1,...,o1∣it=j,λ)P(it=j∣λ)P(it+1=i∣it=j,λ)P(ot+1∣it+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 it−1,it−2,...,i1,ot,ot−1,...,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(it−1,it−2,...,i1,ot,ot−1,...,o1∣it=j,λ)P(it=j∣λ)P(it+1=i∣it=j,λ)=P(it+1=i,it−1,it−2,...,i1,ot,ot−1,...,o1∣it=j,λ)P(it=j∣λ)=P(it+1=i,it=j,it−1,it−2,...,i1,ot,ot−1,...,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,it−1,it−2,...,i1,ot,ot−1,...,o1∣λ)P(ot+1∣it+1=i,λ)=P(it=j,it−1,it−2,...,i1,ot,ot−1,...,o1∣λ)P(it+1=i∣λ)P(ot+1∣it+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,it−1,it−2,...,i1,ot+1,ot,ot−1,...,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) 1≤j≤Nmax(δt(j)aji)bi(ot+1)=1≤j≤NmaxP(it+1=i,it=j,it−1,it−2,...,i1,ot+1,ot,ot−1,...,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(I∣O,λ)为什么这里是 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(I∣O,λ)=P(O∣λ)P(I,O∣λ),由于预测前是知道了模型和观测序列,所以分母就是一常数,忽略掉。