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 }

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

利用五元组来描述问题

 states = ('Health', 'Fever')
observations = ('normal', 'cold', 'dizzy')
start_probability = {'Health': 0.6, 'Fever': 0.4}
transition_probability = {
'Health' : {'Health': 0.7, 'Fever': 0.3},
'Fever' : {'Health': 0.4, 'Fever': 0.6},
}
emission_probability = {
'Health' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},
}

代码实现Viterbi 算法

 import numpy
def Viterbi () :
#已知条件
states = ('Health', 'Fever')
observations = ('normal', 'cold', 'dizzy')
start_probability = {'Health': 0.6, 'Fever': 0.4}
transition_probability = {
'Health' : {'Health': 0.7, 'Fever': 0.3},
'Fever' : {'Health': 0.4, 'Fever': 0.6},
}
emission_probability = {
'Health' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},
}
day = 3
s = len(states)
V = [] Wether = []
Temp = []
#求解初始状态可能
for j in list(range(s)):
Temp.append(start_probability.get(states[j]) * emission_probability.get(states[j])[observations[0]])
V.append(Temp)
#根据初始状态求解
Wether.append(states[V[0].index(max(V[0]))]); #求解第2 - day 状态转换概率
prob = []
for d in [i + 1 for i in list(range( day - 1))]:
prob = []
pp = -1
for j in list(range(s)):
Temp = []
for k in list(range(s)):
np = V[d-1][j] * transition_probability.get(states[j])[states[k]] * emission_probability.get(states[k])[observations[d]]
Temp.append(np)
#记录路径
if np > pp:
m1 = j
m2 = k
pp = np
prob.append(Temp) print('Compute_Probability:')
print(prob)
Wether.append(states[m2])
V.append(prob[m1])
print('Large_One:')
print(prob[m1]) print(V)
print(Wether) if __name__ == '__main__':
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. [面试] mysql 面试题

    最近在准备面试,mysql 实在是不熟悉,就先摘录一些网上的面试题来看一下. 1. MyISAM 和 InnoDB 区别? InnoDB 支持事务处理,支持更大的并发update 和 insert 操 ...

  2. 电子医疗设备创新研发应该用i.MX6Q开发板吗?为医疗设备提供解决方案

    伴随医疗信息化.移动化.智能化的不断发展,居民对自身健康的关注度持续加强,全球医疗电子产业近年来持续保持快速增长态势.同时,源于庞大的人口基数以及迅速增长的老龄化人口带来持续增长的医疗服务需求,加之全 ...

  3. 第一章 Java程序设计概述

    1.1 Java程序设计平台 Java是一门设计优秀的语言,更是一个完整的平台.Java平台包括了一个庞大可重用的类库以及提供了安全性,跨系统,自动垃圾收集等优秀特性的执行环境. 这也使其成为自发布以 ...

  4. IDEAL字体颜色修改

    IDEA 炫酷的主题字体颜色设置(基于IDEA 2018)前言: IDEA中主题可以更换,大家可以直接到 http://www.riaway.com/  网站或 http://color-themes ...

  5. CVE_2012_1876堆溢出分析

    首先用windbg附加进程ie页面内容进程,!gflag +hpa添加堆尾检查,.childdbg 1允许子进程调试,然后加载POC. POC: <html> <body> & ...

  6. 使用fiddler模拟重复请求接口

    使用fiddler模拟重复请求接口 重复请求某个接口,比如评论一条,这样点击多次就可以造多个评论数据

  7. OpenCV使用中的一些总结

    一.threshold阈值操作 1.阈值可以被视作最简单的图像分割方法.例如,从一副图像中利用阈值分割出我们需要的物体部分,这样的图像分割方法基于图像中的物体与背景之间的灰度差异. 2.thresho ...

  8. 将.NET Core部署在Docker

    转载自:ASP.NET Core 2.1 使用Docker运行 1.新建ASP.NET Core项目 新建一个名为“DockerSample”的ASP.NET Core项目 运行程序,页面如下: 2. ...

  9. 金蝶K/3 BOS产品培训教案

    K/3 BOS产品培训教案     1 K/3 BOS IDE练习案例... 2 1.1新建基础资料... 2 1.1.1新增基础资料交货地点... 2 1.2新建业务单据... 2 1.2.1新建寄 ...

  10. php隐藏手机号指定位数

    function mobileReplace($mobile,$start,$end,$str="*"){ $countStr = abs($end-$start); $repla ...