Viterbi Algorithm

前面我们提到过,HMM的第二类问题是利用HMM模型和可观察序列寻找最有可能生成该观察序列的隐藏变量的序列。简单来说,第一类问题是通过模型计算生成观察序列的概率,而第二类问题通过观察序列计算最有可能生成该观察序列的的隐藏变量的序列。我们还是先来看如下一张图:

我们希望找到生成该观察序列的概率最高的一个隐藏变量的序列。换句话说,我们想要最大化如下的式子:

maxPr(observed sequence | hidden state combination)

一种简单直观的方法是将所有可能的隐藏变量的序列全部列出,然后求出它们生成可观察序列的概率,然后挑出概率最大的一个隐藏变量序列,这种穷举法无疑是非常低效而且耗时的。与之前介绍的forward算法类似,我们可以借助状态转换矩阵以及confusion矩阵来减低运算的复杂度。

我们还是利用递归的方式去选择这样一条最优的隐藏变量序列,我们先定义一个局部概率Pσ,它表示某一路径到达某一中间状态的概率,这里的局部概率与forward算法里面提到的局部概率有点不一样,forward算法里的局部概率是所有路径到达某一中间状态的概率之和,而这里的局部概率,表示一条最优路径到达某一中间状态的概率。先来看如下的一张图:

对于上图所示的各个路径,无论是到达中间时序的状态,还是到达最终时序的状态,都存在一条最优的路径,比如下图所示分别给出了到达最终时序的三个状态的路径,我们把这些路径称为局部最佳路径,每一个这样的局部最佳路径都有一个概率,称为局部概率,这个定义与forward算法里的局部概率不一样,这里的局部概率表示最佳路径的局部概率。

因此,Pσ(i,t),表示所有在t时刻到达状态i的路径中,最佳的一条局部路径的概率,很显然,对于任何的t,i这样的最佳路径和最大局部概率都是存在的。因此在最终时刻t=T,每一个状态都应该有一个局部最佳路径和最大局部概率,那么全局最佳路径就是选择局部概率最大所对应的那条路径。

对应初始状态的局部概率,其定义和在forward算法中的一样,由初始概率和confusion矩阵决定,如下式所示:

Pσ(i,t=1)=π(i)bi,t=1

我们接下来将要计算t时刻的局部概率,同样地利用递归的方法,我们可以通过t−1时刻的局部概率计算t时刻的局部概率,我们先看下面的一张图。为了找到在t时刻到达X状态的最佳路径,我们知道,只有三条路径可以选择,就是从t−1时刻的状态A,B,C中的一个选择一条最佳路径,

之前我们介绍过马尔科夫假设,即一个状态发生的概率只与之前的状态有关,而且对于一阶的马尔科夫过程,当前状态只和前一个状态有关,如果我们要计算状态A到状态X的概率,可以由下式表示:

Pr(most probable path to A)⋅Pr(X|A)⋅Pr(observation|X)

因此,t时刻到达状态X的最佳路径,应该满足如下的表达式:

Pr(Xt)=maxi=A,B,CPr(it−1)×Pr(X|i)×Pr(observation|X)

上式右边的第一项是t−1时刻的局部概率,第二项由状态转换矩阵决定,第三项由confusion矩阵决定。因此,在t时刻给定观察变量,而推出隐藏变量的状态为i的概率为:

Pσ(i,t)=maxj(Pσ(j,t−1)⋅aji⋅bi,t)

现在我们已经知道如何求解到达隐藏变量中间状态和最终状态的局部概率Pσ(i,t), 但是,我们的目标是通过观察变量的一个序列找到对应的最有可能生成该观察序列的一个隐藏变量序列。

我们已经知道,为了计算时刻t的某一状态的局部概率,我们只要知道t−1时刻的局部概率,一旦计算出局部概率,我们就能确定系统t−1时刻最有可能的状态,我们可以用一个表达式来表示这个选择的过程:

ϕ(i,t)=argmaxj(Pσ(j,t−1)⋅aji)

注意到这个表达式和计算局部概率的表达式很像,唯一的区别在于这个表达式没有用到confusion矩阵,也就是没有隐藏变量与观察变量的转换概率。因为这里要找的是隐藏变量的前一个状态,所以与观察变量没有关系。通过这个表达式,我们可以确定到达当前状态i的前一状态j。

下面,我们对这个算法做一个总结,对于有n个隐藏状态的HMM模型,对于每个隐藏状态i,i=1,2,...n,假设存在一组时序长度为T的观察序列:

Xi=(Xi,1,Xi,2,...Xi,T)

隐藏状态的初始局部概率,即t=1时刻的概率,Pσ(i,t=1),可以由转换矩阵和confusion矩阵以及观察序列和隐藏状态的初始概率得到。对于t=2,3,...T以及

i=1,2,...n。我们有:

Pσ(i,t)=maxj(Pσ(j,t−1)⋅aji⋅bi,t)ϕ(i,t)=argmaxj(Pσ(j,t−1)⋅aji)

假设

iT=argmax(Pσ(i,T))

我们可以知道在t=T时刻,即最终时刻,哪个状态的局部概率最大。对于t=T−1,...1,我们有:

it=ϕ(it+1,t+1)

所以,通过上式进行回溯,一旦回到初始时刻,那么序列i1,i2,...iT记录的就是最有可能生成观察序列的一个隐藏变量序列。

最后,我们做个小结,对于一个特定的HMM模型,Viterbi Algorithm用来寻找最有可能生成一组观察变量序列的隐藏变量序列,这个算法记录了每一个隐藏状态的局部概率Pσ以及每一个隐藏状态的回溯点ϕ,隐藏状态的局部概率就是通过回溯点到达该状态的概率。

