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

这篇文章简单描述一下Viterbi算法——一年之前我听过它的名字,直到两周之前才花了一点时间研究了个皮毛,在这里做个简单检讨。先用一句话来简单描述一下:给出一个观测序列o1,o2,o3 …,我们希望找到观测序列背后的隐藏状态序列s1, s2, s3, …;Viterbi以它的发明者名字命名,正是这样一种由动态规划的方法来寻找出现概率最大的隐藏状态序列(被称为Viterbi路径)的算法。

这里需要抄一点有关隐马可夫序列(HMM,Hidden Markov Model)的书页来解释一下观测序列和隐藏状态序列。

首先从最简单的离散Markov过程入手,我们知道,Markov随机过程具有如下的性质:在任意时刻,从当前状态转移到下一个状态的概率与当前状态之前的那些状态没有关系。所以,我们可以用一个状态转移概率矩阵来描述它。假设我们有n个离散状态S1, S2,…Sn,我们可以构造一个矩阵A,矩阵中的元素aij表示从当前状态Si下一时刻迁移到Sj状态的概率。

但是在很多情况下,Markov模型中的状态是我们观察不到的。例如,容器与彩球的模型:有若干个容器,每个容器中按已知比例放入各色的彩球(这样,选择了容器后,我们可以用概率来预测取出各种彩球的可能性);我们做这样的实验,实验者从容器中取彩球——先选择一个容器,再从中抓出某一个球,只给观察者看球的颜色;这样,每次取取出的球的颜色是可以观测到的,即o1, o2,…,但是每次选择哪个容器是不暴露给观察者的,容器的序列就组成了隐藏状态序列S1, S2,…Sn。这是一个典型的可以用HMM描述的实验。

HMM有几个重要的任务,其中之一就是期望通过观察序列来猜测背后最有可能的隐藏序列。在上面的例子中,就是找到我们在实验中最有可能选择到的容器序列。Viterbi正是用来解决这个问题的算法。HMM另外两个任务是:a) 给定一个HMM,计算一个观测序列出现的可能性;b)已知一个观测序列,HMM参数不定,如何优化这些参数使得观测序列的出现概率最大。解决前一个问题可以用与Viberbi结构非常类似的Forward算法来解决(实际上在下面合二为一),而后者可以用Baum-Welch/EM算法来迭代逼近。

从Wiki上抄一个例子来说明Viterbi算法。

假设你有一个朋友在外地,每天你可以通过电话来了解他每天的活动。他每天只会做三种活动之一——Walk, Shop, Clean。你的朋友从事哪一种活动的概率与当地的气候有关,这里,我们只考虑两种天气——Rainy, Sunny。我们知道,天气与运动的关系如下:

Rainy

Sunny

Walk

0.1

0.6

Shop

0.4

0.3

Clean

0.5

0.1

例如,在下雨天出去散步的可能性是0.1。

而天气之前互相转换的关系如下,(从行到列)

Rainy

Sunny

Rainy

0.7

0.3

Sunny

0.4

0.6

例如,从今天是晴天而明天就开始下雨的可能性是0.4 。

同时为了求解问题我们假设初始情况:通话开始的第一天的天气有0.6的概率是Rainy,有0.4概率是Sunny。OK,现在的问题是,如果连续三天,你发现你的朋友的活动是:Walk->Shop->Clean;那么,如何判断你朋友那里这几天的天气是怎样的?

解决这个问题的python伪代码如下:

def forward_viterbi(y, X, sp, tp, ep):

T = {}

for state in X:

##          prob.      V. path  V. prob.

T[state] = (sp[state], [state], sp[state])

for output in y:

U = {}

for next_state in X:

total = 0

argmax = None

valmax = 0

for source_state in X:

(prob, v_path, v_prob) = T[source_state]

p = ep[source_state][output] * tp[source_state][next_state]

prob *= p

v_prob *= p

total += prob

if v_prob > valmax:

argmax = v_path + [next_state]

valmax = v_prob

U[next_state] = (total, argmax, valmax)

T = U

## apply sum/max to the final states:

total = 0

argmax = None

valmax = 0

for state in X:

(prob, v_path, v_prob) = T[state]

total += prob

if v_prob > valmax:

argmax = v_path

valmax = v_prob

