算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)

这篇具有很好参考价值的文章主要介绍了算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 ——马尔可夫链

——隐马尔可夫链


 ——马尔可夫链

马尔科夫性质:即当前在已知时,过去和未来是独立的,如果知道当前的状态,那么就不许要过去的额外信息来对未来做出预测。

算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)

理解:n为n-1的后一个时间(或者说单位),若n-1为当前时刻状态,那么n即为下一刻的未来状态,0至n-1为先前的过去状态。满足上式说明:基于n-1刻(事件发生)背景下第n刻(事件发生)的概率基于所有先前(事件发生)概率下第n刻(事件发生)的概率相等。通俗理解就是下一刻(n)事件的发生只与当前时刻(n-1)相关,与先前的时刻(0至n-1)无关。 

 马尔科夫链:满足马尔科夫性质的随机过程。 

马尔科夫链用于计算事件发生——引例:

        如果今天是sunny day,下一天是rainy day的概率为30%,仍然是sunny day的概率是70%。如果今天是rainy day,下一天是sunny day的概率为20%,仍然是rainy day的概率是80%。

算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)

        引入数学分析,我们设S为状态空间。则S=[sunny day,rainy day],其中所有元素都是过程可以达到的所有可能状态。我们令今天的状态为S0,假如今天是sunny day,则S0=[1,0]。

设明天的状态是S1,那么从S0到S1就需要一个概率转移矩阵P,

算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)

就转移矩阵而言,表达两种状态相互转化信息,所以维度2*2,转化如下。

S1=S0*P

S2=S1*P= S0*P*P=S0*P2

Sn=S0*Pn

离散时间的马尔科夫链:是指变化发生在特点的状态之中。

状态:马尔科夫链在离散时间的值称为状态。

稳态马尔可夫链:马尔可夫链可以是静止的,因此与过程中的初始状态无关。这种现象也称为稳态马尔可夫链,稳态马尔科夫链必须是时间同质的,即概率转移矩阵不会时刻n的不同而不同

实例:

在将马尔可夫链应用于股市预测中。状态空间为:

S=[Bull markets, Bear markets, Stagnant markets]

其状态间的转移概率为:

算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)

当前周的状态向量为:C=[0,1,0],可计算未来n周股市市场的概率。

算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)

结果表明:

1、当n趋于无穷大时,概率会收敛到一个稳定状态,称为稳态概率。

2、实验表明,稳态概率不受初始状态的影响

参考网站:https://en.wikipedia.org/wiki/Markov_model 

"""
Author:小堂同学
Time:2022.8.21
"""

import numpy as np
# 经典马尔可夫模型
def classic_markov(ini_state,transition_matrix,K):
	"""
	:param ini_state: 初始状态
	:param transition_matrix: 转移矩阵
	:param K: 预测后K个单位
	:return:
	"""
	ini_state = np.mat(ini_state)
	transition_matrix = np.mat(transition_matrix)
	if ini_state.shape[1] != transition_matrix.shape[0] \
		or transition_matrix.shape[0] != transition_matrix.shape[1]:
		return False
	return ini_state @ np.linalg.matrix_power(transition_matrix,K)

ini_state = [0,1,0]
t = [[0.9,0.075,0.025],[0.15,0.8,0.05],[0.25,0.25,0.5]]
print(classic_markov(ini_state,t,1))
print(classic_markov(ini_state,t,5))
print(classic_markov(ini_state,t,52))
print(classic_markov(ini_state,t,99))

ini_state = [1,0,0]
print(classic_markov(ini_state,t,99))

——隐马尔可夫链

原理我推荐以下两篇博客 ,写得很好很清楚。

统计学习方法笔记-隐马尔可夫模型(内含Python代码实现)_三岁就很萌@D的博客-CSDN博客_隐马尔可夫python一 马尔可夫模型我们通过一个具体的例子来介绍一下什么是马尔可夫模型我们假设天气有3种情况,阴天,雨天,晴天,它们之间的转换关系如下:(稍微解释一下这个图,我们可以这样认为,已知第一天是阴天,那第二天是阴天的概率是0.1, 第二天是晴天的概率是0.3,第二天是雨天的概率是0.6)每一个状态转换到另一个状态或者自身的状态都有一定的概率。马尔可夫模型就是用来表述上述问题的一个模型。有这样一个状态链,第一天是阴天,第二天是晴天,第三天是雨天。 这样一个状态链就是马尔可夫链。在上述例子中,如果我们并不知https://blog.csdn.net/qq_44822951/article/details/109752436

