隐马尔可夫模型(HMM) [转]

隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,天然语言处理以及生物信息等领域体现了很大的价值。平时,常常能接触到涉及 HMM 的相关文章,一直没有仔细研究过,都是走马观花,所以,想花一点时间梳理下,加深理解,在此特别感谢 52nlp 对 HMM 的详细介绍。html

  考虑下面交通灯的例子,一个序列多是红-红/橙-绿-橙-红。这个序列能够画成一个状态机,不一样的状态按照这个状态机互相交替,每个状态都只依赖于前一个状态,若是当前的是绿灯,那么接下来就是橙灯,这是一个肯定性系统,所以更容易理解和分析,只要这些状态转移都是已知的。可是在实际当中还存在许多不肯定性系统。node

  在平常生活当中,咱们老是但愿根据当前天气的状况来预测将来天气状况,和上面的交通灯的例子不一样,咱们不能依靠现有知识肯定天气状况的转移,可是咱们仍是但愿能获得一个天气的模式。一种办法就是假设这个模型的每一个状态都只依赖于前一个的状态,这个假设被称为马尔科夫假设,这个假设能够极大简化这个问题。显然,这个假设也是一个很是糟糕的假设,致使不少重要的信息都丢失了。jquery

  当涉及到天气的时候,马尔科夫假设描述为,假设若是咱们知道以前一些天的天气信息,那么咱们就能预测今天的天气。固然,这个例子也是有些不合实际的。可是,这样一个简化的系统能够有利于咱们的分析,因此咱们一般接受这样的假设,由于咱们知道这样的系统能让咱们得到一些有用的信息,尽管不是十分准确的。算法

  谈到 HMM,首先简单介绍一下马尔可夫过程 (Markov Process),它因俄罗斯数学家安德烈·马尔可夫而得名,表明数学中具备马尔可夫性质的离散随机过程。该过程当中,每一个状态的转移只依赖于以前的 n 个状态,这个过程被称为1个 n 阶的模型,其中 n 是影响转移状态的数目。最简单的马尔科夫过程就是一阶过程,每个状态的转移只依赖于其以前的那一个状态。注意这和肯定性系统不同,由于这种转移是有几率的,而不是肯定性的。机器学习

  马尔可夫链是随机变量 X1, … , Xn 的一个数列。这些变量的范围,即他们全部可能取值的集合,被称为“状态空间”,而 Xn  的值则是在时间 的状态。若是 Xn+1 对于过去状态的条件几率分布仅是 X的一个函数,则函数

  这里 为过程当中的某个状态。上面这个恒等式能够被看做是马尔可夫性质学习

  马尔可夫链的在不少应用中发挥了重要做用,例如,谷歌所使用的网页排序算法(PageRank)就是由马尔可夫链定义的。.net

  下图展现了天气这个例子中全部可能的一阶转移:翻译

  注意一个含有 N 个状态的一阶过程有 N个状态转移。每个转移的几率叫作状态转移几率 (state transition probability),就是从一个状态转移到另外一个状态的几率。这全部的 N个几率能够用一个状态转移矩阵来表示,其表示形式以下:指针

  对该矩阵有以下约束条件:

  下面就是海藻例子的状态转移矩阵

  这个矩阵表示,若是昨天是晴天,那么今天有50%的多是晴天,37.5%的几率是阴天,12.5%的几率会下雨,很明显,矩阵中每一行的和都是1。

  为了初始化这样一个系统,咱们须要一个初始的几率向量:

  这个向量表示第一天是晴天。

  到这里,咱们就为上面的一阶马尔科夫过程定义了如下三个部分:

  状态:晴天、阴天和下雨

  初始向量:定义系统在时间为0的时候的状态的几率

  状态转移矩阵:每种天气转换的几率

  全部的能被这样描述的系统都是一个马尔科夫过程

  然而,当马尔科夫过程不够强大的时候,咱们又该怎么办呢?在某些状况下,马尔科夫过程不足以描述咱们但愿发现的模式。

  例如,一个隐居的人可能不能直观的观察到天气的状况,可是民间传说告诉咱们海藻的状态在某种几率上是和天气的状况相关的。在这种状况下咱们有两个状态集合,一个能够观察到的状态集合(海藻的状态)和一个隐藏的状态(天气情况)。咱们但愿能找到一个算法能够根据海藻的情况和马尔科夫假设来预测天气的情况。

  一个更现实的例子是语音识别,咱们听到的声音是声带、喉咙和一块儿其余的发音器官共同做用的结果。这些因素相互做用,共同决定了每个单词的声音,而一个语音识别系统检测的声音(能够观察的状态)是人体内部各类物理变化(隐藏的状态、引伸一我的真正想表达的意思)产生的。

  某些语音识别设备把内部的发音机制做为一个隐藏的状态序列,把最后的声音当作是一个和隐藏的状态序列十分类似的能够观察到的状态的序列。在这两个例子中,一个很是重要的地方是隐藏状态的数目和能够观察到的状态的数目多是不同的。在一个有3种状态的天气系统(sunny、cloudy、rainy)中,也许能够观察到4种潮湿程度的海藻(dry、dryish、damp、soggy)。在语音识别中,一个简单的发言也许只须要80个语素来描述,可是一个内部的发音机制能够产生不到80或者超过80种不一样的声音。

  在上面的这些状况下,能够观察到的状态序列和隐藏的状态序列是几率相关的。因而咱们能够将这种类型的过程建模为有一个隐藏的马尔科夫过程和一个与这个隐藏马尔科夫过程几率相关的而且能够观察到的状态集合。这就是本文重点介绍的隐马尔可夫模型。

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

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

  对 HMM 来讲,有以下三个重要假设,尽管这些假设是不现实的。

  

  假设1:马尔可夫假设(状态构成一阶马尔可夫链)

  假设2:不动性假设(状态与具体时间无关)

  假设3:输出独立性假设(输出仅与当前状态有关)

  隐藏的状态和可观察到的状态之间有一种几率上的关系,也就是说某种隐藏状态 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(j))。在状态转移矩阵和混淆矩阵中的每一个几率都是时间无关的,即当系统演化时,这些矩阵并不随时间改变。对于一个 N 和 M 固定的 HMM 来讲,用 λ={ π, A, B } 表示 HMM 参数。

  在正常的马尔可夫模型中,状态对于观察者来讲是直接可见的。这样状态的转换几率即是所有的参数。而在隐马尔可夫模型中,状态并非直接可见的,但受状态影响的某些变量则是可见的。每个状态在可能输出的符号上都有一律率分布。所以输出符号的序列可以透露出状态序列的一些信息。

  在 HMM 中有三个典型问题:

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

  