return (total, argmax, valmax)几点说明:

算法对于每一个状态要记录一个三元组:(prob, v_path, v_prob),其中,prob是从开始状态到当前状态所有路径(不仅仅是最有可能的viterbi路径)的概率加在一起的结果(作为算法附产品,它可以输出一个观察序列在给定HMM下总的出现概率,即forward算法的输出),v_path是从开始状态一直到当前状态的viterbi路径,v_prob则是该路径的概率。算法开始,初始化T (T是一个Map,将每一种可能状态映射到上面所说的三元组上)三重循环,对每个一活动y,考虑下一步每一个可能的状态next_state,并重新计算若从T中的当前状态state跃迁到next_state概率会有怎样的变化。跃迁主要考虑天气转移(tp[source_state][next_state])与该天气下从事某种活动(ep[source_state][output])的联合概率。所有下一步状态考虑完后,要从T中找出最优的选择viterbi路径——即概率最大的viterbi路径,即上面更新Map U的代码U[next_state] = (total, argmax, valmax)。算法最后还要对T中的各种情况总结,对total求和,选择其中一条作为最优的viterbi路径。算法输出四个天气状态,这是因为,计算第三天的概率时,要考虑天气转变到下一天的情况。通过程序的输出可以帮助理解这一过程:

observation=Walk

next_state=Sunny

state=Sunny

p=0.36

triple=(0.144,Sunny->,0.144)

state=Rainy

p=0.03

triple=(0.018,Rainy->,0.018)

Update U[Sunny]=(0.162,Sunny->Sunny->,0.144)

next_state=Rainy

state=Sunny

p=0.24

triple=(0.096,Sunny->,0.096)

state=Rainy

p=0.07

triple=(0.042,Rainy->,0.042)

Update U[Rainy]=(0.138,Sunny->Rainy->,0.096)

observation=Shop

next_state=Sunny

state=Sunny

p=0.18

triple=(0.02916,Sunny->Sunny->,0.02592)

state=Rainy

p=0.12

triple=(0.01656,Sunny->Rainy->,0.01152)

Update U[Sunny]=(0.04572,Sunny->Sunny->Sunny->,0.02592)

next_state=Rainy

state=Sunny

p=0.12

triple=(0.01944,Sunny->Sunny->,0.01728)

state=Rainy

p=0.28

triple=(0.03864,Sunny->Rainy->,0.02688)

Update U[Rainy]=(0.05808,Sunny->Rainy->Rainy->,0.02688)

observation=Clean

next_state=Sunny

state=Sunny

p=0.06

triple=(0.0027432,Sunny->Sunny->Sunny->,0.0015552)

state=Rainy

p=0.15

triple=(0.008712,Sunny->Rainy->Rainy->,0.004032)

Update U[Sunny]=(0.0114552,Sunny->Rainy->Rainy->Sunny->,0.004032)

next_state=Rainy

state=Sunny

p=0.04

triple=(0.0018288,Sunny->Sunny->Sunny->,0.0010368)

state=Rainy

p=0.35

triple=(0.020328,Sunny->Rainy->Rainy->,0.009408)

Update U[Rainy]=(0.0221568,Sunny->Rainy->Rainy->Rainy->,0.009408)

final triple=(0.033612,Sunny->Rainy->Rainy->Rainy->,0.009408)所以,最终的结果是,朋友那边这几天最可能的天气情况是Sunny->Rainy->Rainy->Rainy,它有0.009408的概率出现。而我们算法的另一个附带的结论是,我们所观察到的朋友这几天的活动序列:Walk->Shop->Clean在我们的隐马可夫模型之下出现的总概率是0.033612。

转自:http://summerbell.javaeye.com/blog/390774

参考文献

http://www.ece.ucsb.edu/Faculty/Rabiner/ece259/Reprints/tutorial%20on%20hmm%20and%20applications.pdf

http://en.wikipedia.org/wiki/Viterbi_algorithm

http://googlechinablog.com/2006/04/blog-post_17.html

