python模拟隐马尔可夫模型的方法是什么
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要讲解了"python模拟隐马尔可夫模型的方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python模拟隐马尔可夫模型的方法是什么
千家信息网最后更新 2025年12月03日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安全错误
数据库的锁怎样保障安全
数据库dtos
vista需要服务器吗
联想服务器2012装机设置
网络安全网络优化方案
软件开发实习生的工作内容
春节网络安全防护
计算机网络技术系统重装u盘
如何查看存储服务器磁盘型号
山东正规软件开发售后保障
118字段数据库
1.17小游戏服务器
蹲马步视频软件开发
挖财网络技术有限公司倒闭
王者荣耀可转移的服务器会更新吗
日本网络安全广告
开源流媒体服务器系统
计算机网络技术员自我介绍
天阔服务器管理地址
国家网络安全 小说
服务器怎样构成软件平台
db2数据库 客户端
宝咖网络技术怎么样
电子表格中提取第几数据库
甘肃肃南网络安全
wind服务器管理系统
石家庄市天气预报软件开发
怎样写网络安全讲话
我的世界pe服务器注册
网络技术兼职
戴尔emc笔试题软件开发