前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HMM(隐马尔科夫模型)与维特比算法

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

作者头像
爬蜥
发布2024-01-27 11:30:04
930
发布2024-01-27 11:30:04
举报

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

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

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

n阶马尔科夫模型

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

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

状态转移概率

从一个状态转移到另一个状态的概率

状态转移矩阵

有M个状态的一阶马尔科夫模型,共有M^2个状态转移,因为任何一个状态都有可能是所有状态的下一个转移状态.所有的M^2个概率可以用一个状态转移矩阵表示

这些概率并不随时间变化而不同——这是一个非常重要(但常常不符合实际)的假设。

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

一阶马尔科夫过程示例

要初始化这样一个系统,我们需要确定起始日天气的(或可能的)情况,定义其为一个初始概率向量,称为pi向量。

第一天为晴天的概率为1

我们定义一个一阶马尔科夫过程如下:   

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

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

马尔科夫过程的局限性

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

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

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

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

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

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

代码语言:javascript
复制
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})
\Pi=(\pi_{i})

:初始化概率矩阵

A=(a_{ij})
A=(a_{ij})

:状态转移矩阵,

Pr(x_{i_t}|x_{j_{t-1}})
Pr(x_{i_t}|x_{j_{t-1}})
B=(b_{ij})
B=(b_{ij})

:混淆矩阵,

Pr(y_i|x_j)
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)被用来进行学习(参数估计)

前向算法

穷举搜索

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

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

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

现在要计算当前HMM能够得到观察序列是 dry,damp,soggy 的概率。

找到每一个可能的隐藏状态,并且将这些隐藏状态下的观察序列概率相加,也就是穷举所有的隐藏概率发生的情况下,是现有观察状态的概率

代码语言:javascript
复制
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

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

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

递归降低问题复杂度【动态规划思想】 计算过程中将计算到达网格中某个中间状态的概率作为所有到达这个状态的可能路径的概率求和问题。

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

代码语言:javascript
复制
α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}
\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}
\alpha_{t+1}(j)=b_{jk_{t+1}}\sum_{i=1}^{n}\alpha_t(i)a_{ij}

维特比算法(Viterbi Algorithm)

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

穷举搜索

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

代码语言:javascript
复制
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)

但是太昂贵了

递归降低复杂度

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

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

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

因而(i,t)是t时刻到达状态i的所有序列概率中最大的概率, 特别地,在t=T时每一个状态都有一个局部概率和一个局部最佳路径。这样我们就可以通过选择此时刻包含最大局部概率的状态及其相应的局部最佳路径来确定全局最佳路径(最佳隐藏状态序列)。

  • 当t=1的时候,到达某状态的最可能路径明显是不存在的;但是,我们使用t=1时的所处状态的初始概率及相应的观察状态k1的观察概率计算局部概率
\delta_1(i)=\pi(i)b_{ik_1}
\delta_1(i)=\pi(i)b_{ik_1}
  • 考虑计算t时刻到达状态X的最可能的路径;这条到达状态X的路径将通过t-1时刻的状态A,B或C中的某一个。因此,最可能的到达状态X的路径将是下面这些路径的某一个
代码语言:javascript
复制
(状态序列),...,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(i)=max_j(\delta_(t-1)a_{ji}b_{ik_t})

 这里,我们假设前一个状态的知识(局部概率)是已知的,同时利用了状态转移概率和相应的观察概率之积。然后,我们就可以在其中选择最大的概率了(局部概率

\delta
\delta

)  

反向指针

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

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

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

维特比算法的优点

  1. 通过使用递归减少计算复杂度——这一点和前向算法使用递归减少计算复杂度是完全类似的。
  2. 维特比算法有一个非常有用的性质,就是对于观察序列的整个上下文进行了最好的解释(考虑)。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • n阶马尔科夫模型
  • 状态转移概率
  • 状态转移矩阵
  • 一阶马尔科夫过程示例
  • 马尔科夫过程的局限性
  • 隐藏状态和观察状态的关系
  • 混淆矩阵
  • 隐马尔科夫模型(Hidden Markov Models)
  • HMM定义
  • 应用
  • 评估
  • 解码
  • 学习
  • 前向算法
  • 维特比算法(Viterbi Algorithm)
  • 反向指针
  • 维特比算法的优点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档