隐马尔可夫模型 (Hidden Markov Model) 是一种统计模型,用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析。下图是一个三个状态的隐马尔可夫模型状态转移图,其中x 表示隐含状态,y 表示可观察的输出,a 表示状态转换概率,b 表示输出概率。

下图显示了天气的例子中隐藏的状态和可以观察到的状态之间的关系。我们假设隐藏的状态是一个简单的一阶马尔科夫过程,并且他们两两之间都可以相互转换。

隐藏的状态和可观察到的状态之间有一种概率上的关系,也就是说某种隐藏状态 H 被认为是某个可以观察的状态 O1 是有概率的,假设为 P(O1 | H)。如果可以观察的状态有3种,那么很显然 P(O1 | H)+P(O2 | H)+ P(O3 | H) = 1

这样,我们也可以得到一个另一个矩阵,称为混淆矩阵 (confusion matrix)。这个矩阵的内容是某个隐藏的状态被分别观察成几种不同的可以观察的状态的概率,在天气的例子中,这个矩阵如下图:

上边的图示都强调了 HMM 的状态变迁。而下图则明确的表示出模型的演化,其中绿色的圆圈(上面一行)表示隐藏状态,紫色圆圈(下面一行)表示可观察到状态,箭头表示状态之间的依存概率。

一个 HMM 可用一个5元组 { N, M, π,A,B } 表示,

其中 N 表示隐藏状态的数量,M 表示可观测状态的数量;

π={πi} 为初始状态概率;

A={aij} 为隐藏状态的转移矩阵 Pr(xt(i) | xt-1(j));

B={bik} 表示某个时刻因隐藏状态而可观察的状态的概率,【?】混淆矩阵,Pr(ot(i) | xt(k))。在状态转移矩阵和混淆矩阵中的每个概率都是时间无关的,即当系统演化时,这些矩阵并不随时间改变。对于一个 N 和 M 固定的 HMM 来说,用 λ={ π, A, B } 表示 HMM 参数。

在正常的马尔可夫模型中,状态对于观察者来说是直接可见的。这样状态的转换概率便是全部的参数。而在隐马尔可夫模型中,状态并不是直接可见的,但受状态影响的某些变量则是可见的。每一个状态在可能输出的符号上都有一概率分布。因此输出符号的序列能够透露出状态序列的一些信息。

在 HMM 中有三个典型问题:

(一) 已知模型参数,计算某一给定可观察状态序列的概率

假设我们已经有一个特定的隐马尔科夫模型 λ 和一个可观察状态序列集。我们也许想知道在所有可能的隐藏状态序列下,给定的可观察状态序列的概率。当给定如下一个隐藏状态序列:Q=q1q2....qT

那么在 HMM 和这个隐藏状态序列的条件下,可观察状态序列的概率为:

隐藏状态序列的概率

因此,隐藏状态序列和可观察状态序列的联合概率为:

那么所有可能的隐藏状态序列上,可观察状态序列的概率为:

例如,我们也许有一

个海藻的“Summer”模型和一个“Winter”模型,因为海藻在夏天和冬天的状态应该是不同的,我们希望根据一个可观察状态(海藻的潮湿与否)序列来判断现在是夏天还是冬天。

我们可以使用前向算法来计算在某个特定的 HMM 下一个可观察状态序列的概率,然后据此找到最可能的模型。

下面介绍一下前向算法 (Forward Algorithm)

如何计算一个可观察序列的概率?

1. 穷举搜索

给定一个 HMM,我们想计算出某个可观察序列的概率。考虑天气的例子,我们知道一个描述天气和海藻状态的 HMM,而且我们还有一个海藻状态的序列。假设这个状态中的某三天是(dry,damp,soggy),在这三天中的每一天,天气都可能是晴朗,多云或者下雨,我们可以用下图来描述观察序列和隐藏序列:

在这个图中的每一列表示天气的状态可能,并且每个状态都指向相邻的列的每个状态,每个状态转换在状态转移矩阵中都有一个概率。每一列的下面是当天的可观察的海藻的状态,在每种状态下出现这种可观察状态的概率是由混淆矩阵给出的(累加和等于1)。

  一个可能的计算可观察概率的方法是找到每一个可能的隐藏状态的序列,这里有33 = 27种,这个时候的可观察序列的概率就是 Pr(dry, damp, soggy | HMM)=Pr(dry, damp, soggy | sunny, sunny, sunny) + . . . . + Pr(dry, damp, soggy | rainy, rainy, rainy)。

  很显然,这种计算的效率非常低,尤其是当模型中的状态非常多或者序列很长的时候。事实上,我们可以利用概率不随时间变化这个假设来降低时间的开销。

2. 使用递归来降低复杂度

  我们可以考虑给定 HMM 的情况下,递归的计算一个可观察序列的概率。我们可以首先定义一个部分概率,表示达到某个中间状态的概率。接下来我们将看到这些部分概率是如何在time=1 和 time = n (n > 1) 的时候计算的。

  假设一个T时间段的可观察序列是:

1) 部分概率

  下面这张图表示了一个观察序列(dry,damp,soggy)的一阶转移

 我们可以通过计算到达某个状态的所有路径的概率和来计算到达某个中间状态的概率。比如说,t=2时刻,cloudy的概率用三条路径的概率之和来表示:

 我们用 αt(j) 来表示在 t 时刻是状态 j 的概率,αt(j)=Pr(观察状态 | 隐藏状态 j ) x Pr(t 时刻到达状态 j 的所有路径)。

  最后一个观察状态的部分概率就表示了整个序列最后达到某个状态的所有可能的路径的概率和,比如说在这个例子中,最后一列的部分状态是通过下列路径计算得到的:

因为最后一列的部分概率是所有可能的路径的概率和,所以就是这个观察序列在给定 HMM 下的概率了。

  2) 计算 t=1时候的部分概率

当 t=1 的时候是初始概率,Pr(状态 j | t=0) = π(状态 j ),这样我们就可以计算 t=1 时候的部分概率为:

因为在初始的时候,状态 j 的概率不仅和这个状态本身相关,还和观察状态有关,所以这里用到了混淆矩阵的值,k1 表示第一个观察状态,bjk1 表示隐藏状态是 j,但是观察成 k1 的概率。

  3) 计算 t>1 时候的部分概率

  还是看计算部分概率的公式是:αt(j) = Pr(观察状态 | 隐藏状态 j) x Pr(t 时刻到达状态 j 的所有路径)。 这个公式的左边是从混淆矩阵中已知的,我只需要计算右边部分,很显然右边是所有路径的和:

需要计算的路径数是和观察序列的长度的平方相关的,但是 t 时刻的部分概率已经计算过了之前的所有路径,所以在 t+1 时刻只需要根据 t 时刻的概率来计算就可以了:

这里简单解释下,bjk(t+1) 就是在 t+1 时刻的第 j 个隐藏状态被认为是当前的观察状态的概率,后面一部分是所有t时刻的隐藏状态到 t+1 时候的隐藏状态j的转移的概率的和。这样我们每一步的计算都可以利用上一步的结果,节省了很多时间。

  4) 公式推导

我们使用前向算法在给定的一个 HMM 下计算某个可观察序列的概率。前向算法主要采用的是递归的思想,利用之前的计算结果。有了这个算法,我们就可以在一堆 HMM 中,找到一个最满足当前的可观察序列的模型(前向算法计算出来的概率最大)。

(二) 根据可观察状态的序列找到一个最可能的隐藏状态序列

  和上面一个问题相似的并且更有趣的是根据可观察序列找到隐藏序列。在很多情况下,我们对隐藏状态更有兴趣,因为其包含了一些不能被直接观察到的有价值的信息。比如说在海藻和天气的例子中,一个隐居的人只能看到海藻的状态,但是他想知道天气的状态。这时候我们就可以使用 Viterbi 算法来根据可观察序列得到最优可能的隐藏状态的序列,当然前提是已经有一个 HMM

  另一个广泛使用 Viterbi 算法的领域是自然语言处理中的词性标注。句子中的单词是可以观察到的,词性是隐藏的状态。通过根据语句的上下文找到一句话中的单词序列的最有可能的隐藏状态序列,我们就可以得到一个单词的词性(可能性最大)。这样我们就可以用这种信息来完成其他一些工作。

  下面介绍一下维特比算法 (Viterbi Algorithm)

  一.如何找到可能性最大的隐藏状态序列?

  通常我们都有一个特定的 HMM,然后根据一个可观察状态序列去找到最可能生成这个可观察状态序列的隐藏状态序列。

  1. 穷举搜索

  我们可以在下图中看到每个隐藏状态和可观察状态的关系。

