HMM(隐马尔科夫模型)与维特比算法

马尔科夫假设:假设模型的当前状态仅仅依赖于前面的几个状态,这被称为马尔科夫假设算法

真实状况当前的状态可能会和前面的状态没有关系,或者有更多的可能性。bash

好比:预测天气,马尔科夫假设假定今天的天气只能经过过去几天已知的天气状况进行预测——而对于其余因素,譬如风力、气压等则没有考虑。学习

n阶马尔科夫模型

一个马尔科夫过程是状态间的转移仅依赖于前n个状态的过程。这个过程被称之为n阶马尔科夫模型,其中n是影响下一个状态选择的(前)n个状态测试

最简单的马尔科夫过程是一阶模型,它的状态选择仅与前一个状态有关。spa

状态转移几率

从一个状态转移到另外一个状态的几率.net

状态转移矩阵

有M个状态的一阶马尔科夫模型,共有M^2个状态转移,由于任何一个状态都有多是全部状态的下一个转移状态.全部的M^2个几率能够用一个状态转移矩阵表示设计

这些几率并不随时间变化而不一样——这是一个很是重要(但经常不符合实际)的假设。3d

也就是说,若是昨天是晴天,那么今天是晴天的几率为0.5,是多云的几率为0.375。注意,每一行的几率之和为1。

一阶马尔科夫过程示例

要初始化这样一个系统,咱们须要肯定起始日天气的(或可能的)状况,定义其为一个初始几率向量,称为pi向量。指针

第一天为晴天的几率为1code

咱们定义一个一阶马尔科夫过程以下:   

  • 状态:三个状态——晴天,多云,雨天。   
  • pi向量:定义系统初始化时每个状态的几率。   
  • 状态转移矩阵:给定前一每天气状况下的当前天气几率。

任何一个能够用这种方式描述的系统都是一个马尔科夫过程

马尔科夫过程的局限性

没法直接获取要测试的状态的变迁,可是存在一个能够观察的东西,它可以反映要测试的东西的状态变迁,这里要测试的状态变迁为隐藏状态,可以观察的为观察的状态

一个隐士也许不可以直接获取到天气的观察状况,可是他有一些水藻。民间传说告诉咱们水藻的状态与天气状态有必定的几率关系——天气和水藻的状态是紧密相关的。但愿为隐士设计一种算法,在不可以直接观察天气的状况下,经过水藻和马尔科夫假设来预测天气。

观察到的状态序列与隐藏过程有必定的几率关系。咱们使用隐马尔科夫模型对这样的过程建模,这个模型包含了一个底层隐藏的随时间改变的马尔科夫过程,以及一个与隐藏状态某种程度相关的可观察到的状态集合。

隐藏状态和观察状态的关系

隐藏状态(实际的天气)由一个简单的一阶马尔科夫过程描述

隐藏状态和观察状态之间的链接表示:在给定的马尔科夫过程当中,一个特定的隐藏状态生成特定的观察状态的几率,有

Sum_{Obs=Dry,Dryish,Damp,Soggy}(Obs|Sun) = 1;
Sum_{Obs=Dry,Dryish,Damp,Soggy}(Obs|Cloud) = 1;
Sum_{Obs=Dry,Dryish,Damp,Soggy}(Obs|Rain) = 1;
复制代码

混淆矩阵

包含了给定一个隐藏状态后获得的观察状态的几率

假设是晴天,那么海藻是 干 稍干 潮湿 湿润 的几率分别为 0.6 0.2 0.15 0.05 他们的和为1

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

一个隐马尔科夫模型是在一个标准的马尔科夫过程当中引入一组观察状态,以及其与隐藏状态间的一些几率关系。

这个模型包含两组状态集合和三组几率集合:  

  • 隐藏状态:一个系统的(真实)状态,能够由一个马尔科夫过程进行描述(例如,天气)。  
  • 观察状态:在这个过程当中‘可视’的状态(例如,海藻的湿度)。  
  • pi向量:包含了(隐)模型在时间t=1时一个特殊的隐藏状态的几率(初始几率) 
  • 状态转移矩阵:包含了一个隐藏状态到另外一个隐藏状态的几率  
  • 混淆矩阵:包含了给定隐马尔科夫模型的某一个特殊的隐藏状态,观察到的某个观察状态的几率。

观察状态的数目能够和隐藏状态的数码不一样。

HMM定义

