Hidden Markov Models中的问题一,给定一个隐马尔科夫模型高效计算某一输出观察序列的概率。这是一个评估的问题。例如:HMMs最经典的例子隐藏的天气状态和观察的海藻湿度状态的例子,给定几个隐马尔科夫模型(春季、夏季、秋季、冬季模型),通过计算不同模型下指定观察序列的概率,推断这个观察序列是在哪个季节。天气状态N={sunny, cloudy, rainy},海藻的湿度状态M={dry, dryish, damp, soggy}。假设连续3天海藻湿度的观察结果是(dry, damp, soggy),这三天每一天都可能是sunny, cloudy, rainy。这样在隐马尔科夫模型下的观察序列的概率P(dry, damp, soggy)=P(dry, damp, soggy| sunny, clody, rainy)+P(dry, damp, soggy| sunny, sunny, sunny)+...+P(dry,rainy, rainy, rainy),即找到每一种隐藏状态组合下的观察序列的概率,这里隐藏状态组合有种。穷举是不可行的,这时需要Forward算法来进行计算。
Forward算法本质就是计算每一个状态的局部观察序列的概率,将这些局部观察概率最终汇总为整个观察序列的概率。
下面3张图分别是在时刻状态分别为Sunny, Cloudy, Rainy的局部观察序列(Dry, Damp)的概率。
图1 图2
图3
下面3张图分别是在时刻状态分别为Sunny, Cloudy, Rainy的观察序列(Dry, Damp, Soggy)的概率。将这些概率相加,就是P(O)的概率了。
图4 图5
图6
Forward Algorithm步骤:
1. 初始化:当t=1时,没有任何前置的状态,所以,;
2. 递归:;
3. 最终:;
这就是整个计算过程。
举例:
O: (dry, damp, soggy)
: P(sunny)=0.63, P(Cloudy)=0.17, P(Rainy)=0.20
A状态转移矩阵
Sunny | Cloudy | Rainy | |
Sunny | 0.5 | 0.375 | 0.125 |
Cloudy | 0.25 | 0.125 | 0.625 |
Rainy | 0.25 | 0.375 | 0.375 |
Dry | Dryish | Damp | Soggy | |
Sunny | 0.60 | 0.20 | 0.15 | 0.05 |
Cloudy | 0.25 | 0.25 | 0.25 | 0.25 |
Rainy | 0.05 | 0.10 | 0.35 | 0.50 |
Step 1:初始化 t=1
=P(sunny)*P(dry|sunny)=0.63*0.60=0.378;
=P(cloudy)*P(dry|cloudy)=0.17*0.25=0.0425;
=P(rainy)*P(dry|rainy)=0.20*0.05=0.01;
Step 2:递归
t=2:
=(0.378*0.5+0.0425*0.25+0.01*0.25)*P(damp|sunny)
=0.202125*0.15=0.0303875;
=(0.378*0.375+0.0425*0.125+0.01*0.375)*P(damp|cloudy)
=0.1508125*0.25=0.037703125;
=(0.378*0.125+0.0425*0.625+0.01*0.375)*P(damp|rainy)
=0.0775625*0.35=0.027146875;
t=3:
=(0.0303875*0.5+0.037703125*0.25+0.027146875*0.25)*P(soggy|sunny)
=0.03140625*0.05=0.0015703125
=(0.0303875*0.375+0.037703125*0.125+0.027146875*0.375)*P(soggy|cloudy)
=0.02628828125*0.25=0.00657207031
=(0.0303875*0.125+0.037703125*0.625+0.027146875*0.375)*P(soggy|rainy)
=0.03754296875*0.5=0.01877148437
Step 3:最终
P(O)==0.02691386718=2.691386718%
建议大家可以看看Reference中的链接,这里面有个Java Applet的例子,我的图片都是引用了这个例子的。
Reference: Hidden Markov Models Forward Algorithm