通过计算所有可能的隐藏序列的概率,我们可以找到一个可能性最大的隐藏序列,这个可能性最大的隐藏序列最大化了 Pr(观察序列 | 隐藏状态集)。比如说,对于上图中的可观察序列 (dry damp soggy),最可能的隐藏序列就是下面这些概率中最大的:

  Pr(dry, damp, soggy | sunny, sunny, sunny), ……,Pr(dry, damp, soggy | rainy, rainy, rainy)

  这个方法是可行的,但是计算代价很高。和前向算法一样,我们可以利用转移概率在时间上的不变性来降低计算的复杂度。

  2. 使用递归降低复杂度

  在给定了一个可观察序列和HMM的情况下,我们可以考虑递归的来寻找最可能的隐藏序列。我们可以先定义一个部分概率 δ,即到达某个中间状态的概率。接下来我们将讨论如何计算 t=1 和 t=n (n>1) 的部分概率。

  注意这里的部分概率和前向算法中的部分概率是不一样的,这里的部分概率表示的是在t时刻最可能到达某个状态的一条路径的概率,而不是所有概率之和

  1) 部分概率和部分最优路径

  考虑下面这个图以及可观察序列 (dry, damp, soggy) 的一阶转移

对于每一个中间状态和终止状态 (t=3) 都有一个最可能的路径。比如说,在 t=3 时刻的三个状态都有一个如下的最可能的路径:

 我们可以称这些路径为部分最优路径。这些部分最优路径都有一个概率,也就是部分概率 δ。和前向算法中的部分概率不一样,这里的概率只是一个最可能路径的概率,而不是所有路径的概率和。

  我们可以用 δ(i, t) 来表示在t时刻,到状态i的所有可能的序列(路径)中概率最大的序列的概率,部分最优路径就是达到这个最大概率的路径,对于每一个时刻的每一个状态都有这样一个概率和部分最优路径。

  最后,我们通过计算 t=T 时刻的每一个状态的最大概率和部分最优路径,选择其中概率最大的状态和它的部分最优路径来得到全局的最优路径。

  2) 计算 t=1 时刻的部分概率

  当 t=1 时刻的时候,到达某个状态最大可能的路径还不存在,但是我们可以直接使用在 t=1 时刻某个状态的概率和这个状态到可观察序列 k1 的转移概率:

 3) 计算 t>1 时刻的部分概率

  接下来我们可以根据 t-1 时刻的部分概率来求 t 时刻的部分概率

  我们可以计算所有到状态 X 的路径的概率,找到其中最可能的路径,也就是局部最优路径。注意到这里,到达X的路径必然会经过 t-1 时刻的 A、B 和 C,所以我们可以利用之前的结果。达到X的最可能的路径就是下面三个之一:

  (状态序列),. . .,A,X (状态序列),. . .,B,X (状态序列),. . .,C,X

  我们需要做的就是找到以 AX、BX 和 CX 结尾的路径中概率最大的那个。

  根据一阶马尔科夫的假设,一个状态的发生之和之前的一个状态有关系,所以X在某个序列的最后发生的概率只依赖于其之前的一个状态:

Pr (到达A的最优路径) . Pr (X | A) . Pr (观察状态 | X)

  有个了这个公式,我们就可以利用t-1时刻的结果和状态转移矩阵和混淆矩阵的数据:

 将上面这个表达式推广一下,就可以得到 t 时刻可观察状态为 kt 的第 i 个状态的最大部分概率的计算公式:

 其中 aji 表示从状态 j 转移到状态 i 的概率,bikt 表示状态i被观察成 kt 的概率。

  4) 后向指针

  考虑下图