假设咱们已经有一个特定的隐马尔科夫模型 λ 和一个可观察状态序列集。咱们也许想知道在全部可能的隐藏状态序列下,给定的可观察状态序列的几率。当给定以下一个隐藏状态序列:

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

  而隐藏状态序列在 HMM 条件下的几率为:

  所以,隐藏状态序列和可观察状态序列的联合几率为:

  那么全部可能的隐藏状态序列上,可观察状态序列的几率为:

  例如,咱们也许有一个海藻的“Summer”模型和一个“Winter”模型,由于海藻在夏天和冬天的状态应该是不一样的,咱们但愿根据一个可观察状态(海藻的潮湿与否)序列来判断如今是夏天仍是冬天。

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

  这种类型的应用一般出如今语音设别中,一般咱们会使用不少 HMM,每个针对一个特别的单词。一个可观察状态的序列是从一个能够听到的单词向前获得的,而后这个单词就能够经过找到知足这个可观察状态序列的最大几率的 HMM 来识别。

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

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

  1. 穷举搜索

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

  在这个图中的每一列表示天气的状态可能,而且每一个状态都指向相邻的列的每一个状态,每一个状态转换在状态转移矩阵中都有一个几率。每一列的下面是当天的可观察的海藻的状态,在每种状态下出现这种可观察状态的几率是由混淆矩阵给出的。

  一个可能的计算可观察几率的方法是找到每个可能的隐藏状态的序列,这里有3= 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) 公式推导

 

  5) 下降计算复杂度

  咱们能够比较穷举和递归算法的复杂度。假设有一个 HMM,其中有 n 个隐藏状态,咱们有一个长度为 T 的观察序列。

  穷举算法的须要计算全部可能的隐藏序列:

  须要计算:

  很显然穷举算法的时间开销是和 T 指数相关的,即 NT,而若是采用递归算法,因为咱们每一步均可以利用上一步的结果,因此是和 T 线性相关的,即复杂度是 N2T。

  这里咱们的目的是在某个给定的 HMM 下,计算出某个可观察序列的几率。咱们经过先计算部分几率的方式递归的计算整个序列的全部路径的几率,大大节省了时间。在 t=1 的时候,使用了初始几率和混淆矩阵的几率,而在t时刻的几率则能够利用 t-1 时刻的结果。

  这样咱们就能够用递归的方式来计算全部可能的路径的几率和,最后,全部的部分几率的计算公式为

  使用天气的例子,计算 t=2 时刻的 cloudy 状态的几率方法如图:

  咱们使用前向算法在给定的一个 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 时刻某个状态的几率和这个状态到可观察序列 k的转移几率:

  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 时刻可观察状态为 k的第 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 模型参数来提升这些中间几率从而进行调整,而这些调整又造成了前向后向算法迭代的基础。

  另外,前向后向算法是 EM 算法的一个特例,它避免了 EM 算法的暴力计算,而采用动态规划思想来解决问题,Jelinek 在其书《Statistical Methods for Speech Recognition》中对前向后向算法与 EM 算法的关系进行了详细描述,有兴趣的读者能够参考这本书。

  相似于上面讲到的前向算法,咱们也能够定义后向变量 βt(i) 来计算给定当前隐藏状态 i 时,部分观察序列 ot+1,ot+2,…,oT的几率,即:

  与前向算法相似,咱们也能够经过迭代算法有效计算 βt(i),计算公式以下:

  其中

  进一步咱们能够发现

  所以

  下面开始介绍前向后向算法

  首先咱们须要定义两个辅助变量,这两个变量能够用前文介绍过的前向变量和后向变量进行定义。

  第一个变量定义为 t 时状态 i 和 t+1 时状态 j 的几率,即

  该变量在网格中所表明的关系以下图所示:

  

  该等式等价于

  利用前向变量和后向变量,上式能够表示为

  第二个变量定义为后验几率,也就是在给定观察状态序列和 HMM 的状况下,t 时状态 i 的几率,即

  利用前向变量和后向变量,上式能够表示为

  所以,下式为在任意时刻状态 i 的指望,也就是从状态 i 转移到观察状态 o 的指望

  一样,下式也就是从状态 i 转移到状态 j 的指望

  咱们能够发现定义的这两个变量之间的关系为

  下面介绍前向后向算法的参数学习过程,在学习的过程当中,不断更新 HMM 的参数,从而使得 P(O | λ) 最大。咱们假设初始的 HMM 参数为  λ={ π, A, B },首先计算前向变量 α 和后向变量 β,再根据刚刚介绍的公式计算指望 ξ 和 ζ,最后,根据下面的3个重估计公式更新 HMM 参数。

  若是咱们定义当前的 HMM 模型为 λ={ π,A,B },那么能够利用该模型计算上面三个式子的右端;咱们再定义从新估计的 HMM 模型为,那么上面三个式子的左端就是重估的 HMM 模型参数。Baum 及他的同事在70年代证实了,所以若是咱们迭代地计算上面三个式子,由此不断地从新估计 HMM 的参数,那么在屡次迭代后能够获得 HMM 模型的一个最大似然估计。不过须要注意的是,前向后向算法所得的这个最大似然估计是一个局部最优解。

  参考资料:

  1. http://blog.csdn.net/eaglex/article/details/6376826

  2. http://en.wikipedia.org/wiki/Markov_chain

  3. http://en.wikipedia.org/wiki/Hidden_Markov_model

  4. Lawrence R. Rabiner, A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition. Proceedings of the IEEE, 77 (2), p. 257–286, February 1989.

  5. L. R. Rabiner and B. H. Juang, “An introduction to HMMs,” IEEE ASSP Mag., vol. 3, no. 1, pp. 4-16, 1986.

  6. http://jedlik.phy.bme.hu/~gerjanos/HMM/node2.html

  7. http://www.cs.brown.edu/research/ai/dynamics/tutorial/Documents/HiddenMarkovModels.html

  8. 隐马尔可夫模型简介,刘群

相关文章
相关标签/搜索