HMM之后向算法

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



猜你喜欢

转载自blog.csdn.net/u010866505/article/details/78204071
今日推荐