HMM:隐马尔科夫模型-前向算法
2016-02-23 13:22
288 查看
http://blog.csdn.net/pipisorry/article/details/50722376
目标-解决HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)(计算给定隐马尔科夫模型HMM下的观察序列的概率—Pr(observations |
![](http://www.52nlp.cn/images/lamda.gif)
)。)?从而评估哪一个HMM最有可能产生了这个给定的观察序列。
![](http://www.52nlp.cn/images/trellis.gif)
网格中的每一列都显示了可能的的天气状态,并且每一列中的每个状态都与相邻列中的每一个状态相连。而其状态间的转移都由状态转移矩阵提供一个概率。在每一列下面都是某个时间点上的观察状态,给定任一个隐藏状态所得到的观察状态的概率由混淆矩阵提供。
可以看出,一种计算观察序列概率的方法是找到每一个可能的隐藏状态,并且将这些隐藏状态下的观察序列概率相加。对于上面那个(天气)例子,将有3^3 = 27种不同的天气序列可能性,因此,观察序列的概率是:
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)
用这种方式计算观察序列概率极为昂贵,特别对于大的模型或较长的序列,因此我们可以利用这些概率的时间不变性来减少问题的复杂度。
皮皮blog
假设一个T-长观察序列是:
![](http://www.52nlp.cn/images/5.1.2_A.gif)
a.局部概率(
考虑下面这个网格,它显示的是天气状态及对于观察序列干燥,湿润及湿透的一阶状态转移情况:
![](http://www.52nlp.cn/images/trellis.1.gif)
我们可以计算到达网格中某个中间状态的概率,也就是所有到达这个状态的可能路径的概率求和。
例如,t=2时位于“多云”状态的局部概率通过如下路径计算得出:
![](http://www.52nlp.cn/images/paths.to.cloudy.gif)
我们定义t时刻位于状态j的局部概率为at(j)——这个局部概率计算如下:
![](http://www.52nlp.cn/images/alpha.gif)
t ( j )= Pr( 观察状态 | 隐藏状态j ) x Pr(t时刻所有指向j状态的路径)
对于最后的观察状态,其局部概率包括了通过所有可能的路径到达这些状态的概率——例如,对于上述网格,最终的局部概率通过如下路径计算得出:
![](http://www.52nlp.cn/images/alphas.at.t_eq_3.gif)
由此可见,对于这些最终局部概率(本例t=3时)求和等价于对于网格中所有可能的路径概率求和,也就求出了给定隐马尔科夫模型(HMM)后的观察序列概率。
Note:Pr(dry,damp,soggy | sunny,sunny,sunny)等价于Pr(dry | sunny)Pr(sunny | sunny)Pr(damp | sunny)...?
![](http://www.52nlp.cn/images/alpha.gif)
t ( j )= Pr( 观察状态 | 隐藏状态j ) x Pr(t时刻所有指向j状态的路径)
特别当t=1时,没有任何指向当前状态的路径。故t=1时位于当前状态的概率是初始概率,即Pr(state|t=1)=P(state),因此,t=1时的局部概率等于当前状态的初始概率乘以相关的观察概率:
![](http://www.52nlp.cn/images/5.2_2.gif)
所以初始时刻状态j的局部概率依赖于此状态的初始概率及相应时刻我们所见的观察概率。
![](http://www.52nlp.cn/images/alpha.gif)
t ( j )= Pr( 观察状态 | 隐藏状态j ) x Pr(t时刻所有指向j状态的路径)
我们可以假设(递归地),乘号左边项“Pr( 观察状态 | 隐藏状态j )”已经有了,现在考虑其右边项“Pr(t时刻所有指向j状态的路径)”。
为了计算到达某个状态的所有路径的概率,我们可以计算到达此状态的每条路径的概率并对它们求和,例如:
![](http://www.52nlp.cn/images/allpath.gif)
计算
![](http://www.52nlp.cn/images/alpha.gif)
所需要的路径数目随着观察序列的增加而指数级递增,但是t-1时刻
![](http://www.52nlp.cn/images/alpha.gif)
‘s给出了所有到达此状态的前一路径概率,因此,我们可以通过t-1时刻的局部概率定义t时刻的
![](http://www.52nlp.cn/images/alpha.gif)
‘s,即:
仅利用t时刻局部概率计算t+1时刻局部概率的表达式
![](http://www.52nlp.cn/images/5.1.2.3_1.gif)
这个概率等于相应的观察概率(t+1时在状态j所观察到的符号的概率)与该时刻到达此状态的概率总和(上一步每个局部概率的计算结果与相应状态转移概率乘积后再相加)的乘积。
现在我们就可以递归地计算给定隐马尔科夫模型(HMM)后一个观察序列的概率,给定隐马尔科夫模型(HMM)的观察序列的概率就等于t=T时刻的局部概率之和。
我们有一个长度为T的观察序列O以及一个含有n个隐藏状态的隐马尔科夫模型l=(pi,A,B)。
穷举搜索将包括计算所有可能的序列:
![](http://www.52nlp.cn/images/5.1.2.4_1.gif)
公式
![](http://www.52nlp.cn/images/5.1.2.4_2.gif)
对我们所观察到的概率求和——注意其复杂度与T成指数级关系。相反的,使用前向算法我们可以利用上一步计算的信息,相应地,其时间复杂度与T成线性关系。
穷举搜索的时间复杂度是2TN^T,前向算法的时间复杂度是N^2T,其中T指的是观察序列长度,N指的是隐藏状态数目。
皮皮blog
![](http://www.52nlp.cn/images/5.2_1.gif)
其中每一个y是观察集合之一。
局部(中间)概率(
![](http://www.52nlp.cn/images/alpha.gif)
‘s)是递归计算的,首先通过计算t=1时刻所有状态的局部概率
![](http://www.52nlp.cn/images/alpha.gif)
:
![](http://www.52nlp.cn/images/5.2_2.gif)
然后在每个时间点,t=2,… ,T时,对于每个状态的局部概率,由下式计算局部概率
![](http://www.52nlp.cn/images/alpha.gif)
:
![](http://www.52nlp.cn/images/5.2_3.gif)
最后,给定HMM,
![](http://www.52nlp.cn/images/lamda.gif)
,观察序列的概率等于T时刻所有局部概率之和:
![](http://www.52nlp.cn/images/5.2_4.gif)
局部概率
对于“天气”那个例子,下面的图表显示了t = 2为状态为多云时局部概率
![](http://www.52nlp.cn/images/alpha.gif)
的计算过程。这是相应的观察概率b与前一时刻的局部概率与状态转移概率a相乘后的总和再求积的结果:
![](http://img.blog.csdn.net/20160224154845601?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
from:http://blog.csdn.net/pipisorry/article/details/50722376
ref:
目标-解决HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)(计算给定隐马尔科夫模型HMM下的观察序列的概率—Pr(observations |
![](http://www.52nlp.cn/images/lamda.gif)
)。)?从而评估哪一个HMM最有可能产生了这个给定的观察序列。
计算观察序列的概率(Finding the probability of an observed sequence)
穷举搜索( Exhaustive search for solution)
给定隐马尔科夫模型,也就是在模型参数(pi, A, B)已知的情况下,我们想找到观察序列的概率。还是考虑天气这个例子,我们有一个用来描述天气及与它密切相关的海藻湿度状态的隐马尔科夫模型(HMM),另外我们还有一个海藻的湿度状态观察序列。假设连续3天海藻湿度的观察结果是(干燥、湿润、湿透)——而这三天每一天都可能是晴天、多云或下雨,对于观察序列以及隐藏的状态,可以将其视为网格:![](http://www.52nlp.cn/images/trellis.gif)
网格中的每一列都显示了可能的的天气状态,并且每一列中的每个状态都与相邻列中的每一个状态相连。而其状态间的转移都由状态转移矩阵提供一个概率。在每一列下面都是某个时间点上的观察状态,给定任一个隐藏状态所得到的观察状态的概率由混淆矩阵提供。
可以看出,一种计算观察序列概率的方法是找到每一个可能的隐藏状态,并且将这些隐藏状态下的观察序列概率相加。对于上面那个(天气)例子,将有3^3 = 27种不同的天气序列可能性,因此,观察序列的概率是:
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)
用这种方式计算观察序列概率极为昂贵,特别对于大的模型或较长的序列,因此我们可以利用这些概率的时间不变性来减少问题的复杂度。
皮皮blog
使用递归降低问题复杂度
给定一个隐马尔科夫模型(HMM),我们将考虑递归地计算一个观察序列的概率。我们首先定义局部概率(partial probability),它是到达网格中的某个中间状态时的概率。然后,我们将介绍如何在t=1和t=n(>1)时计算这些局部概率。假设一个T-长观察序列是:
![](http://www.52nlp.cn/images/5.1.2_A.gif)
a.局部概率(
![](http://www.52nlp.cn/images/alpha.gif)
‘s)
考虑下面这个网格,它显示的是天气状态及对于观察序列干燥,湿润及湿透的一阶状态转移情况:![](http://www.52nlp.cn/images/trellis.1.gif)
我们可以计算到达网格中某个中间状态的概率,也就是所有到达这个状态的可能路径的概率求和。
例如,t=2时位于“多云”状态的局部概率通过如下路径计算得出:
![](http://www.52nlp.cn/images/paths.to.cloudy.gif)
我们定义t时刻位于状态j的局部概率为at(j)——这个局部概率计算如下:
![](http://www.52nlp.cn/images/alpha.gif)
t ( j )= Pr( 观察状态 | 隐藏状态j ) x Pr(t时刻所有指向j状态的路径)
对于最后的观察状态,其局部概率包括了通过所有可能的路径到达这些状态的概率——例如,对于上述网格,最终的局部概率通过如下路径计算得出:
![](http://www.52nlp.cn/images/alphas.at.t_eq_3.gif)
由此可见,对于这些最终局部概率(本例t=3时)求和等价于对于网格中所有可能的路径概率求和,也就求出了给定隐马尔科夫模型(HMM)后的观察序列概率。
Note:Pr(dry,damp,soggy | sunny,sunny,sunny)等价于Pr(dry | sunny)Pr(sunny | sunny)Pr(damp | sunny)...?
b.计算t=1时的局部概率alpha‘s
我们按如下公式计算局部概率:![](http://www.52nlp.cn/images/alpha.gif)
t ( j )= Pr( 观察状态 | 隐藏状态j ) x Pr(t时刻所有指向j状态的路径)
特别当t=1时,没有任何指向当前状态的路径。故t=1时位于当前状态的概率是初始概率,即Pr(state|t=1)=P(state),因此,t=1时的局部概率等于当前状态的初始概率乘以相关的观察概率:
![](http://www.52nlp.cn/images/5.2_2.gif)
所以初始时刻状态j的局部概率依赖于此状态的初始概率及相应时刻我们所见的观察概率。
c.计算t>1时的局部概率alpha‘s
我们再次回顾局部概率的计算公式如下:![](http://www.52nlp.cn/images/alpha.gif)
t ( j )= Pr( 观察状态 | 隐藏状态j ) x Pr(t时刻所有指向j状态的路径)
我们可以假设(递归地),乘号左边项“Pr( 观察状态 | 隐藏状态j )”已经有了,现在考虑其右边项“Pr(t时刻所有指向j状态的路径)”。
为了计算到达某个状态的所有路径的概率,我们可以计算到达此状态的每条路径的概率并对它们求和,例如:
![](http://www.52nlp.cn/images/allpath.gif)
计算
![](http://www.52nlp.cn/images/alpha.gif)
所需要的路径数目随着观察序列的增加而指数级递增,但是t-1时刻
![](http://www.52nlp.cn/images/alpha.gif)
‘s给出了所有到达此状态的前一路径概率,因此,我们可以通过t-1时刻的局部概率定义t时刻的
![](http://www.52nlp.cn/images/alpha.gif)
‘s,即:
仅利用t时刻局部概率计算t+1时刻局部概率的表达式
![](http://www.52nlp.cn/images/5.1.2.3_1.gif)
这个概率等于相应的观察概率(t+1时在状态j所观察到的符号的概率)与该时刻到达此状态的概率总和(上一步每个局部概率的计算结果与相应状态转移概率乘积后再相加)的乘积。
现在我们就可以递归地计算给定隐马尔科夫模型(HMM)后一个观察序列的概率,给定隐马尔科夫模型(HMM)的观察序列的概率就等于t=T时刻的局部概率之和。
d.相比穷举降低了计算复杂度
我们可以比较通过穷举搜索(评估)和通过递归前向算法计算观察序列概率的时间复杂度。我们有一个长度为T的观察序列O以及一个含有n个隐藏状态的隐马尔科夫模型l=(pi,A,B)。
穷举搜索将包括计算所有可能的序列:
![](http://www.52nlp.cn/images/5.1.2.4_1.gif)
公式
![](http://www.52nlp.cn/images/5.1.2.4_2.gif)
对我们所观察到的概率求和——注意其复杂度与T成指数级关系。相反的,使用前向算法我们可以利用上一步计算的信息,相应地,其时间复杂度与T成线性关系。
穷举搜索的时间复杂度是2TN^T,前向算法的时间复杂度是N^2T,其中T指的是观察序列长度,N指的是隐藏状态数目。
皮皮blog
前向算法(Forward Algorithm)
使用前向算法计算T长观察序列的概率:![](http://www.52nlp.cn/images/5.2_1.gif)
其中每一个y是观察集合之一。
局部(中间)概率(
![](http://www.52nlp.cn/images/alpha.gif)
‘s)是递归计算的,首先通过计算t=1时刻所有状态的局部概率
![](http://www.52nlp.cn/images/alpha.gif)
:
![](http://www.52nlp.cn/images/5.2_2.gif)
然后在每个时间点,t=2,… ,T时,对于每个状态的局部概率,由下式计算局部概率
![](http://www.52nlp.cn/images/alpha.gif)
:
![](http://www.52nlp.cn/images/5.2_3.gif)
最后,给定HMM,
![](http://www.52nlp.cn/images/lamda.gif)
,观察序列的概率等于T时刻所有局部概率之和:
![](http://www.52nlp.cn/images/5.2_4.gif)
局部概率
![](http://www.52nlp.cn/images/alpha.gif)
的计算过程示例
对于“天气”那个例子,下面的图表显示了t = 2为状态为多云时局部概率![](http://www.52nlp.cn/images/alpha.gif)
的计算过程。这是相应的观察概率b与前一时刻的局部概率与状态转移概率a相乘后的总和再求积的结果:
from:http://blog.csdn.net/pipisorry/article/details/50722376
ref:
相关文章推荐
- Cocos2d-x 3.x瓦片地图
- 如何生成KeyStore
- oracle的参数优化
- linux并行集群的搭建
- C#多线程学习(三) 生产者和消费者
- 标准IO库 知识点百问《APUE》 chapter-5
- java源码级注解处理+字节码级注解处理
- C#多线程学习(二) 如何操纵一个线程
- Java 生成唯一性标识解决方案与重复概率分析
- StatusTimeUtils
- Intent下的FLAG几种属性和启动模式详解
- Android源码分析-深入理解setContentView方法
- C#多线程学习(一) 多线程的相关概念
- Andorid之ActivityManager
- 关于MBAFF的解释
- jQuery中get()和eq()的区别
- HDU 1465 错排问题
- makefile 中 $@ $^ %< ar rz使用
- 理解复数
- SQL Delta实用案例介绍