1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 算法介绍及实现——马尔可夫链 隐马尔可夫链(附Python实现)

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

时间:2023-12-19 04:43:46

相关推荐

算法介绍及实现——马尔可夫链 隐马尔可夫链(附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%。

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

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

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

S1=S0*P

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

Sn=S0*Pn

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

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

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

实例:

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

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

其状态间的转移概率为:

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

结果表明:

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

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

参考网站:/wiki/Markov_model

"""Author:小堂同学Time:.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 Falsereturn 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)每一个状态转换到另一个状态或者自身的状态都有一定的概率。马尔可夫模型就是用来表述上述问题的一个模型。有这样一个状态链,第一天是阴天,第二天是晴天,第三天是雨天。 这样一个状态链就是马尔可夫链。在上述例子中,如果我们并不知/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)为隐状态序列,要求的预测问题为/shijing_0214/article/details/51173887

"""Author:小堂同学Time:.8.21"""import sysimport numpy as npclass 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_valuefor 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至1for 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)+1prediction.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 predictionif __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())

浅薄之见,敬请指正!

共勉!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。