标签:
原文链接:http://www.cnblogs.com/zhangchaoyang/articles/2219571.html
此外,http://www.leexiang.com/hidden-markov-model 写的也很清楚明了。
HMM介绍
Hidden Markov Models是一种统计信号处理方法,模型中包含2个序列和3个矩阵:状态序列S、观察序列O、初始状态矩阵P、状态转移矩阵A、混淆矩阵B。举个例子来说明。
你一个异地的朋友只做三种活动:散步、看书、做清洁。每天只做一种活动。假设天气只有两种状态:晴和兩。每天只有一种天气。你的朋友每天告诉你他做了什么,但是不告诉你他那里的天气。
某一周从周一到周五每天的活动分别是{读书,做清洁,散步,做清洁,散步}----这就是观察序列O,因为你可以观察得到。
从周一到周五的天气依次是{晴,兩,晴,晴,晴}----这就是状态序列S,状态序列是隐藏的,你不知道。
根据长期统计,某天晴的概率是0.6,兩的概率是0.4。则。
从晴转晴的概率是0.7,从晴转兩的概率是0.3。从兩转晴的概率是0.4,从兩转兩的概率是0.6。则。
天气晴时,散步的概率是0.4,看书的概率是0.3,做清洁的概率是0.3。天气兩时,散步的概率是0.1,看书的概率是0.4,做清洁的概率是0.5。则。
该模型和实际情况有明显不符的地方:用一简单的状态转移矩阵A来表示状态的转移概率的前提是t时刻的状态只跟t-1时刻的状态有关,而实际上今天的天气跟过去几天的天气都有关系,而且跟过去几天的晴朗程度、兩量大小都有关系;混淆矩阵B认为今天的活动只跟今天的天气有关系,实际上今天的活动跟过去几天的活动也有关系,比如过去一周都没有打扫房间,那今天做清洁的概率就大大增加。
评估问题(看这个时候有点糊涂,又搜了其他文章。)
隐马尔可夫模型中包含一个评估问题:已知模型参数,计算某一特定输出序列的概率。通常使用forward算法解决。
比如计算活动序列{读书,做清洁,散步,做清洁,散步}出现的概率,就属于评估问题。
如果穷举的话,观察序列会有2^5种,需要分别计算它们出现的概率,然后找出概率最大的。
穷举法中有很多重复计算,向前算法就是利用已有的结果,减少重复计算。
算法借助于一个矩阵Q[LEN][M],其中M是所有状态的种数,Q[i][j]表示从第0天到第i天,满足观察序列,且第i天隐藏状态为Sj的所有可能的隐藏序列的概率之和。最终所求结果为Q[LEN-1][0]+...+Q[LEN-1][M-1],即最后一天,所有隐藏状态下,分别满足观察序列的概率值之和。
比如Q[0][0]=p(第一天做卫生 且 第一天晴)=p(天晴)*p(做卫生|天晴)=P[0]*B[0][2]=0.6*0.3=0.18
Q[0][1]=p(第一天做卫生 且 第一天下雨)=p(下雨)*p(做卫生|下雨)=P[1]*B[1][2]=0.4*0.5=0.2
Q[1][0]=p(第一天做卫生 且 第二天晴 且 第二天做卫生)
=p(第一天做卫生 且 第二天晴)*p(天晴的情况下做卫生)
=p{ p(第一天做卫生 且 第一天晴)*p(从天晴转天晴)+p(第一天做卫生 且 第一天下雨)*p(从下雨转天晴) }*p(天晴的情况下做卫生)
={ Q[0][0]*A[0][0] + Q[0][1]*A[1][0] } * B[0][2]
Q[1][1]= ……
…… ……
可以看到计算Q矩阵的每i行时都用到了第i-1行的结果。
标签:
原文地址:http://www.cnblogs.com/CheeseZH/p/4230104.html