简介:

viterbi算法其实就是多步骤每步多选择模型的最优选择问题,其在每一步的所有选择都保存了前续所有步骤到当前步骤当前选择的最小总代价(或者最大价值)以及当前代价的情况下前继步骤的选择。依次计算完所有步骤后,通过回溯的方法找到最优选择路径。符合这个模型的都可以用viterbi算法解决。

用以下例子加以说明:

1.题目背景:

从前有个村儿,村里的人的身体情况只有两种可能:健康或者发烧。假设这个村儿的人没有体温计或者百度这种神奇东西,他唯一判断他身体情况的途径就是到村头我的偶像金正月的小诊所询问。月儿通过询问村民的感觉,判断她的病情,再假设村民只会回答正常、头晕或冷。有一天村里奥巴驴就去月儿那去询问了。第一天她告诉月儿她感觉正常。第二天她告诉月儿感觉有点冷。第三天她告诉月儿感觉有点头晕。那么问题来了,月儿如何根据阿驴的描述的情况,推断出这三天中阿驴的一个身体状态呢?为此月儿上百度搜 google ,一番狂搜,发现维特比算法正好能解决这个问题。月儿乐了。

2.已知情况:

隐含的身体状态 = { 健康 , 发烧 }
可观察的感觉状态 = { 正常 , 冷 , 头晕 }
月儿预判的阿驴身体状态的概率分布 = { 健康:0.6 , 发烧: 0.4 }这就是初始状态序列
月儿认为的阿驴身体健康状态的转换概率分布 = {健康->健康: 0.7 ,健康->发烧: 0.3 ,发烧->健康:0.4 ,发烧->发烧: 0.6}
这样就可以列出相应的状态转移矩阵
月儿认为的在相应健康状况条件下,阿驴的感觉的概率分布 = {健康,正常:0.5 ,冷 :0.4 ,头晕: 0.1 ;发烧,正常:0.1 ,冷 :0.3 ,头晕: 0.6 }这样就可以列出相应的观测矩阵
下面就是解决问题了。阿驴连续三天的身体感觉依次是: 正常、冷、头晕 。

3.题目:

已知如上,求:阿驴这三天的身体健康状态变化的过程是怎么样的?即已知观测序列和HMM模型的情况下,求状态序列。

4.过程:

最后一天的状态概率分布即为最优路径的概率,即P(最优)=0.01512,这样我们可以得到最优路径的终点,是发烧。这样,我们的状态序列逆推出来了。即为:健康,健康,发烧。

简要的画个图:

代码实现:

import math
# 状态的样本空间
states = ('健康', '发热')
# 观测的样本空间
observations = ('正常', '发冷', '发晕')
# 起始个状态概率
start_probability = {'健康': 0.6, '发热': 0.4}
# 状态转移概率
transition_probability = {'健康': {'健康': 0.7, '发热': 0.3},'发热': {'健康': 0.4, '发热': 0.6},
}
# 状态->观测的发散概率
emission_probability = {'健康': {'正常': 0.5, '发冷': 0.4, '发晕': 0.1},'发热': {'正常': 0.1, '发冷': 0.3, '发晕': 0.6},
}
# 计算以E为底的幂
def E(x):#return math.pow(math.e,x)return xdef display_result(observations,result_m):"""较为友好清晰的显示结果:param result_m::return:"""# 从结果中找出最佳路径infered_states = []final = len(result_m) - 1(p, pre_state), final_state = max(zip(result_m[final].values(), result_m[final].keys()))infered_states.insert(0, final_state)infered_states.insert(0, pre_state)for t in range(final - 1, 0, -1):_, pre_state = result_m[t][pre_state]infered_states.insert(0, pre_state)print(format("Viterbi Result", "=^59s"))head = format("obs", " ^10s")head += format("Infered state", " ^18s")for s in states:head += format(s, " ^15s")print(head)print(format("", "-^59s"))for obs,result,infered_state in zip(observations,result_m,infered_states):item = format(obs," ^10s")item += format(infered_state," ^18s")for s in states:item += format(result[s][0]," >12.8f")if infered_state == s:item += "(*)"else:item +="   "print(item)print(format("", "=^59s"))def viterbi(obs, states, start_p, trans_p, emit_p):result_m = [{}] # 存放结果,每一个元素是一个字典,每一个字典的形式是 state:(p,pre_state)# 其中state,p分别是当前状态下的概率值,pre_state表示该值由上一次的那个状态计算得到for s in states:  # 对于每一个状态result_m[0][s] = (E(start_p[s]*emit_p[s][obs[0]]),None) # 把第一个观测节点对应的各状态值计算出来for t in range(1,len(obs)):result_m.append({})  # 准备t时刻的结果存放字典,形式同上for s in states: # 对于每一个t时刻状态s,获取t-1时刻每个状态s0的p,结合由s0转化为s的转移概率和s状态至obs的发散概率# 计算t时刻s状态的最大概率,并记录该概率的来源状态s0# max()内部比较的是一个tuple:(p,s0),max比较tuple内的第一个元素值result_m[t][s] = max([(E(result_m[t-1][s0][0]*trans_p[s0][s]*emit_p[s][obs[t]]),s0) for s0 in states])return result_m    # 所有结果(包括最佳路径)都在这里,但直观的最佳路径还需要依此结果单独生成,在显示的时候生成def example():"""一个可以交互的示例"""result_m = viterbi(observations,states,start_probability,transition_probability,emission_probability)display_result(observations,result_m)while True:user_obs = input("轮到你来输入观测,计算机来推断可能状态\n""使用 'N' 代表'正常', 'C' 代表'发冷','D'代表'发晕'\n""您输入:('q'将退出):")if len(user_obs) ==0 or 'q' in user_obs or 'Q' in user_obs:breakelse:obs = []for o in user_obs:if o.upper() == 'N':obs.append("正常")elif o.upper() == 'C':obs.append("发冷")elif o.upper() == 'D':obs.append("发晕")else:passresult_m = viterbi(obs,states,start_probability,transition_probability,emission_probability)display_result(obs,result_m)if __name__ == "__main__":example()

