HMM(隐马尔可夫模型)是用来描述隐含未知参数的统计模型,是一个关于时序的概率模型,它描述了一个由隐藏的马尔可夫链生成状态序列,再由状态序列生成观测序列的过程。其中,状态之间的转换以及观测序列和状态序列之间都存在一定的概率关系。

任何一个HMM都可以通过下列五元组来描述:

:param obs:观测序列

:param states:隐状态

:param start_p:初始概率(隐状态)

:param trans_p:转移概率(隐状态)

:param emit_p: 发射概率 (隐状态表现为显状态的概率)

而Viterbi算法是解决隐马第三问题(求观察序列的最可能标注序列)。 
算法通过已知的可以观察到的序列,和一些已知的状态转换之间的概率情况,通过综合状态之间的转移概率和前一个状态的情况计算出概率最大的状态转换路径,从而推断出隐含状态的序列的情况。

维基百科动态图表示Viterbi算法过程


一个简单问题

问题描述

隐含的身体状态 = { 健康 , 发烧 }

可观察的感觉状态 = { 正常 , 冷 , 头晕 }

月儿预判的阿驴身体状态的概率分布 = { 健康:0.6 , 发烧: 0.4 }

月儿认为的阿驴身体健康状态的转换概率分布 = {健康->健康: 0.7 ,健康->发烧: 0.3 ,发烧->健康:0.4 ,发烧->发烧: 0.6}

月儿认为的在相应健康状况条件下,阿驴的感觉的概率分布 = {健康,正常:0.5 ,冷 :0.4 ,头晕: 0.1 ;发烧,正常:0.1 ,冷 :0.3 ,头晕: 0.6 }

阿驴连续三天的身体感觉依次是: 正常、冷、头晕 。

利用五元组来描述问题

  1. states = ('Health', 'Fever')
  2. observations = ('normal', 'cold', 'dizzy')
  3. start_probability = {'Health': 0.6, 'Fever': 0.4}
  4. transition_probability = {
  5. 'Health' : {'Health': 0.7, 'Fever': 0.3},
  6. 'Fever' : {'Health': 0.4, 'Fever': 0.6},
  7. }
  8. emission_probability = {
  9. 'Health' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
  10. 'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},
  11. }

代码实现Viterbi 算法

  1. import numpy
  2. def Viterbi () :
  3. #已知条件
  4. states = ('Health', 'Fever')
  5. observations = ('normal', 'cold', 'dizzy')
  6. start_probability = {'Health': 0.6, 'Fever': 0.4}
  7. transition_probability = {
  8. 'Health' : {'Health': 0.7, 'Fever': 0.3},
  9. 'Fever' : {'Health': 0.4, 'Fever': 0.6},
  10. }
  11. emission_probability = {
  12. 'Health' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
  13. 'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},
  14. }
  15. day = 3
  16. s = len(states)
  17. V = []
  18.  
  19. Wether = []
  20. Temp = []
  21. #求解初始状态可能
  22. for j in list(range(s)):
  23. Temp.append(start_probability.get(states[j]) * emission_probability.get(states[j])[observations[0]])
  24. V.append(Temp)
  25. #根据初始状态求解
  26. Wether.append(states[V[0].index(max(V[0]))]);
  27.  
  28. #求解第2 - day 状态转换概率
  29. prob = []
  30. for d in [i + 1 for i in list(range( day - 1))]:
  31. prob = []
  32. pp = -1
  33. for j in list(range(s)):
  34. Temp = []
  35. for k in list(range(s)):
  36. np = V[d-1][j] * transition_probability.get(states[j])[states[k]] * emission_probability.get(states[k])[observations[d]]
  37. Temp.append(np)
  38. #记录路径
  39. if np > pp:
  40. m1 = j
  41. m2 = k
  42. pp = np
  43. prob.append(Temp)
  44.  
  45. print('Compute_Probability:')
  46. print(prob)
  47. Wether.append(states[m2])
  48. V.append(prob[m1])
  49. print('Large_One:')
  50. print(prob[m1])
  51.  
  52. print(V)
  53. print(Wether)
  54.  
  55. if __name__ == '__main__':
  56. Viterbi()

