HMM-维特比算法理解与实现(python)
HMM-前向后向算法理解与实现(python)
HMM-维特比算法理解与实现(python)
解码问题
- 给定观测序列 \(O=O_1O_2...O_T\),模型 \(\lambda (A,B,\pi)\),找到最可能的状态序列 \(I^∗=\{i^∗_1,i^∗_2,...i^∗_T\}\)
近似算法
- 在每个时刻 \(t\) 选择最可能的状态,得到对应的状态序列
根据HMM-前向后向算法计算时刻 \(t\) 处于状态 \(i^*_t\) 的概率:
\gamma_t(i) = \frac{\alpha_{i}(t) \beta_{i}(t)}{\sum_{i=1}^{N} \alpha_{i}(t) \beta_{i}(t)}
\]
但是无法保证得到的解是全局最优解
维特比算法
维特比算法的基础可以概括为下面三点(来源于吴军:数学之美):
如果概率最大的路径经过篱笆网络的某点,则从起始点到该点的子路径也一定是从开始到该点路径中概率最大的。
假定第
t时刻有k个状态,从开始到t时刻的k个状态有k条最短路径,而最终的最短路径必然经过其中的一条。根据上述性质,在计算第
t+1时刻的最短路径时,只需要考虑从开始到当前的k个状态值的最短路径和当前状态值到第t+1时刻的最短路径即可。如求t=3时的最短路径,等于求t=2时,从起点到当前时刻的所有状态结点的最短路径加上t=2到t=3的各节点的最短路径。

通俗理解维特比算法,对上面三点加深理解
假如你从S和E之间找一条最短的路径,最简单的方法就是列出所有可能的路径 (\(O(T^N)\)),选出最小的,显然时间复杂度太高。怎么办?(摘自[3])
使用维特比算法

S到A列的路径有三种可能:S-A1,S-A2,S-A3,如下图

S-A1,S-A2,S-A3 中必定有一个属于全局最短路径。继续往右,到了B列
对B1:

会产生3条路径:
S-A1-B1,S-A2-B1,S-A3-B1
假设S-A3-B1是最短的一条,删掉其他两条。得到

对B2:

会产生3条路径:
S-A1-B2,S-A2-B2,S-A3-B2
假设S-A1-B2是最短的一条,删掉其他两条。得到

对B3:

会产生3条路径:
S-A1-B3,S-A2-B3,S-A3-B3
假设S-A2-B3是最短的一条,删掉其他两条。得到

现在我们看看对B列的每个节点有哪些,回顾维特比算法第二点
假定第
t时刻有k个状态,从开始到t时刻的k个状态有k条最短路径,而最终的最短路径必然经过其中的一条
B列有三个节点,所以会有三条最短路径,最终的最短路径一定会经过其中一条。如下图

同理,对C列,会得到三条最短路径,如下图

到目前为止,仍然无法确定哪条属于全局最短。最后,我们继续看E节点

最终发现最短路径为S-A1-B2-C3-E
数学描述
在上述过程中,对每一列(每个时刻)会得到对应状态数的最短路径。在数学上如何表达?记录路径的最大概率值 $ \delta_t(i)$ 和对应路径经过的节点 \(\psi_t(i)\)。
定义在时刻 \(t\) 状态为 \(i\) 的所有单条路径中概率最大值为
\]
递推公式
\]
定义在时刻 \(t\) 状态为 \(i\) 的所有单条路径中,概率最大路径的第 \(t - 1\) 个节点为
\]
维特比算法步骤:
step1:初始化
\]
step2:递推,对 \(t=2,3,...,T\)
\]
step3:计算时刻 \(T\) 最大的 \(\delta_T(i)\) ,即为最可能隐藏状态序列出现的概率。计算时刻\(T\)最大的 \(\psi_T(i)\) ,即为时刻\(T\)最可能的隐藏状态。
\]
step4:最优路径回溯,对\(t=T-1,...,1\)
\]
代码实现
假设从三个 袋子 {1,2,3}中 取出 4 个球 O={red,white,red,white},模型参数\(\lambda = (A,B,\pi)\) 如下,计算状态序列,即取出的球来自哪个袋子
#状态 1 2 3
A = [[0.5,0.2,0.3],
[0.3,0.5,0.2],
[0.2,0.3,0.5]]
pi = [0.2,0.4,0.4]
# red white
B = [[0.5,0.5],
[0.4,0.6],
[0.7,0.3]]
def hmm_viterbi(A,B,pi,O):
T = len(O)
N = len(A[0])
delta = [[0]*N for _ in range(T)]
psi = [[0]*N for _ in range(T)]
#step1: init
for i in range(N):
delta[0][i] = pi[i]*B[i][O[0]]
psi[0][i] = 0
#step2: iter
for t in range(1,T):
for i in range(N):
temp,maxindex = 0,0
for j in range(N):
res = delta[t-1][j]*A[j][i]
if res>temp:
temp = res
maxindex = j
delta[t][i] = temp*B[i][O[t]]#delta
psi[t][i] = maxindex
#step3: end
p = max(delta[-1])
for i in range(N):
if delta[-1][i] == p:
i_T = i
#step4:backtrack
path = [0]*T
i_t = i_T
for t in reversed(range(T-1)):
i_t = psi[t+1][i_t]
path[t] = i_t
path[-1] = i_T
return delta,psi,path
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]]
pi = [0.2,0.4,0.4]
O = [0,1,0,1]
hmm_viterbi(A,B,pi,O)
结果