一个隐马尔科夫模型是一个三元组(pi, A, B)

  • \Pi=(\pi_{i}):初始化几率矩阵
  • A=(a_{ij}):状态转移矩阵,Pr(x_{i_t}|x_{j_{t-1}})
  • B=(b_{ij}):混淆矩阵,Pr(y_i|x_j)

在状态转移矩阵及混淆矩阵中的每个几率都是时间无关的——也就是说,当系统演化时这些矩阵并不随时间改变

这是马尔科夫模型关于真实世界最不现实的一个假设。

应用

  1. 模式识别:

    • 给定HMM求一个观察序列的几率(评估)

    • 搜索最有可能生成一个观察序列的隐藏状态序列(解码)

  2. 给定观察序列生成一个HMM(学习)

评估

有一些描述不一样系统的隐马尔科夫模型(也就是一些( pi,A,B)三元组的集合)及一个观察序列。咱们想知道哪个HMM最有可能产生了这个给定的观察序列。

对于海藻来讲,咱们也许会有一个“夏季”模型和一个“冬季”模型,由于不一样季节之间的状况是不一样的——咱们也许想根据海藻湿度的观察序列来肯定当前的季节。

使用前向算法(forward algorithm)来计算给定隐马尔科夫模型(HMM)后的一个观察序列的几率,并所以选择最合适的隐马尔科夫模型(HMM)。

解码

在许多状况下咱们对于模型中的隐藏状态更感兴趣,由于它们表明了一些更有价值的东西,而这些东西一般不能直接观察到。

一个盲人隐士只能感受到海藻的状态,可是他更想知道天气的状况,天气状态在这里就是隐藏状态。

使用Viterbi 算法(Viterbi algorithm)肯定(搜索)已知观察序列及HMM下最可能的隐藏状态序列。

学习

根据一个观察序列(来自于已知的集合),以及与其有关的一个隐藏状态集,估计一个最合适的隐马尔科夫模型(HMM),也就是肯定对已知序列描述的最合适的(pi,A,B)三元组。

当矩阵A和B不可以直接被(估计)测量时,前向-后向算法(forward-backward algorithm)被用来进行学习(参数估计)

前向算法

  1. 穷举搜索

    咱们有一个用来描述天气及与它密切相关的海藻湿度状态的隐马尔科夫模型(HMM),另外咱们还有一个海藻的湿度状态观察序列。假设连续3天海藻湿度的观察结果是(干燥、湿润、湿透)——而这三天每一天均可能是晴天、多云或下雨。

    每一列都显示了可能的的天气状态,而且每一列中的每一个状态都与相邻列中的每个状态相连。而其状态间的转移都由状态转移矩阵提供一个几率。

    在每一列下面都是某个时间点上的观察状态,给定任一个隐藏状态所获得的观察状态的几率由混淆矩阵提供。

    如今要计算当前HMM可以获得观察序列是 dry,damp,soggy 的几率。

    找到每个可能的隐藏状态,而且将这些隐藏状态下的观察序列几率相加,也就是穷举全部的隐藏几率发生的状况下,是现有观察状态的几率

    Pr(dry,damp,soggy | HMM) = Pr(dry,damp,soggy | sunny,sunny,sunny) + Pr(dry,damp,soggy | sunny,sunny ,cloudy) + 
    Pr(dry,damp,soggy | sunny,sunny ,rainy) + . . . . Pr(dry,damp,soggy | rainy,rainy ,rainy)
    复制代码

    用到的是当前的HMM

    缺点:计算观察序列几率极为昂贵,特别对于大的模型或较长的序列

    应用:利用几率的时间不变性来减小问题的复杂度。

  2. 递归下降问题复杂度【动态规划思想】
    计算过程当中将计算到达网格中某个中间状态的几率做为全部到达这个状态的可能路径的几率求和问题。

    一样对于穷举的计算方法,能够拆分红多个从当前状态转移到下一个局部状态,再把全部的局部状态求和就获得定隐马尔科夫模型(HMM)后的观察序列几率。几率为

    αt ( j )= Pr( 观察状态 | 隐藏状态j ) x Pr(t时刻全部指向j状态的路径)
    复制代码

    j 表示局部状态;αt ( j )表示处于这个状态的几率;t表示时间;Pr( 观察状态 | 隐藏状态j )即混淆矩阵;Pr(t时刻全部指向j状态的路径)即状态转移矩阵

    • 当t=1时,没有任何指向当前状态的路径。故t=1时位于当前状态的几率是初始几率,所以,t=1时的局部几率等于当前状态的初始几率乘以相关的观察几率 \alpha_1(j)=\pi(j)b_{jk_1}

    • 计算t>1的局部几率 α

      要计算t=2时,局部状态为b的几率,必需要计算全部 t=1时刻,从a,b,c到t=2时状态为b的几率,而要获得t=1时刻的全部几率,已经在前一步从t=0运转到t=1的时候计算过了。

      也就是说 t=2时,观察序列前提下,局部隐藏状态为b的几率为t=1状态全部的几率和再乘以混淆矩阵转移到当前观察变量的几率。即

      \alpha_{t+1}(j)=b_{jk_{t+1}}\sum_{i=1}^{n}\alpha_t(i)a_{ij}

