维特比算法的python实现
这里写自定义目录标题
- 隐马尔可夫模型
- 预测算法
- 维特比解码算法
隐马尔可夫模型
预测算法
维特比解码算法
在隐马尔科夫模型中,我们使用维特比解码算法求得概率的最大路径(最优路径)。
依据的方法为动态规划。
而动态规划又满足最优化原理:给出一个最优的决策序列,每个子序列自身必须是最优的决策序列。 下面则为整个过程的符号引入与递推公式:
下面为数理统计方法中关于维特比算法的例题:
下面则为维特比解码算法的python代码实现:
import numpy as np
def vitebi_decode(hmm_paramter, obs_idx_seq):#取出HMM模型的三个参数A, B , L = hmm_paramter#状态的总个数N = A.shape[0]#获取观测序列的长度T = len(obs_idx_seq)#定义[N*T]的矩阵P,用来表示t时刻状态为i的最大概率P = np.zeros((N, T))#定义[N*T]的矩阵D,用来表示t时刻状态为i取得最大概率时t-1时刻的状态D = np.zeros((N, T), dtype=int)#初始化P,D在t=0时刻所对应的概率值和初状态for i in range(N):P[i][0] = L[i] * (B[i, obs_idx_seq[0]])D[i][0] = -1#接下来通过一个三层循环对P,D里面的元素进行赋值操作for i in range(1, T):obs_value = obs_idx_seq[i]for j in range(N):pro_list = []for k in range(N):pro_list.append(P[k, i-1] * A[k, j] * B[j, obs_value])max_value = max(pro_list)max_idx = pro_list.index(max_value)P[j, i] = max_valueD[j, i] = max_idx#获取P最后一个时刻的最大值,即为最大概率final_max_value = np.max(P, axis=0)[-1]final_max_idx =np.argmax(P, axis=0)[-1]#通过finax_max_idx和D倒推出最大概率值所对应的状态序列state_list = []state_list.append(final_max_idx)for i in range(T-1, 0, -1):final_max_idx = D[final_max_idx][i]state_list.append(final_max_idx)final_state_list = []#由于状态是从1开始的,所以要对每一个状态索引加1for i in range(len(state_list) - 1, -1, -1):final_state_list.append(state_list[i]+1)#print(P)#print(D)return final_max_value, final_state_list
if __name__ == "__main__":A = np.array([[0.5, 0.2, 0.3],[0.3, 0.5, 0.2],[0.2, 0.3, 0.5]])B = np.array([[0.5, 0.5],[0.4, 0.6],[0.7, 0.3]])L = [0.2, 0.4, 0.4]O = ['红', '白', '红']obs_to_idx = {'红':0, '白':1}obs_seq_idx = [obs_to_idx[i] for i in O]max_pro, state_seq = vitebi_decode((A, B, L), obs_seq_idx)print(max_pro)print(state_seq)
运行结果如下:
当然也可以将P,D两个矩阵打印
·
这与统计学习方法中所得到的的结果是一致的:
维特比算法的python实现相关推荐
- 维特比算法的python的简单实现
维特比算法的python简单实现 简单介绍 实现了李航书籍p210的例子,例子非常经典.我有三个盒子,每个盒子都有红球和白球,我观测到了三次结果:红.白和红,现在需要求出盒子的可能序列是什么. 通过这 ...
- 维特比算法 python_维特比算法理解与实现(Python)
前言 写这篇文章就是想以通俗易懂的方式解析维特比算法,最后给出Python代码的实现.下面的公式和原理均出自<统计学习方法>. 算法的原理 算法的原理1.PNG 算法的原理2.PNG 上面 ...
- 维特比算法 python_用python实现与理解HMM-维特比算法
HMM-维特比算法理解与实现(python) 解码问题 给定观测序列 \(O=O_1O_2...O_T\) ,模型 \(\lambda (A,B,\pi)\) ,找到最可能的状态序列 \(I^∗=\{ ...
- 维特比算法 python_HMM-维特比算法理解与实现(python)
解码问题 给定观测序列 \(O=O_1O_2...O_T\),模型 \(\lambda (A,B,\pi)\),找到最可能的状态序列 \(I^∗=\{i^∗_1,i^∗_2,...i^∗_T\}\) ...
- 维特比算法 python_维特比算法 实现中文分词 python实现
最近我在学习自然语言处理,相信大家都知道NLP的第一步就是学分词,但分词≠自然语言处理.现如今分词工具及如何使用网上一大堆.我想和大家分享的是结巴分词核心内容,一起探究分词的本质. (1).基于前缀词 ...
- 采用维特比算法完成词性标注(含python代码)
本文所用训练集: 链接:https://pan.baidu.com/s/1fK--_PrEhckKUSrajHGkEw 提取码:aehg 文章目录 "词性标注"的国内外研究现状: ...
- 【深度】从朴素贝叶斯到维特比算法:详解隐马尔科夫模型
详解隐马尔科夫模型 作者:David S. Batista 选自:机器之心 本文首先简要介绍朴素贝叶斯,再将其扩展到隐马尔科夫模型.我们不仅会讨论隐马尔科夫模型的基本原理,同时还从朴素贝叶斯的角度讨论 ...
- 【机器学习】隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现
[机器学习]隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现 一.维特比算法 二.python实现 参考资料 隐马尔可夫模型状态序列预测问题是指给定模型 λ=[A,B,∏]\la ...
- 维特比算法(viterbi)原理以及简单实现
维特比算法 看一下维基百科的解释,维特比算法(Viterbi algorithm)是一种动态规划算法.它用于寻找最有可能产生观测事件序列的维特比路径--隐含状态序列,特别是在马尔可夫信息源上下文和隐马 ...
最新文章
- java中的注解(二)
- eclipse java代码乱码怎么解决_eclipse java 乱码怎么解决
- ubuntu安装protobuf
- qemu运行linux内核很慢,linux – qcow2图像的qemu存储性能非常慢
- win7下删除提示没权限删除文件的方法
- HTML5 Shiv #8211; 让该死的IE系列支持HTML5吧
- 华为交换机屏蔽远程计算机,华为交换机远程telnet配置的小问题
- 高可用之KeepAlived(2):keepalived+lvs
- Docker启动失败提示【exec user process caused: exec format error】
- 高德地图+Serverless 护航你的假日出行
- 杭电 4907 Task schedule ·
- c#打印乘法口诀_小学数学所有公式和顺口溜都在这里了!建议家长收藏打印!...
- 【人脸识别】基于matlab小波不变矩人脸识别【含Matlab源码 1355期】
- 教你如何制作浪漫的表白网站 七夕情人节表白网页在线制作(多种款式)
- HCL打开显示当前系统用户怎么解决_iPhone8手机变成白苹果怎么办?
- 【重复制造精讲】5、MF50计划
- Aurora核使用中tx_dst_rdy信号拉低问题
- Lexar雷克沙 nCARD存储卡全网发布,可用于华为手机内存扩容
- java pdf输出图片_Java PDF转换成图片并输出给前台展示
- Linux Python离线下载模块