结果截图

Viterbi algorithm的更多相关文章

  1. 维特比算法(Viterbi Algorithm)

      寻找最可能的隐藏状态序列(Finding most probable sequence of hidden states) 对于一个特殊的隐马尔科夫模型(HMM)及一个相应的观察序列,我们常常希望 ...

  2. HMM——维特比算法(Viterbi algorithm)

    1. 前言维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给定 ...

  3. HMM Viterbi算法 详解

    HMM:隐式马尔可夫链   HMM的典型介绍就是这个模型是一个五元组: 观测序列(observations):实际观测到的现象序列 隐含状态(states):所有的可能的隐含状态 初始概率(start ...

  4. HMM隐马尔科夫算法(Hidden Markov Algorithm)初探

    1. HMM背景 0x1:概率模型 - 用概率分布的方式抽象事物的规律 机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测. 概率模型(p ...

  5. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介   对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑.   本文将通过具体形象的例子来引 ...

  6. Viterbi算法和隐马尔可夫模型(HMM)算法

    隐马尔可夫模型(HMM)及Viterbi算法 https://www.cnblogs.com/jclian91/p/9954878.html HMM简介   对于算法爱好者来说,隐马尔可夫模型的大名那 ...

  7. 维特比算法(Viterbi)

    维特比算法(Viterbi) 维特比算法 编辑 维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中.术语“维特比路 ...

  8. Viterbi(维特比)算法在CRF(条件随机场)中是如何起作用的?

    之前我们介绍过BERT+CRF来进行命名实体识别,并对其中的BERT和CRF的概念和作用做了相关的介绍,然对于CRF中的最优的标签序列的计算原理,我们只提到了维特比算法,并没有做进一步的解释,本文将对 ...

  9. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...

随机推荐

  1. Leetcode#191. Number of 1 Bits(位1的个数)

    题目描述 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 示例 : 输入: 11 输出: 3 解释: 整数 11 的二进制表示为 000000 ...

  2. nc工具使用

    0x00 功能说明: 功能强大的网络工具,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本.因为它短小精悍,功能实用,被设计为一个简单.可靠的网络工具,可通过TCP或UDP协议传输 ...

  3. ch03 课下作业——缓冲区溢出漏洞实验

    一.实验简介: 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭 ...

  4. bat执行python脚本,执行多条命令

    1.新建一个txt文档,输入以下命令 @echo offcmd /k python F:\Pycharm_Projection\Test\test2.py 2.将txt文档保存为.bat格式,然后双击 ...

  5. Prisma GraphQL 服务器 生产者 "https://www.prisma.io"

    Prisma   一个 GraphQL  服务器 生产者     "https://www.prisma.io" , 关注一下

  6. Linux下tar bz gz等压缩包的压缩和解压【转】

    Linux下用户经常需要备份计算机系统中的数据,为了节省存储空间,常常将备份文件进行压缩,本文是对压缩和解压命令的大致总结 .tar.gz  解压:tar zxvf FileName.tar.gz  ...

  7. 阿里云ECS试用配置

    1.首先从阿里云找到ECS购买入口(目前在弹性入口的弹出框中).进入ECS购买界面后,选择免费试用. 此处省略试用申请过程. 2.然后再到云市场中购买一个免费的镜像服务.此处为Centos 64位系统 ...

  8. Google Android SDK开发范例大全笔记 一

    方法讲解 1 获取手机分辨率方法 DisplayMetrics private void getDiaplayMetrics() { DisplayMetrics dm = new DisplayMe ...

  9. Improved dual-mode compressive tracking integrating balanced colour and texture features

    <改进的集成平衡颜色和纹理特征的双模压缩跟踪> 摘要:将跟踪问题视为分析目标和背景信息的分类问题的判别跟踪方法可以实现最先进的性能.作为一个高性能判别器,压缩跟踪近来受到很多关注.然而,当 ...

  10. JMeter Ultimate Thread Group阶梯式减压

    选择或者搜索Stantard Set标准集, 我们要用的Ultimate Thread Group最终线程组包含在里面: 下载完成之后,JMeter会自动重启. 添加最终线程组: 还是以打开博客园首页 ...