维特比算法(Viterbi Algorithm)

 对于一个特殊的隐马尔科夫模型(HMM)及一个相应的观察序列,咱们经常但愿能找到生成此序列最可能的隐藏状态序列

  1. 穷举搜索

    对于网格中所显示的观察序列,最可能的隐藏状态序列是下面这些几率中最大几率所对应的那个隐藏状态序列:

    Pr(dry,damp,soggy | sunny,sunny,sunny), Pr(dry,damp,soggy | sunny,sunny,cloudy), 
    Pr(dry,damp,soggy | sunny,sunny,rainy), . . . . Pr(dry,damp,soggy | rainy,rainy,rainy)
    复制代码

    可是太昂贵了

  2. 递归下降复杂度

    定义局部几率,它是到达网格中的某个特殊的中间状态时的几率  

    对于网格中的每个中间及终止状态,都有一个到达该状态的最可能路径。称这些路径局部最佳路径(partial best paths)。其中每一个局部最佳路径都有一个相关联的几率,即局部几率或

    与前向算法中的局部几率不一样,是到达该状态(最可能)的一条路径的几率。

    于是(i,t)是t时刻到达状态i的全部序列几率中最大的几率, 特别地,在t=T时每个状态都有一个局部几率和一个局部最佳路径。这样咱们就能够经过选择此时刻包含最大局部几率的状态及其相应的局部最佳路径来肯定全局最佳路径(最佳隐藏状态序列)。

    • 当t=1的时候,到达某状态的最可能路径明显是不存在的;可是,咱们使用t=1时的所处状态的初始几率及相应的观察状态k1的观察几率计算局部几率\delta_1(i)=\pi(i)b_{ik_1}
    • 考虑计算t时刻到达状态X的最可能的路径;这条到达状态X的路径将经过t-1时刻的状态A,B或C中的某一个。所以,最可能的到达状态X的路径将是下面这些路径的某一个
    (状态序列),...,A,X
    (状态序列),...,B,X
    (状态序列),...,C,X
    复制代码

    路径末端是AX的最可能的路径将是到达A的最可能路径再紧跟X。这条路径的几率将是:    Pr (到达状态A最可能的路径) .Pr (X | A) . Pr (观察状态 | X)

    马尔科夫假设:给定一个状态序列,一个状态发生的几率只依赖于前n个状态。特别地,在一阶马尔可夫假设下,状态X在一个状态序列后发生的几率只取决于以前的一个状态

    所以,到达状态X的最可能路径几率是

    \delta_t(i)=max_j(\delta_(t-1)a_{ji}b_{ik_t})

     这里,咱们假设前一个状态的知识(局部几率)是已知的,同时利用了状态转移几率和相应的观察几率之积。而后,咱们就能够在其中选择最大的几率了(局部几率\delta)  

反向指针

目标是在给定一个观察序列的状况下寻找网格中最可能的隐藏状态序列——所以,咱们须要一些方法来记住网格中的局部最佳路径。

计算t时刻的's咱们仅仅须要知道t-1时刻的's。在这个局部几率计算以后,就有可能记录前一时刻哪一个状态生成了(i,t)——也就是说,在t-1时刻系统必须处于某个状态,该状态致使了系统在t时刻到达状态i是最优的。这种记录(记忆)是经过对每个状态赋予一个反向指针完成的,这个指针指向最优的引起当前状态的前一时刻的某个状态。

其中argmax运算符是用来计算使括号中表达式的值最大的索引j的。

维特比算法的优势

  1. 经过使用递归减小计算复杂度——这一点和前向算法使用递归减小计算复杂度是彻底相似的。
  2. 维特比算法有一个很是有用的性质,就是对于观察序列的整个上下文进行了最好的解释(考虑)。

nlp 教程

相关文章
相关标签/搜索