在每一个中间状态和结束状态都有一个部分最优概率 δ(i, t)。但是我们的目的是找到最可能的隐藏状态序列,所以我们需要一个方法去记住部分最优路径的每一个节点。

  考虑到要计算 t 时刻的部分概率,我们只需要知道 t-1 时刻的部分概率,所以我们只需要记录那个导致了 t 时刻最大部分概率的的状态,也就是说,在任意时刻,系统都必须处在一个能在下一时刻产生最大部分概率的状态。如下图所示:

我们可以利用一个后向指针 φ 来记录导致某个状态最大局部概率的前一个状态,即

 这里 argmax 表示能最大化后面公式的j值,同样可以发现这个公式和 t-1 时刻的部分概率和转移概率有关,因为后向指针只是为了找到“我从哪里来”,这个问题和可观察状态没有关系,所以这里不需要再乘上混淆矩阵因子。全局的行为如下图所示:

5) 优点

  使用 viterbi 算法对一个可观察状态进行解码有两个重要的优点:

  a) 通过使用递归来减少复杂度,这点和之前的前向算法是一样的

  b) 可以根据可观察序列找到最优的隐藏序列,这个的计算公式是:

 这里就是一个从左往右翻译的过程,通过前面的翻译结果得到后面的结果,起始点是初始向量 π。

  3. 补充

  但在序列某个地方有噪声干扰的时候,某些方法可能会和正确答案相差的较远。但是 Viterbi 算法会查看整个序列来决定最可能的终止状态,然后通过后向指针来找到之前的状态,这对忽略孤立的噪声非常有用。

Viterbi 算法提供了一个根据可观察序列计算隐藏序列的很高效的方法,它利用递归来降低计算复杂度,并且使用之前全部的序列来做判断,可以很好的容忍噪声。

  在计算的过程中,这个算法计算每一个时刻每一个状态的部分概率,并且使用一个后向指针来记录达到当前状态的最大可能的上一个状态。最后,最可能的终止状态就是隐藏序列的最后一个状态,然后通过后向指针来查找整个序列的全部状态。

  (三) 根据观察到的序列集来找到一个最有可能的 HMM。 

  在很多实际的情况下,HMM 不能被直接的判断,这就变成了一个学习问题,因为对于给定的可观察状态序列 O 来说,没有任何一种方法可以精确地找到一组最优的 HMM 参数 λ 使 P(O | λ) 最大,于是人们寻求使其局部最优的解决办法,而前向后向算法(也称为Baum-Welch算法)就成了 HMM 学习问题的一个近似的解决方法。

  前向后向算法首先对于 HMM 的参数进行一个初始的估计,但这个很可能是一个错误的猜测,然后通过对于给定的数据评估这些参数的的有效性并减少它们所引起的错误来更新 HMM参数,使得和给定的训练数据的误差变小,这其实是机器学习中的梯度下降的思想。

  对于网格中的每一个状态,前向后向算法既计算到达此状态的“前向”概率,又计算生成此模型最终状态的“后向”概率,这些概率都可以通过前面的介绍利用递归进行高效计算。可以通过利用近似的 HMM 模型参数来提高这些中间概率从而进行调整,而这些调整又形成了前向后向算法迭代的基础。

 

