Hidden Markov Model由5个要素构成:
1. N表示状态的集合。S={,, ..., },表示t时刻的状态;例如:人的健康状态有{'Health', 'Fever'};
2. M表示不同的观察符号的集合。V={,, ...,};例如:医生观察人的感觉有{'Normal', 'Cold', 'Dizzy'};
3. A表示状态转移概率集合。A={},=P(=|=),1i,jN;表示t-1时刻的状态转移到t时刻的状态的条件概率;
4. B表示t时刻观察符号在状态时的条件概率。B={},=P(|);
5. 表示初始状态的集合,={},=P(=),1 j N。
给定N, M, A, B, ,HMMs就能输出一个观察符号的序列O=, 其中,T是观察序列的符合个数。
Hidden Markov Model有3个独立性假设:
假设1:t时刻的状态只依赖于t-1时刻的状态,;
假设3:状态与具体的时间无关。
Hidden Markov Model的3个基本问题:
问题1:给定一个HMMs的模型,如何高效的计算某一个输出观察序列O的概率?评价问题。
用forward算法来进行计算。以后会补充forward算法。
问题2:给定一个HMMs的模型和一个输出观察序列O,如何找到产生O概率最大的状态序列?解码问题。
arg max P(O|Q),用Viterbi算法进行计算。下面有详细的例子。
表示t时刻状态时的最优状态序列和前t个观察序列的联合概率:
问题3:给定一个HMMs的模型和一个输出观察序列O,如何调整模型的参数使得产生这一序列的概率最大?机器学习问题。
将用到Baum-Welch的EM算法,这个我没理解,等以后理解了再补充,如果有人知道欢迎一起讨论。
Viterbi 算法:
初始化:;
递归:
最终状体:
最优状态路径的逆向索引:=,t=T-1, T-2, ..., 1
Vertibi算法例子(使用了维基百科中的维特比算法的例子):
医生给病人看病,病人的状态有Health和Fever,而医生观察病人的感觉Normal, Cold, Dizzy,医生根据病人返回的感觉来判断病人是否生病(Health, Fever),医生觉得病人的模式符合HMM的问题2。例如:一个病人 day 1感觉是Normal, day 2感觉是Cold, day 3感觉是Dizzy。
N={Health, Fever}, M={Normal, Cold, Dizzy}
A:
Health | Fever | |
Health | 0.7 | 0.3 |
Fever | 0.4 | 0.6 |
B:
Normal | Cold | Dizzy | |
Health | 0.5 | 0.4 | 0.1 |
Fever | 0.1 | 0.3 | 0.6 |
: P(health)=0.6, P(fever)=0.4
O={O1=normal,O2=cold, O3=dizzy}
Day 1(O1=normal)初始化:
=p(health)p(normal|health)=0.6*0.5=0.3,=0;
=p(fever)p(normal|fever)=0.4*0.1=0.04,=0;
开始递归:
Day 2(O2=cold):
=max{}P(cold|health)
=max((0.3*0.7),(0.04*0.4))*0.4=0.084
;
=max{}P(cold|fever)
=max((0.3*0.3),(0.04*0.6))*0.3=0.027
;
Day 3(O3=dizzy):
=max{}P(dizzy|health)
=max{(0.084*0.7),(0.027*0.4)}*0.1=0.00588
;
=max{}P(dizzy|fever)
=max{(0.084*0.3),(0.027*0.6)}*0.6=0.01512
;
最后一步:
=max(0.00588,0.01512)=0.01512
结果:一个3天的病人的状态序列
day 3:fever, day 2: health, day 1: health。
Reference:
1.维基百科-维特比算法;
2. 条件随机场理论综述, 韩雪东,周彩根;