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()