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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值