HMM-后向算法
假定现在隐含态是s1,s2,s3;观测状态是A,B
隐含态之间的转移情况如下图1:
上图1,2,3对应的就是隐含态s1,s2,s3之间的转移情况,然后他们之间的输出状态A,B之间的概率如下表
现在要计算在t=0时刻,t=1,t=2,t=3,t=4时刻观测序列是O={ABAB}的概率是多少?
后向算法就是从后往前计算,如图2所示,从t=4~t=1进行计算。
后向算法就是从Ot往后计算到Ot-1时刻如下图3所示。
接下来是简单的python 代码:
#! /usr/bin/env python #! -*- coding=utf-8 -*- from numpy import * import numpy as np import random import copy #HMM-backward算法 def hmm_backward(): Nstate = 3 Nobs = 2 T = 4 init_prob = [0.2,0.4,0.4] trans_prob = np.array([[0.5,0.2,0.3],[0.3,0.5,0.2],[0.2,0.3,0.5]]) emit_prob = np.array([[0.5,0.5],[0.4,0.6],[0.7,0.3]]) obs_seq = [0,1,0,1] #(ABAB) #单独计算t=T时刻的局部概率 partial_prob = zeros((Nstate,T)) for i in range(Nstate): partial_prob[i,T-1] = 1.0 #计算t<T-1时刻的局部概率 for t in range(T-2,-1,-1): for i in range(Nstate): tmp = 0 for j in range(Nstate): tmp = tmp + partial_prob[j,t+1] * trans_prob[j,i] * emit_prob[j,obs_seq[t]] partial_prob[i,t] = tmp# * emit_prob[i,obs_seq[t]] sum = 0.0 for i in range(Nstate): sum = sum + partial_prob[i,0] * init_prob[i] print sum if __name__ == '__main__': hmm_backward()