隐马尔可夫模型简单介绍相关推荐

  1. 隐马尔可夫模型(HMM)介绍

    理论介绍: 1. Python实现HMM(隐马尔可夫模型) - sinat_36005594的博客 - CSDN博客 2. HMM进阶(4)--前向算法(python) 3. 前向-后向算法(Forw ...

  2. HMM隐马尔科夫模型(附维特比代码)

    背景知识:马尔科夫模型 1 马尔科夫的局限性 在一些情况下,我们并不能直接得到观测的结果,比如在天气系统中,我们不能直接得到天气的状态,但是我们有一堆蚂蚁,可以从蚂蚁的行为状态找到天气变化的关系规律. ...

  3. 马尔可夫模型(HMM)与隐马尔克夫模型(转)

    马尔可夫模型         马尔可夫模型:是用来预测具有等时间隔(如一年)的时刻点上各类人员的分布状况. 马尔可夫模型,它是根据历史数据,预测等时间间隔点上的各类人员分布状况.此方法的基本思想上根据 ...

  4. 史上最简单的隐马尔可夫模型讲解

    如果... 如果...有一天...你追到了女神夕小瑶...并且与她恋爱了... (想说"没有如果"的路人请选择狗带( ̄∇ ̄)) 小夕的生活很规律的哦,小夕每天都会依次经历且仅仅经历 ...

  5. 隐马尔科夫模型 (HMM) 算法介绍及代码实现

    Table of Contents Hidden Markov Model (隐马尔科夫模型) 定义 基本问题 前向算法 算法流程 实现代码 后向算法 算法流程 实现代码 Viterbi算法 算法流程 ...

  6. 隐马尔可夫模型HMM笔记——HMM原理介绍、python hmmlearn库的使用

    隐马尔可夫模型HMM是序列标注模型最基础的一种,由字构词是序列标注模型的一种应用.序列标注指的就是给定一个序列x=x1x2-xn,找出序列中每个元素对应标签y=y1y2-yn,其中y所有可能的取值集合 ...

  7. 隐马尔可夫模型(一):模型介绍

    2021SC@SDUSC 马尔可夫模型 概念导入 在某段时间内,交通信号灯的颜色变化序列是:红色 - 黄色 - 绿色 - 红色. 在某个星期天气的变化状态序列:晴朗 - 多云 - 雨天. 像交通信号灯 ...

  8. 一站式解决:隐马尔可夫模型(HMM)全过程推导及实现

    作者 | 永远在你身后 转载自知乎用户永远在你身后 [导读]隐马尔可夫模型(Hidden Markov Model,HMM)是关于时许的概率模型,是一个生成模型,描述由一个隐藏的马尔科夫链随机生成不可 ...

  9. 第十九课.隐马尔科夫模型

    目录 隐马尔科夫模型的结构 马尔科夫链与隐马尔科夫模型 实例 HMM的要素 模型的性质 推理问题:HMM的状态解码 隐状态解码问题 最大路径概率与维特比算法 使用维特比算法解码 实例演示 基于Pyth ...

  10. (转载)机器学习知识点(十一)隐马尔可夫模型

           隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域 ...

最新文章

  1. 不同年龄段给狗狗起名字,我命中了,你呢?
  2. tf.placeholder使用错误
  3. Workbox.strategies v3.x 中文版
  4. leetcode574. 当选者(SQL)
  5. 对于JDBC的简单理解
  6. nginx 判断手机端跳转_nginx基本功能和工作原理
  7. Java Collection接口详解
  8. 驯服 Tiger: 并发集合
  9. org.apache.ibatis.binding.BindingException: Parameter '1' not found. Available parameters are [arg3,
  10. java 28181协议_WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台
  11. 前端工具Gulp的学习
  12. crossover卸载 linux,Ubuntu中卸载CrossOver困难?那是你没学会这个命令
  13. python 小知识总结汇整
  14. java简历模板 知乎,简历模板太多不知选哪种?让面试官眼前一亮的简历!
  15. Deep Learning(深度学习)学习笔记
  16. 计算机毕业设计Java医院医患管理系统(系统+源码+mysql数据库+Lw文档)
  17. 英文名字及意义(超全)
  18. Video Classification with Channel-Separated Convolutional Netwroks 论文阅读
  19. 谱尼软件测试,谱尼为网络安全护航
  20. Zynga发布魔法三消手游《Harry Potter: Puzzles Spells》

热门文章

  1. 计算机系统漏洞及防范,计算机系统漏洞以及防范的措施.doc
  2. ‘keytool‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
  3. 论初唐诗人的历史地位-上官仪、王勃、杨炯、陈子昂、杜审言
  4. 计算机WIN7安装,教您win7旗舰版安装教程
  5. 远程桌面不能复制粘贴解决办法
  6. mysql 添加 删除索引(index) alter table 修改字段 修改列
  7. JavaScript打点计时器
  8. go语言和c运行效率,Go语言执行效率
  9. win10硬盘锁怎么解除_win10如何使用bitlocker解锁硬盘加密
  10. 遥感数据相关资源获取