references:
[1]https://www.cnblogs.com/kaituorensheng/archive/2012/12/04/2802140.html
[2] https://blog.csdn.net/hudashi/java/article/details/87875259
[3] https://www.zhihu.com/question/20136144
HMM-维特比算法理解与实现(python)的更多相关文章
- Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注
一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...
- HMM——维特比算法(Viterbi algorithm)
1. 前言维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给定 ...
- 详解隐马尔可夫模型(HMM)中的维特比算法
笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 4. 隐马尔可夫模型与序列标注 第3章的n元语法模型从词语接续的流畅度出发,为全切 ...
- 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列
隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态 ...
- 维特比算法Python实现
前言 维特比算法是隐马尔科夫问题的一个基本问题算法.维特比算法解决的问题是已知观察序列,求最可能的标注序列. 什么是维特比算法? 维特比算法尽管是基于严格的数学模型的算法,但是维特比算法毕竟是算法,因 ...
- viterbi维特比算法和隐马尔可夫模型(HMM)
隐马尔可夫模型(HMM) 原文地址:http://www.cnblogs.com/jacklu/p/7753471.html 本文结合了王晓刚老师的ENGG 5202 Pattern Recognit ...
- 【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现
1.CRF的预测算法条件随机场的预测算法是给定条件随机场P(Y|X)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)y*,即对观测序列进行标注.条件随机场的预测算法是著名的维特比算法(V ...
- HMM-前向后向算法理解与实现(python)
目录 基本要素 HMM三大问题 概率计算问题 前向算法 后向算法 前向-后向算法 基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,.. ...
- HMM 自学教程(六)维特比算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
随机推荐
- 远程登录redis
没想到吧,我居然已经摸到了redis. 远程登录redis redis-cli -h 127.0.0.1 -p 6379 ip地址和端口记得换成自己的
- Golang交付至Kubernetes
目录 0.前言 1.Go服务构建 1.1.制作Go服务镜像底包 1.2.制作slave基础镜像底包 1.2.1.Golang镜像 1.2.2.Docker镜像 2.创建golang流水线 3.流水线构 ...
- Redis 的 maxmemory 和 dbnum 默认值都是多少?对于最大值会有限制吗?
一.Redis 的默认配置 了解 Redis 的都知道,Redis 服务器状态有很多可配置的默认值. 例如:数据库数量,最大可用内存,AOF 持久化相关配置和 RDB 持久化相关配置等等.我相信,关于 ...
- 【认证与授权】Spring Security的授权流程
上一篇我们简单的分析了一下认证流程,通过程序的启动加载了各类的配置信息.接下来我们一起来看一下授权流程,争取完成和前面简单的web基于sessin的认证方式一致.由于在授权过程中,我们预先会给用于设置 ...
- php环境兼容性问题---压缩格式及其配置简介
php环境兼容性问题-- 内容编码错误 无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式. 请联系网站的所有者以告知此问题. 以前也遇到过同样的问题,记得是PHP代码ob_start(' ...
- 作业十一——LL(1)文法的判断,递归下降分析程序
作业十一——LL(1)文法的判断,递归下降分析程序 判断是否为LL(1)文法 选取有多个产生式的求select,只有一条产生式的无需求select 同一个非终结符之间求交集,全部判断为空后则为LL(1 ...
- 异常:NoSuchFieldError: BEST_MATCHING_HANDLER_ATTRIBUTE
出现的原因 pom 依赖之间不匹配导致 当前的 pom 调整后访问资源成功后面的 pom
- Excel导入异常Cannot get a text value from a numeric cell解决及poi导入时注意事项
POI操作Excel时偶尔会出现Cannot get a text value from a numeric cell的异常错误. 异常原因:Excel数据Cell有不同的类型,当我们试图从一个数字类 ...
- SpringCloud之整合Feign
假设提供者有如下服务接口方法 @RestController @RequestMapping("/person") public class PersonController { ...
- Kubernetes 持久化存储是个难题,解决方案有哪些?\n
像Kubernetes 这样的容器编排工具正在彻底改变应用程序的开发和部署方式.随着微服务架构的兴起,以及基础架构与应用程序逻辑从开发人员的角度解耦,开发人员越来越关注构建软件和交付价值. Kuber ...