隐马尔可夫模型中的Viterbi算法_第1页
隐马尔可夫模型中的Viterbi算法_第2页
隐马尔可夫模型中的Viterbi算法_第3页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、隐马尔可夫模型中的 Viterbi 算法 先用一句话来简单描述一下:给出一个观测序列 o1,o2,o3 .,我们希望找到观测 序列背后的隐藏状态序列 s1, s2, s3, .;. Viterbi 以它的发明者名字命名,正是这样 一种由动态规划的方法来寻找出现概率最大的隐藏状态序列(被称为 Viterbi 路 径)的算法。这里需要抄一点有关隐马可夫序列( HMM ,Hidden Markov Model )的书页来解 释一下观测序列和隐藏状态序列。首先从最简单的离散 Markov 过程入手,我们知道, Markov 随机过程具有如下的 性质:在任意时刻,从当前状态转移到下一个状态的概率与当前状

2、态之前的那些 状态没有关系。所以,我们可以用一个状态转移概率矩阵来描述它。假设我们有 n个离散状态 S1, S2, S,n我们可以构造一个矩阵 A,矩阵中的元素 aij 表示从当 前状态 Si下一时刻迁移到 Sj 状态的概率。但是在很多情况下, Markov 模型中的状态是我们观察不到的。例如,容器与彩球 的模型:有若干个容器,每个容器中按已知比例放入各色的彩球(这样,选择了 容器后,我们可以用概率来预测取出各种彩球的可能性);我们做这样的实验, 实验者从容器中取彩球 先选择一个容器,再从中抓出某一个球,只给观察者 看球的颜色;这样,每次取取出的球的颜色是可以观测到的,即 o1, o2, ,但

3、是 每次选择哪个容器是不暴露给观察者的,容器的序列就组成了隐藏状态序列 S1, S2, Sn。这是一个典型的可以用 HMM 描述的实验。HMM 有几个重要的任务,其中之一就是期望通过观察序列来猜测背后最有可能 的隐藏序列。在上面的例子中,就是找到我们在实验中最有可能选择到的容器序 列。Viterbi 正是用来解决这个问题的算法。 HMM 另外两个任务是: a) 给定一个 HMM ,计算一个观测序列出现的可能性; b)已知一个观测序列, HMM 参数不 定,如何优化这些参数使得观测序列的出现概率最大。解决前一个问题可以用与 Viberbi 结构非常类似的 Forward 算法来解决(实际上在下面

4、合二为一),而后者 可以用 Baum-Welch/EM 算法来迭代逼近。 从 Wiki 上抄一个例子来说明 Viterbi 算法。 假设你有一个朋友在外地,每天你可以通过电话来了解他每天的活动。他每天只 会做三种活动之一 Walk, Shop, Clean。你的朋友从事哪一种活动的概率与当 地的气候有关,这里,我们只考虑两种天气 Rainy, Sunny。我们知道,天气 与运动的关系如下:例如,在下雨天出去散步的可能性是 0.1。 而天气之前互相转换的关系如下,(从行到列) 例如,从今天是晴天而明天就开始下雨的可能性是 0.4 。 同时为了求解问题我们假设初始情况:通话开始的第一天的天气有 0

5、.6 的概率是 Rainy,有 0.4 概率是 Sunny。 OK,现在的问题是,如果连续三天,你发现你的朋 友的活动是: Walk->Shop->Clean;那么,如何判断你朋友那里这几天的天气是怎 样的?解决这个问题的 python伪代码如下: def forward_viterbi(y, X, sp, tp, ep): T = for state in X:# prob. V. path V. prob. Tstate = (spstate, state, spstate) for output in y: U = for next_state in X: total = 0

6、 argmax = None valmax = 0 for source_state in X: (prob, v_path, v_prob) = Tsource_state p = epsource_stateoutput * tpsource_statenext_state prob *= p v_prob *= p total += prob if v_prob > valmax: argmax = v_path + next_state valmax = v_prob Unext_state = (total, argmax, valmax) T = U# apply sum/m

7、ax to the final states: total = 0 argmax = Nonevalmax = 0 for state in X: (prob, v_path, v_prob) = Tstate total += prob if v_prob > valmax: argmax = v_path valmax = v_prob return (total, argmax, valmax) 几点说明:1、算法对于每一个状态要记录一个三元组: (prob, v_path, v_prob),其中, prob 是从开始状态到当前状态所有路径(不仅仅 是最有可能的 viterbi 路

8、径)的概率加 在一起的结果(作为算法附产品,它可以输出一个观察序列在给定 HMM 下总的 出现概率,即 forward 算法的输出), v_path 是从开始状态一直到当前状态的 viterbi 路径, v_prob 则是该路径的概率。2、算法开始,初始化 T (T是一个 Map,将每一种可能状态映射到上面所说的 三元组上)3、三重循环,对每个一活动 y,考虑下一步每一个可能的状态 next_state,并重 新计算若从 T 中的当前状态 state 跃迁到 next_state概率会有怎样的变化。跃迁主要考虑天气转移 (tpsource_statenext_state) 与该天气下从事某种活

