• HMM学习笔记_2(从一个实例中学习HMM前向算法)


         HMM算法想必大家已经听说了好多次了,完全看公式一头雾水。但是HMM的基本理论其实很简单。因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察向量由一个具有相应概率密度分布的状态序列产生,又由于每一个状态也是随机分布的,所以HMM是一个双重随机过程。

         HMM是语音识别,人体行为识别,文字识别等领域应用非常广泛。

         一个HMM模型可以用5个元素来描述,包过2个状态集合和3个概率矩阵。其分别为

         隐含状态S,可观测状态O,初始状态概率矩阵π,隐含状态概率转移矩阵A,观测状态转移概率矩阵 B。

         HMM在实际应用中主要用来解决3类问题。

         1. 评估问题。

       即给定观测序列 O=O1O2O3…Ot和模型参数λ=(A,B,π),怎样有效计算这一观测序列出现的概率

         2. 解码问题。

       即给定观测序列 O=O1O2O3…Ot和模型参数λ=(A,B,π),怎样寻找满足这种观察序列意义上最优的隐含状态序列S。

         3. 学习问题。

         即HMM的模型参数λ=(A,B,π)未知,如何求出这3个参数以使观测序列O=O1O2O3…Ot的概率尽可能的大。

         这篇文章是针对第一个问题来说的,一般采用的是前向后向算法来解决评估问题。这里将的是前向算法。

         在此之前,先引入几个符号:

         at(i) :  表示到第t个观察值Ot时处于状态i。

         : 表示在状态i下产生观察值 的概率。

         现在来看一下前向算法的理论来源。

         因为我们要解决的是模型估计问题。即计算概率 。将其利用如下公式化简:

       

         因此首先要先计算

       ,其中Q为一给定的状态序列 。又有

      

         其中

      

         所以

      

         因此最后求得

      

         由此可以看见其计算复杂度非常大,为

        为了解决这个问题,前向算法就出现了。首先定义了一个前向变量 。表示从1到t,输出符号o序列,t时刻处于状态i的累计输出概率。

         因为前向变量有如下性质:

         初值:

        ,且

        ,最后有递推关系:

       

         为什么这样就可以简化计算复杂度呢?其原因很简单,因为每一次的at(i),我们都可以用at-1(i)来计算,就不用重复计算了。如下示意图可以帮助我们形象的理解:

     

       

         看了这么多公式,是不是头晕了?不急,下面看一个实例就会完全明白的。

         题目:HMM模型如下,试通过前向算法计算产生观察符号序列O={ABAB}时每个时刻的 和总概率。

         当然初始概率矩阵π=(1,0,0),即开始处于状态1。按照上面的公式理论,我们的递推依次解出at(i)。解法如下:

         t=1时:

      

         t=2时:

      

         t=3时:

     

         t=4时:

     

         所以有最后的结果:

       

         最后将其计算过程示意图表示如下:

      

     

  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2415583.html
Copyright © 2020-2023  润新知