这里写自定义目录标题隐马尔可夫模型预测算法维特比解码算法隐马尔可夫模型预测算法维特比解码算法在隐马尔科夫模型中我们使用维特比解码算法求得概率的最大路径最优路径。依据的方法为动态规划。而动态规划又满足最优化原理给出一个最优的决策序列每个子序列自身必须是最优的决策序列。 下面则为整个过程的符号引入与递推公式下面为数理统计方法中关于维特比算法的例题下面则为维特比解码算法的python代码实现:importnumpyasnpdefvitebi_decode(hmm_paramter,obs_idx_seq):#取出HMM模型的三个参数A,B,Lhmm_paramter#状态的总个数NA.shape[0]#获取观测序列的长度Tlen(obs_idx_seq)#定义[N*T]的矩阵P用来表示t时刻状态为i的最大概率Pnp.zeros((N,T))#定义[N*T]的矩阵D用来表示t时刻状态为i取得最大概率时t-1时刻的状态Dnp.zeros((N,T),dtypeint)#初始化P,D在t0时刻所对应的概率值和初状态foriinrange(N):P[i][0]L[i]*(B[i,obs_idx_seq[0]])D[i][0]-1#接下来通过一个三层循环对P,D里面的元素进行赋值操作foriinrange(1,T):obs_valueobs_idx_seq[i]forjinrange(N):pro_list[]forkinrange(N):pro_list.append(P[k,i-1]*A[k,j]*B[j,obs_value])max_valuemax(pro_list)max_idxpro_list.index(max_value)P[j,i]max_value D[j,i]max_idx#获取P最后一个时刻的最大值即为最大概率final_max_valuenp.max(P,axis0)[-1]final_max_idxnp.argmax(P,axis0)[-1]#通过finax_max_idx和D倒推出最大概率值所对应的状态序列state_list[]state_list.append(final_max_idx)foriinrange(T-1,0,-1):final_max_idxD[final_max_idx][i]state_list.append(final_max_idx)final_state_list[]#由于状态是从1开始的所以要对每一个状态索引加1foriinrange(len(state_list)-1,-1,-1):final_state_list.append(state_list[i]1)#print(P)#print(D)returnfinal_max_value,final_state_listif__name____main__:Anp.array([[0.5,0.2,0.3],[0.3,0.5,0.2],[0.2,0.3,0.5]])Bnp.array([[0.5,0.5],[0.4,0.6],[0.7,0.3]])L[0.2,0.4,0.4]O[红,白,红]obs_to_idx{红:0,白:1}obs_seq_idx[obs_to_idx[i]foriinO]max_pro,state_seqvitebi_decode((A,B,L),obs_seq_idx)print(max_pro)print(state_seq)运行结果如下当然也可以将P,D两个矩阵打印·这与统计学习方法中所得到的的结果是一致的
维特比算法的python实现
这里写自定义目录标题隐马尔可夫模型预测算法维特比解码算法隐马尔可夫模型预测算法维特比解码算法在隐马尔科夫模型中我们使用维特比解码算法求得概率的最大路径最优路径。依据的方法为动态规划。而动态规划又满足最优化原理给出一个最优的决策序列每个子序列自身必须是最优的决策序列。 下面则为整个过程的符号引入与递推公式下面为数理统计方法中关于维特比算法的例题下面则为维特比解码算法的python代码实现:importnumpyasnpdefvitebi_decode(hmm_paramter,obs_idx_seq):#取出HMM模型的三个参数A,B,Lhmm_paramter#状态的总个数NA.shape[0]#获取观测序列的长度Tlen(obs_idx_seq)#定义[N*T]的矩阵P用来表示t时刻状态为i的最大概率Pnp.zeros((N,T))#定义[N*T]的矩阵D用来表示t时刻状态为i取得最大概率时t-1时刻的状态Dnp.zeros((N,T),dtypeint)#初始化P,D在t0时刻所对应的概率值和初状态foriinrange(N):P[i][0]L[i]*(B[i,obs_idx_seq[0]])D[i][0]-1#接下来通过一个三层循环对P,D里面的元素进行赋值操作foriinrange(1,T):obs_valueobs_idx_seq[i]forjinrange(N):pro_list[]forkinrange(N):pro_list.append(P[k,i-1]*A[k,j]*B[j,obs_value])max_valuemax(pro_list)max_idxpro_list.index(max_value)P[j,i]max_value D[j,i]max_idx#获取P最后一个时刻的最大值即为最大概率final_max_valuenp.max(P,axis0)[-1]final_max_idxnp.argmax(P,axis0)[-1]#通过finax_max_idx和D倒推出最大概率值所对应的状态序列state_list[]state_list.append(final_max_idx)foriinrange(T-1,0,-1):final_max_idxD[final_max_idx][i]state_list.append(final_max_idx)final_state_list[]#由于状态是从1开始的所以要对每一个状态索引加1foriinrange(len(state_list)-1,-1,-1):final_state_list.append(state_list[i]1)#print(P)#print(D)returnfinal_max_value,final_state_listif__name____main__:Anp.array([[0.5,0.2,0.3],[0.3,0.5,0.2],[0.2,0.3,0.5]])Bnp.array([[0.5,0.5],[0.4,0.6],[0.7,0.3]])L[0.2,0.4,0.4]O[红,白,红]obs_to_idx{红:0,白:1}obs_seq_idx[obs_to_idx[i]foriinO]max_pro,state_seqvitebi_decode((A,B,L),obs_seq_idx)print(max_pro)print(state_seq)运行结果如下当然也可以将P,D两个矩阵打印·这与统计学习方法中所得到的的结果是一致的