9、动 (epsource_stateoutput)的联合概率。所有下一步状态考虑完后,要从 T 中找 出最优的选择 viterbi 路径即概率最大的 viterbi 路径,即上面更新 Map U的 代码 Unext_state = (total, argmax, valmax)。4、算法最后还要对 T 中的各种情况总结,对 total 求和,选择其中一条作为最优 的 viterbi 路径。5、算法输出四个天气状态,这是因为,计算第三天的概率时,要考虑天气转变 到下一天的情况。6、通过程序的输出可以帮助理解这一过程: observation=Walk next_state=Sunnystate=S

10、unny p=0.36 triple=(0.144,Sunny->,0.144) state=Rainyp=0.03triple=(0.018,Rainy->,0.018)Update USunny=(0.162,Sunny->Sunny->,0.144) next_state=Rainy state=Sunnyp=0.24 triple=(0.096,Sunny->,0.096) state=Rainyp=0.07 triple=(0.042,Rainy->,0.042)Update URainy=(0.138,Sunny->Rainy->,0

11、.096) observation=Shop next_state=Sunnystate=Sunny p=0.18 triple=(0.02916,Sunny->Sunny->,0.02592) state=Rainyp=0.12 triple=(0.01656,Sunny->Rainy->,0.01152)Update USunny=(0.04572,Sunny->Sunny->Sunny->,0.02592) next_state=Rainystate=Sunny p=0.12 triple=(0.01944,Sunny->Sunny->

12、;,0.01728) state=Rainyp=0.28 triple=(0.03864,Sunny->Rainy->,0.02688)Update URainy=(0.05808,Sunny->Rainy->Rainy->,0.02688) observation=Cleannext_state=Sunny state=Sunny p=0.06 triple=(0.0027432,Sunny->Sunny->Sunny->,0.0015552) state=Rainyp=0.15 triple=(0.008712,Sunny->Rainy

13、->Rainy->,0.004032)Update USunny=(0.0114552,Sunny->Rainy->Rainy->Sunny->,0.004032) next_state=Rainy state=Sunnyp=0.04triple=(0.0018288,Sunny->Sunny->Sunny->,0.0010368) state=Rainyp=0.35 triple=(0.020328,Sunny->Rainy->Rainy->,0.009408)Update URainy=(0.0221568,Sunny

14、->Rainy->Rainy->Rainy->,0.009408) final triple=(0.033612,Sunny->Rainy->Rainy->Rainy->,0.009408) 所以,最终的结果是,朋友那边这几天最可能的天气情况是 Sunny->Rainy- >Rainy->Rainy,它有 0.009408的概率出现。而我们算法的另一个附带的结论 是,我们所观察到的朋友这几天的活动序列: Walk->Shop->Clean 在我们的隐马 可夫模型之下出现的总概率是 0.033612。附:c+主要代码片

15、断void forward_viterbi(const vector<string> & ob, viterbi_triple_t & vtriple)./aliasmap<string, double>& sp = start_prob;map<string, map<string, double> > & tp = transition_prob;map<string, map<string, double> > & ep = emission_prob;/ initializa

16、tionInitParameters();map<string, viterbi_triple_t> T;for (vector<string>:iterator it = states.begin();it != states.end();+it).viterbi_triple_t foo;b = sp*it;foo.vprob = sp*it;T*it = foo;map<string, viterbi_triple_t> U;double total = 0; vector<string> argmax;double valm

17、ax = 0; double p = 0;for (vector<string>:const_iterator itob = ob.begin(); itob != ob.end(); +itob) .cout << "observation=" << *itob << endl;U.clear();for (vector<string>:iterator itNextState = states.begin(); itNextState != states.end();+itNextState).cout <

18、;< " next_state=" << *itNextState << endl; total = 0;argmax.clear(); valmax = 0;for (vector<string>:iterator itSrcState = states.begin(); itSrcState != states.end();+itSrcState). cout << " state=" << *itSrcState << endl; viterbi_triple_t foo = T*itSrcState;p = ep*itSrcState*itob * tp*itSrcState*itNextState; cout << " p=" << p << endl;b *= p; foo.vprob *= p;cout << " triple=" << foo << endl;total += b; if (foo.vprob > valmax). = foo.vp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论