维特比算法_火贪三刀的博客-CSDN博客_维比特算法维特比算法在机器学习中非常重要,在求解隐马尔科夫和条件随机场的预测问题中均用到了维特比算法。实际上,维特比算法不仅是很多自然语言处理的解码算法,也是现代数字通信中使用最频繁的算法。以一个简单的隐马尔科夫模型为例, x=(x1,x2,...,xN)x=(x_1,x_2,...,x_N)为观测符号,y=(y1,y2,...,yN)y=(y_1,y_2,...,y_N)为隐状态序列,要求的预测问题为https://blog.csdn.net/shijing_0214/article/details/51173887

"""
Author:小堂同学
Time:2022.8.21
"""

import sys
import numpy as np

class Hidden_Markov:

	def __init__(self,
				 state_space,
				 state_transition_matrix,
				 observe_probability_matrix,
				 ini_probability_vector,
				 observe_dict,
				 observe_list):
		self.Q = state_space	# 状态集合
		self.A = np.mat(state_transition_matrix)	# 状态转移矩阵
		self.B = np.mat(observe_probability_matrix)		# 观测概率矩阵
		self.C = ini_probability_vector		# 初始状态概率向量
		self.V = dict(observe_dict)		# 观测集合,字典类型
		self.N = len(state_space)	# 状态总数
		self.M = len(observe_dict)	# 观测集合总数
		if len(state_space) != self.A.shape[0] or \
		   self.A.shape[0] != self.A.shape[1] or \
		   self.B.shape[0] != len(state_space) or \
			self.B.shape[1] != len(observe_dict):
			print("输入数据有错!")
			sys.exit()
		self.O = observe_list		# 观测序列

	def forward(self):
		ini_value = [round(self.C[i] * self.B[i,self.V[self.O[0]]],4)
					 for i in range(self.N)]
		ls = ini_value
		for t in range(1,len(self.O)):
			ls = [
				sum([ls[j] * self.A[j,i] for j in range(self.N)]) * \
				self.B[i,self.V[self.O[t]]]
				for i in range(self.N)
			]
		return round(sum(ls),5)

	def back(self):
		b = [1 for i in range(self.N)]
		T = [i for i in range(1,len(self.O))]
		T.reverse()			# 产生T-1至1
		for t in T:
			b = [
				sum([self.A[i,j] * self.B[j,self.V[self.O[t]]] * b[j] for j in range(self.N)])
				for i in range(self.N)
			]
		return round(sum(
			[self.C[i] * self.B[i,self.V[self.O[0]]] * b[i]
			for i in range(self.N)]
						),5)

	def prediction(self):
		f = []
		F = []
		f1 = [round(self.C[i] * self.B[i,self.V[self.O[0]]],4) for i in range(self.N)]
		F1 = [0 for i in range(self.N)]
		f.append(f1)
		F.append(F1)
		for t in range(1,len(self.O)):
			temp_f = [round(
				max([f[t-1][j] * self.A[j,i]  for j in range(self.N)]) * self.B[i,self.V[self.O[t]]]
				,5)
				for i in range(self.N)]
			f.append(temp_f)

			temp_F = []
			for i in range(self.N):
				ls = [f[t-1][j] * self.A[j,i] * self.B[i,self.V[self.O[t]]] for j in range(self.N)]
				temp_F.append(ls.index(max(ls))+1)
			F.append(temp_F)
		P = max(f[-1])
		prediction =[]
		sta = f[-1].index(P)+1
		prediction.append(sta)
		for t in range(1,len(self.O)):
			temp_sta = F[-t][prediction[t-1]-1]
			prediction.append(temp_sta)
		prediction.reverse()
		return prediction

if __name__ == "__main__":
	Q = [1,2,3]
	V = {"红":0,
		 "白":1}
	C = [0.2,0.4,0.4]
	A = [[0.5,0.2,0.3],
		 [0.3,0.5,0.2],
		 [0.2,0.3,0.5]]
	B = [[0.5,0.5],
		 [0.4,0.6],
		 [0.7,0.3]]
	O = ["红","白","红"]
	HMM = Hidden_Markov(Q,A,B,C,V,O)
	print(HMM.forward())
	print(HMM.back())
	print(HMM.prediction())

浅薄之见,敬请指正!

共勉!文章来源地址https://www.toymoban.com/news/detail-447789.html


到了这里,关于算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包