Forward-backward algorithm

前面我们介绍了两类问题,并且介绍了相应的两种算法。第一类问题是用来评估模型的,我们介绍了forward算法;第二类问题是寻找最佳的隐藏变量序列的,我们利用的

是Viterbi算法,这两类问题都要用到已知的模型,转换矩阵,confusion矩阵,观察变量的序列等等。而第三类问题比前两类要复杂地多,它们没有现成的模型,我们需要

估计一个可行的模型,这属于学习问题,这类问题要用Forward-backward算法来解决,这个算法要比前面介绍的两种算法更加复杂,这里就不再详细介绍了。有兴趣的可以

参考下面的文献:

L R Rabiner and B H Juang, `An introduction to HMMs’, IEEE ASSP Magazine, 3, 4-16.

参考来源:

http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/main.html

机器学习 Hidden Markov Models 3的更多相关文章

  1. 机器学习 Hidden Markov Models 1

    Introduction 通常,我们对发生在时间域上的事件希望可以找到合适的模式来描述.考虑下面一个简单的例子,比如有人利用海草来预测天气,民谣告诉我们说,湿漉漉的海草意味着会下雨,而干燥的海草意味着 ...

  2. 机器学习 Hidden Markov Models 2

    Hidden Markov Models 下面我们给出Hidden Markov Models(HMM)的定义,一个HMM包含以下几个要素: ∏=(πi)表示初始状态的向量.A={aij}状态转换矩阵 ...

  3. 隐马尔科夫模型(Hidden Markov Models)

    链接汇总 http://www.csie.ntnu.edu.tw/~u91029/HiddenMarkovModel.html 演算法笔记 http://read.pudn.com/downloads ...

  4. PRML读书会第十三章 Sequential Data(Hidden Markov Models,HMM)

    主讲人 张巍 (新浪微博: @张巍_ISCAS) 软件所-张巍<zh3f@qq.com> 19:01:27 我们开始吧,十三章是关于序列数据,现实中很多数据是有前后关系的,例如语音或者DN ...

  5. 隐马尔科夫模型(Hidden Markov Models) 系列之三

    转自:http://blog.csdn.net/eaglex/article/details/6418219 隐马尔科夫模型(Hidden Markov Models) 定义 隐马尔科夫模型可以用一个 ...

  6. [Bayesian] “我是bayesian我怕谁”系列 - Markov and Hidden Markov Models

    循序渐进的学习步骤是: Markov Chain --> Hidden Markov Chain --> Kalman Filter --> Particle Filter Mark ...

  7. Hidden Markov Models笔记

    Andrew Ng CS229 讲义: https://pan.baidu.com/s/12zMYBY1NLzkluHNeMNO6MQ HMM模型常用于NLP.语音等领域. 马尔科夫模型(Markov ...

  8. 隐马尔科夫模型(Hidden Markov Models) 系列之五

    转自:http://blog.csdn.net/eaglex/article/details/6458541 维特比算法(Viterbi Algorithm) 找到可能性最大的隐藏序列 通常我们都有一 ...

  9. 隐马尔科夫模型(Hidden Markov Models) 系列之四

    转自:http://blog.csdn.net/eaglex/article/details/6430389 前向算法(Forward Algorithm) 一.如果计算一个可观察序列的概率?   1 ...

随机推荐

  1. PEP8 Python编码规范(转)

    一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车.3 类 ...

  2. ci框架——文章查看之上篇下篇

    1:从数据库查询出推荐的文章的信息,循环查出每篇推荐文章的id和title; foreach($data as $val){ $dataid[]=$val->aid; $datatitle[]= ...

  3. LINUX下面NetworkManager和network冲突的问题

    https://blog.csdn.net/ID_EAGLE/article/details/74085409

  4. [bzoj5457]城市_dsu on tree

    bzoj 5457 城市 题目大意 给定一棵以\(1\)为根的\(n\)个节点的有根树. 每个节点有一个民族和该民族在当前节点的人数. 有\(n\)个询问,第\(i\)个询问是求以\(i\)为根的子树 ...

  5. Ubuntu官方Wiki教程资源

    前言:通常学习一样新知识时,最快的方式是通过搜索引擎然后以最快的方式拿枪上战场,如果接下来还一直依赖搜索引擎去打,那么你会发现自己永远都在打游击:那么如果要解决这个问题,必须要学会系统的学习,只有连贯 ...

  6. Tomcat载入两次问题

    前提介绍: 1.某个应用Dragon放置路径:/opt/apache-tomcat-7.0.47/webapps/Dragon 2.Tomcat的server.xml部分配置信息例如以下:    &l ...

  7. linked-list-cycle-ii——链表,找出开始循环节点

    Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follo ...

  8. java utf8字符 导出csv 文件的乱码问题。

    在输出的格式为UTF-8的格式,但是打开CSV文件一直为乱码,后来参考了这里的代码,搞定了乱码问题,原文请参考:http://hbase.iteye.com/blog/1172200 private ...

  9. UIAutomation使用測试入门

    自己主动化測试的优点: 1.自己主动化能够自己主动測试,不须要人的干预.同一时候还能够不断地反复某一个动作. 2.自己主动化測试在添加了新的功能之后.还能够回归到原理的功能,使其原来的功能不会受到影响 ...

  10. 【linux驱动分析】之dm9000驱动分析(三):sk_buff结构分析

    [linux驱动分析]之dm9000驱动分析(一):dm9000原理及硬件分析 [linux驱动分析]之dm9000驱动分析(二):定义在板文件里的资源和设备以及几个宏 [linux驱动分析]之dm9 ...