隐马尔可夫模型中的Viterbi算法zz相关推荐

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

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

  2. 隐马尔可夫模型(Baum Welch算法与Viterbi算法)

    1.Baum Welch算法就是EM算法,用于求解隐马尔可夫模型的Learing问题 2.隐马尔可夫模型的Decoding问题是指给定X与λ,求使得概率最大的隐状态序列 3.Decoding问题采取V ...

  3. 维特比算法在隐马尔可夫模型中的应用

    前言 文章标题的两个概念也许对于许多同学们来说都相对比较陌生,都比较偏向于于理论方面的知识,但是这个算法非常的强大,在很多方面都会存在他的影子.2个概念,1个维特比算法,1个隐马尔可夫模型.你很难想象 ...

  4. 【Python自然语言处理】隐马尔可夫模型中维特比(Viterbi)算法解决商务选择问题实战(附源码 超详细必看)

    需要源码请点赞关注收藏后评论区留言私信~~~ 一.统计分词 统计分词基本逻辑是把每个词语看做由单字组成,利用统计学原理计算连接字在不同文本中出现的次数,以此判断相连字属于特定词语的概率. 二.隐马尔可 ...

  5. 隐马尔可夫模型HMM+维特比算法(Viterbi Algorithm)进行词性标注代码实现(自然语言处理课程第二次作业)

    文章目录 一.理论描述 二.算法描述 三.详例描述 具体过程 分析题目 数据预处理 转移概率矩阵: 发射概率矩阵: HMM+维特比算法进行词性标注 开始进行词性标注: The: bear: is: o ...

  6. 马尔科夫系列——三、隐马尔可夫模型 - 学习问题 - Baum-Welch算法

    转载的过程中发现,原文有些地方不太理解,就阅读了其他的文章,然后把代码的实现也引进来了.之前并没有验证代码的准确性,后面有人说,代码可能有问题,我尝试了修改.把简单修改版本的也放上来. 目录 一.训练 ...

  7. HMM学习笔记2 隐马尔科夫模型与前向算法

    一 序 本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,有大佬做了二次整理,参见:https://blog.csdn.ne ...

  8. 隐马尔科夫模型和维特比算法

    隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程.其难点是从可观察的参数中确定该过程的隐含参数.然后利用这些参数来作进一步的分析 ...

  9. python做马尔科夫模型预测法_隐马尔可夫模型的前向算法和后向算法理解与实现(Python)...

    前言 隐马尔可夫模型(HMM)是可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型. 马尔可夫模型理论与分析 参考<统计学习方法>这本书,书上已经讲得 ...

最新文章

  1. Google的成果回报型广告
  2. 优化定制化abap代码必须遵守的经典黄金规则
  3. python控制流代码怎么用_Python学习笔记控制流的元素
  4. python 调用mysql_Python调用Mysql
  5. 香港科技大学(广州)智能交通学域招收博士/RA 22Fall, 23 Spring/Fall
  6. 1024 程序员节:给 DBA 们的福音
  7. 2020年创业公司到底过得怎么样?数据分析来为你揭晓
  8. myeclipse jquerry ext 提示
  9. Python中用pandas将numpy中的数组数据保存到csv文件
  10. MATLAB数组生成、引用
  11. mysql 连接数和内存的关系_php-fpm进程数和mysql连接数之间的关系
  12. L298N电机驱动模块详解
  13. MT6763,MT6763T(P23),MT6750T,MT6755(P10)参数比较
  14. 如何用VNC远程管理Linux桌面
  15. 操作系统的作用及基本特性
  16. 大一python期末总结
  17. Redis集群启动时发生如下错误:Node hadoop103:7002 replied with error: ERR Invalid node address specified: hadoop1
  18. 第十七天(续第十六天BPDU相关知识以及STP的配置)
  19. 9.目标检测基础、图像风格迁移
  20. 车牌识别 瞬间启动 快速抓拍 超低功耗 的4G智能摄像头方案

热门文章

  1. 科大星云诗社动态20220115
  2. 李沐《动手学深度学习》PyTorch 实现版开源,瞬间登上 GitHub 热榜!
  3. VTK修炼之道83:Pipeline管线执行模型
  4. Nhibernate 三种配置方式
  5. C++中运算符重载的方法
  6. 【CyberSecurityLearning 附】虚拟机部署Linux操作系统(centos6.9、Ubuntu16.04)
  7. jsp的<a>标签中怎么传递参数
  8. sendmsg recvmsg函数
  9. 分享一个centos不错的镜像库
  10. KillTimer()的使用