python模拟隐马尔可夫模型的方法是什么
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要讲解了"python模拟隐马尔可夫模型的方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python模拟隐马尔可夫模型的方法是什么
千家信息网最后更新 2024年11月11日python模拟隐马尔可夫模型的方法是什么
这篇文章主要讲解了"python模拟隐马尔可夫模型的方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python模拟隐马尔可夫模型的方法是什么"吧!
import numpy as npclass HiddenMarkov: def __init__(self): self.alphas = None self.forward_P = None self.betas = None self.backward_P = None # 前向算法 # Q 是状态集合,里面包含了所有可能的状态 # V 是我们的观测的集合,里面包含了所有可能的观测结果 # A 状态转移概率分布 # B 观测概率分布 # O 观测序列,依次为观测值 # PI 初始概率分布。根据这个先生成初始状态。 def forward(self, Q, V, A, B, O, PI): # 状态序列的大小 N = len(Q) # 观测序列的大小 M = len(O) # 初始化前向概率alpha值 alphas = np.zeros((N, M)) # 时刻数=观测序列数 T = M # 遍历每一个时刻,计算前向概率alpha值 for t in range(T): # 得到序列对应的索引 indexOfO = V.index(O[t]) # 遍历状态序列 for i in range(N): # 初始化alpha初值 if t == 0: # P176 公式(10.15) alphas[i][t] = PI[t][i] * B[i][indexOfO] print('alpha1(%d) = p%db%db(o1) = %f' % (i + 1, i, i, alphas[i][t])) else: # P176 公式(10.16) alphas[i][t] = np.dot([alpha[t - 1] for alpha in alphas], [a[i] for a in A]) * B[i][indexOfO] print('alpha%d(%d) = [sigma alpha%d(i)ai%d]b%d(o%d) = %f' % (t + 1, i + 1, t - 1, i, i, t, alphas[i][t])) # P176 公式(10.17) self.forward_P = np.sum([alpha[M - 1] for alpha in alphas]) self.alphas = alphas # 后向算法 # Q 是状态集合,里面包含了所有可能的状态 # V 是我们的观测的集合,里面包含了所有可能的观测结果 # A 状态转移概率分布 # B 观测概率分布 # O 观测序列,依次为观测值 # PI 初始概率分布。根据这个先生成初始状态。 def backward(self, Q, V, A, B, O, PI): # 状态序列的大小 N = len(Q) # 观测序列的大小 M = len(O) # 初始化后向概率beta值,P178 公式(10.19) betas = np.ones((N, M)) for i in range(N): print('beta%d(%d) = 1' % (M, i + 1)) # 对观测序列逆向遍历 for t in range(M - 2, -1, -1): # 得到序列对应的索引 indexOfO = V.index(O[t + 1]) # 遍历状态序列 for i in range(N): # P178 公式(10.20) betas[i][t] = np.dot( np.multiply(A[i], [b[indexOfO] for b in B]), [beta[t + 1] for beta in betas]) realT = t + 1 realI = i + 1 print('beta%d(%d) = sigma[a%djbj(o%d)beta%d(j)] = (' % (realT, realI, realI, realT + 1, realT + 1), end='') for j in range(N): print("%.2f * %.2f * %.2f + " % (A[i][j], B[j][indexOfO], betas[j][t + 1]), end='') print("0) = %.3f" % betas[i][t]) # 取出第一个值 indexOfO = V.index(O[0]) self.betas = betas # P178 公式(10.21) P = np.dot(np.multiply(PI, [b[indexOfO] for b in B]), [beta[0] for beta in betas]) self.backward_P = P print("P(O|lambda) = ", end="") for i in range(N): print("%.1f * %.1f * %.5f + " % (PI[0][i], B[i][indexOfO], betas[i][0]), end="") print("0 = %f" % P) # 维特比算法:动态规划解隐马尔代夫模型预测问题 # Q 是状态集合,里面包含了所有可能的状态 # V 是我们的观测的集合,里面包含了所有可能的观测结果 # A 状态转移概率分布 # B 观测概率分布 # O 观测序列,依次为观测值 # PI 初始概率分布。根据这个先生成初始状态。 def viterbi(self, Q, V, A, B, O, PI): # 状态序列的大小 N = len(Q) # 观测序列的大小 M = len(O) # 初始化daltas:存当前时刻当前状态的所有单个路径的概率最大值 deltas = np.zeros((N, M)) # 初始化psis:存当前时刻当前状态所有单个路径中概率最大路径的前一时刻结点 psis = np.zeros((N, M)) # 初始化最优路径矩阵,该矩阵维度与观测序列维度相同。这是我们最后的输出。 I = np.zeros((1, M)) # 遍历观测序列 for t in range(M): # 递推从t=2开始 realT = t + 1 # 得到序列对应的索引 indexOfO = V.index(O[t]) for i in range(N): realI = i + 1 if t == 0: # P185 算法10.5 步骤(1) deltas[i][t] = PI[0][i] * B[i][indexOfO] psis[i][t] = 0 print('delta1(%d) = pi%d * b%d(o1) = %.2f * %.2f = %.2f' % (realI, realI, realI, PI[0][i], B[i][indexOfO], deltas[i][t])) print('psis1(%d) = 0' % (realI)) else: # # P185 算法10.5 步骤(2) deltas[i][t] = np.max( np.multiply([delta[t - 1] for delta in deltas], [a[i] for a in A])) * B[i][indexOfO] print( 'delta%d(%d) = max[delta%d(j)aj%d]b%d(o%d) = %.2f * %.2f = %.5f' % (realT, realI, realT - 1, realI, realI, realT, np.max( np.multiply([delta[t - 1] for delta in deltas], [a[i] for a in A])), B[i][indexOfO], deltas[i][t])) # 对于y=f(x),argmax返回取得最大值y时的x psis[i][t] = np.argmax( np.multiply([delta[t - 1] for delta in deltas], [a[i] for a in A])) print('psis%d(%d) = argmax[delta%d(j)aj%d] = %d' % (realT, realI, realT - 1, realI, psis[i][t])) # 得到最优路径的终结点 I[0][M - 1] = np.argmax([delta[M - 1] for delta in deltas]) print('i%d = argmax[deltaT(i)] = %d' % (M, I[0][M - 1] + 1)) # 递归由后向前得到其他结点 for t in range(M - 2, -1, -1): I[0][t] = psis[int(I[0][t + 1])][t + 1] print('i%d = psis%d(i%d) = %d' % (t + 1, t + 2, t + 2, I[0][t] + 1)) # 输出最优路径 print('最优路径是:', "->".join([str(int(i + 1)) for i in I[0]]))# 习题10.1Q = [1, 2, 3]V = ['红', '白']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 = ['红', '白', '红', '红', '白', '红', '白', '白']O = ['红', '白', '红', '白'] # 习题10.1的例子PI = [[0.2, 0.4, 0.4]]HMM = HiddenMarkov()HMM.forward(Q, V, A, B, O, PI)print("P(O|λ)={}".format(HMM.forward_P))# HMM.backward(Q, V, A, B, O, PI)# print("P(O|λ)={}".format(HMM.backward_P))# HMM.viterbi(Q, V, A, B, O, PI)
结果
前向算法
alpha1(1) = p0b0b(o1) = 0.100000alpha1(2) = p1b1b(o1) = 0.160000alpha1(3) = p2b2b(o1) = 0.280000alpha2(1) = [sigma alpha0(i)ai0]b0(o1) = 0.077000alpha2(2) = [sigma alpha0(i)ai1]b1(o1) = 0.110400alpha2(3) = [sigma alpha0(i)ai2]b2(o1) = 0.060600alpha3(1) = [sigma alpha1(i)ai0]b0(o2) = 0.041870alpha3(2) = [sigma alpha1(i)ai1]b1(o2) = 0.035512alpha3(3) = [sigma alpha1(i)ai2]b2(o2) = 0.052836alpha4(1) = [sigma alpha2(i)ai0]b0(o3) = 0.021078alpha4(2) = [sigma alpha2(i)ai1]b1(o3) = 0.025188alpha4(3) = [sigma alpha2(i)ai2]b2(o3) = 0.013824P(O|λ)=0.06009079999999999
后向算法
beta4(1) = 1beta4(2) = 1beta4(3) = 1beta3(1) = sigma[a1jbj(o4)beta4(j)] = (0.50 * 0.50 * 1.00 + 0.20 * 0.60 * 1.00 + 0.30 * 0.30 * 1.00 + 0) = 0.460beta3(2) = sigma[a2jbj(o4)beta4(j)] = (0.30 * 0.50 * 1.00 + 0.50 * 0.60 * 1.00 + 0.20 * 0.30 * 1.00 + 0) = 0.510beta3(3) = sigma[a3jbj(o4)beta4(j)] = (0.20 * 0.50 * 1.00 + 0.30 * 0.60 * 1.00 + 0.50 * 0.30 * 1.00 + 0) = 0.430beta2(1) = sigma[a1jbj(o3)beta3(j)] = (0.50 * 0.50 * 0.46 + 0.20 * 0.40 * 0.51 + 0.30 * 0.70 * 0.43 + 0) = 0.246beta2(2) = sigma[a2jbj(o3)beta3(j)] = (0.30 * 0.50 * 0.46 + 0.50 * 0.40 * 0.51 + 0.20 * 0.70 * 0.43 + 0) = 0.231beta2(3) = sigma[a3jbj(o3)beta3(j)] = (0.20 * 0.50 * 0.46 + 0.30 * 0.40 * 0.51 + 0.50 * 0.70 * 0.43 + 0) = 0.258beta1(1) = sigma[a1jbj(o2)beta2(j)] = (0.50 * 0.50 * 0.25 + 0.20 * 0.60 * 0.23 + 0.30 * 0.30 * 0.26 + 0) = 0.112beta1(2) = sigma[a2jbj(o2)beta2(j)] = (0.30 * 0.50 * 0.25 + 0.50 * 0.60 * 0.23 + 0.20 * 0.30 * 0.26 + 0) = 0.122beta1(3) = sigma[a3jbj(o2)beta2(j)] = (0.20 * 0.50 * 0.25 + 0.30 * 0.60 * 0.23 + 0.50 * 0.30 * 0.26 + 0) = 0.105P(O|lambda) = 0.2 * 0.5 * 0.11246 + 0.4 * 0.4 * 0.12174 + 0.4 * 0.7 * 0.10488 + 0 = 0.060091P(O|λ)=[0.0600908]
维特比算法
delta1(1) = pi1 * b1(o1) = 0.20 * 0.50 = 0.10psis1(1) = 0delta1(2) = pi2 * b2(o1) = 0.40 * 0.40 = 0.16psis1(2) = 0delta1(3) = pi3 * b3(o1) = 0.40 * 0.70 = 0.28psis1(3) = 0delta2(1) = max[delta1(j)aj1]b1(o2) = 0.06 * 0.50 = 0.02800psis2(1) = argmax[delta1(j)aj1] = 2delta2(2) = max[delta1(j)aj2]b2(o2) = 0.08 * 0.60 = 0.05040psis2(2) = argmax[delta1(j)aj2] = 2delta2(3) = max[delta1(j)aj3]b3(o2) = 0.14 * 0.30 = 0.04200psis2(3) = argmax[delta1(j)aj3] = 2delta3(1) = max[delta2(j)aj1]b1(o3) = 0.02 * 0.50 = 0.00756psis3(1) = argmax[delta2(j)aj1] = 1delta3(2) = max[delta2(j)aj2]b2(o3) = 0.03 * 0.40 = 0.01008psis3(2) = argmax[delta2(j)aj2] = 1delta3(3) = max[delta2(j)aj3]b3(o3) = 0.02 * 0.70 = 0.01470psis3(3) = argmax[delta2(j)aj3] = 2delta4(1) = max[delta3(j)aj1]b1(o4) = 0.00 * 0.50 = 0.00189psis4(1) = argmax[delta3(j)aj1] = 0delta4(2) = max[delta3(j)aj2]b2(o4) = 0.01 * 0.60 = 0.00302psis4(2) = argmax[delta3(j)aj2] = 1delta4(3) = max[delta3(j)aj3]b3(o4) = 0.01 * 0.30 = 0.00220psis4(3) = argmax[delta3(j)aj3] = 2i4 = argmax[deltaT(i)] = 2i3 = psis4(i4) = 2i2 = psis3(i3) = 2i1 = psis2(i2) = 3最优路径是: 3->2->2->2
感谢各位的阅读,以上就是"python模拟隐马尔可夫模型的方法是什么"的内容了,经过本文的学习后,相信大家对python模拟隐马尔可夫模型的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
观测
状态
序列
概率
算法
路径
公式
大小
模型
马尔
时刻
方法
可夫
结果
最大
索引
学习
生成
习题
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器端和客户端无法连接
pg数据库符号
我想看网络安全手抄报图片
服务器远程管理卡 安全问题
数据库访问数据的权限有哪4个
成都电商软件开发哪家正规
初学软件开发适合看什么书
深度系统软件开发工具
数据网络安全设计案例
力控读取sql数据库
旅游产品软件开发需要多少钱
能读取中文的数据库
完美单机数据库
爬虫软件开发价格
仁怀网络安全系统怎么收费
王珊数据库ppt
scum人渣服务器管理员
疫情防控网络安全的脚本
网络安全攻防大赛致辞
5g的通信网络技术有哪些
数据库货物
软件开发 包含哪些流程图
查询数据库某个表
曙光服务器 管理工具
衡水万品汇网络技术服务
服务器windows
扬州公共网络安全吗
为什么要初始化服务器
5G网络技术高级班
淘宝怎么淘软件开发客户