HMM算法推导(附代码)

推导过程:
在这里插入图片描述
在这里插入图片描述
完整代码(还有待改进):



from numpy import *
import numpy as np

class HMM:

	def __init__(self):
		self.emission_probability=np.array([(0.1,0.4,0.5),(0.6,0.3,0.1)])
		self.transition_probability=np.array([(0.7,0.3),(0.4,0.6)])
		self.start_probability=np.array([(0.6),(0.4)])
		self.out=[1,0,0]
		self.t=len(self.out)
		self.m=len(self.emission_probability)
		self.n=len(self.transition_probability[0])


	def viterbi(self):
		self.z = array(zeros((self.t, self.m)))
		self.d = array(zeros((self.t, self.m)))
		for i in range(self.m):
			self.z[0][i]=self.start_probability[i]*self.transition_probability[i][self.out[0]]
			self.d[0][i]=0
		for j in range(1,self.t):
			for i in range(self.m):
				maxnum=self.z[j-1][0]*self.emission_probability[0][i]
				node=1
				for k in range(1,self.m):
					temp=self.z[j-1][k]*self.emission_probability[k][i]
					if(maxnum<temp):
						maxnum=temp
						node=k+1
				self.z[j][i]=maxnum*self.transition_probability[i][self.out[j]]
				self.d[j][i]=node
		max_probability=self.z[self.t-1][0]
		last_node=[1]
		temp=0
		for i in range(1,self.m):
			if(max_probability<self.z[self.t-1][i]):
				max_probability=self.z[self.t-1][i]
				last_node[0]=i+1
				temp=i
		i=self.t-1
		while(i>=1):
			last_node.append(self.d[i][temp])
			i=i-1
		temp=['o']
		temp[0]=int(last_node[len(last_node)-1])
		j=len(last_node)-2
		while j>=0:
			temp.append(int(last_node[j]))
			j=j-1
		print('1代表晴天,2代表雨天,则路径节点为')
		print(temp)
		print('该路径概率为'+str(max_probability))


if __name__ == '__main__':
	test=HMM()
	test.viterbi()


运行结果如图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值