运行结果:

原文链接:https://blog.csdn.net/zhangduan8785/article/details/80443650#commentBox

举例理解viterbi算法相关推荐

  1. 简单理解viterbi算法

    简介: viterbi算法其实就是多步骤每步多选择模型的最优选择问题,其在每一步的所有选择都保存了前续所有步骤到当前步骤当前选择的最小总代价(或者最大价值)以及当前代价的情况下前继步骤的选择.依次计算 ...

  2. viterbi算法通俗理解

    文章目录 viterbi算法是什么 手动理解 缺点分析 算法详解 算法推论 viterbi与隐马尔可夫 隐马尔科夫链的三个基本问题 隐马尔科夫链的五元组 更详细的解释 代码实现 实现 测试 参考 vi ...

  3. Viterbi算法原理与实现-通俗易懂

    Viterbi算法原理与实现 算法原理 维特比算法(Viterbi algorithm)是一种动态规划算法,解决的是篱笆型的图的最短路径问题,图的节点按列组织,每列的节点数量可以不一样,每一列的节点只 ...

  4. NLP——part of speech (POS)中的隐马尔可夫模型 + Viterbi 算法

    文章目录 POS 隐马尔可夫模型 计算简介 转移概率矩阵(Transition matrix) 观察矩阵(Observation / emission Matrix) 预测 prediction Vi ...

  5. 用人话理解hash算法、特性、唯一性等

    背景 博主在本科的时候曾经参加过数学建模,当初提交参赛论文的时候有两个提交时间点,第一个是提交MD5码的时间,第二个是提交具体参赛论文的时间,当初就很纳闷,直接提交论文不就ok吗?为什么多此一举呢 我 ...

  6. 隐马尔可夫(HMM)、前/后向算法、Viterbi算法

    HMM的模型  图1 如上图所示,白色那一行描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,蓝紫色那一行是各个状态生成可观测的随机序列 话说,上面也是个贝叶斯网络,而贝叶斯网络中有这么一种,如下 ...

  7. 机器学习知识点(二十四)隐马尔可夫模型HMM维特比Viterbi算法Java实现

    1.隐马尔可夫模型HMM    学习算法,看中文不如看英文,中文喜欢描述的很高深.    http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/ht ...

  8. viterbi算法_HMM模型和Viterbi算法如何应用于分词

    首先感谢以下博主的分享,第一,二个链接是讲的HMM模型,第三个文章讲的是Viterbi算法 结巴分词3--基于汉字成词能力的HMM模型识别未登录词 - 老顽童2007 - 博客园​www.cnblog ...

  9. 隐马尔可夫模型中的Viterbi算法zz

    隐马尔可夫模型中的Viterbi算法zz 这篇文章简单描述一下Viterbi算法--一年之前我听过它的名字,直到两周之前才花了一点时间研究了个皮毛,在这里做个简单检讨.先用一句话来简单描述一下:给出一 ...

最新文章

  1. JavaScript社区开发者调查:服务端JS盛行 AngularJS使用者最多
  2. [Python学习] 专题二.条件语句和循环语句的基础知识
  3. 我的世界服务器虚拟菜单插件,《我的世界》服务器快捷菜单插件怎么用?
  4. GoCD notes
  5. C++ list类的模拟实现
  6. 大数据之-Hadoop3.x_生产调优手册_HDFS读写压测---大数据之hadoop3.x工作笔记0162
  7. 数据结构链表实验c语言程序,数据结构实验练习(—):链表实现100位数的加减法...
  8. html在线发布ipa文件在哪里,打包ipa文件
  9. 从一张表里选择一列加入到另一张表_将Excel多个文件汇总到一张表
  10. pandas 将DataFrame 转为txt文本,去除引号问题
  11. 如何向水晶报表数据源中的存储过程传参数……
  12. x86 x64 arm64的区别
  13. Python开发制作酷狗和QQ音乐下载器
  14. 善领dsa2020最新车机ce版_小米MIX 3 5G版成为首款获欧盟5G认证的骁龙855手机
  15. python 基于金字塔的图像融合
  16. wps表格错开半行_word表格错开半行-Excel 表格上下怎么错位!
  17. 清华大学计算机秦凌霄,海南25名考生获得北大清华自主招生入选资格
  18. GitHub Universe 2019 Keynote 回顾
  19. C#之浅析面向对象编程思想(二)
  20. 基于opencv和pillow实现人脸识别系统(附详细源代码)

热门文章

  1. 计算机考试带过,软件考试可以带计算机吗?
  2. SSD 训练自己的数据
  3. mysqli info
  4. Python中遍历列表remove漏删解决方案
  5. 锐捷智能感知“安全卫士”守护广东2000个基层医疗机构信息安全
  6. 各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确
  7. idea同时启动多个tomcat【高清截图版】
  8. SSD固态盘高低温测试方法
  9. 聊聊我的故事|最感人的是细枝末节
  10. SPI中断方式读取MPU6500数据