前向算法可以理解成我们之前接触的 Adaboost 算法中的前向分步算法,即后一时刻(t+1)某观测值出现概率的计算,依靠当前时刻(t)的概率。这样我们省去了在直接计算法中的重复计算过程,因为我们 保存了 在时刻 t 时各观测值出现的概率;而直接计算方法中,每种情况的计算都需要 从头至尾 全部重新计算。
-
前向概率
给定模型
λ,定义截止到时刻 t 部分的观测序列为
o1,o2,…,ot,且状态为
qn 的概率为前向概率,记作:
αt(s)=P(o1,o2,…,ot,st=qn∣λ)=P(o1,st=qn∣λ)⋅P(o2,st=qn∣λ)⋅…⋅P(ot,st=qn∣λ)
以此我们可以递推地计算前向概率,最终求得观测序列概率
P(O∣λ)。
-
观测序列概率的前向算法
∙ 计算初值。在 t=1 时刻,计算在不同状态下,出现观测值
o1 的概率:
α1(s)=πsbs(o1),s=q1,q2,...,qN
∙ 递推计算。以此对 t=2,3,…,T,依据前一时刻的计算结果,计算转移到下一个状态的情况下,出现观测值
ot 的概率:
αt(s)=[∑j=q1qNαt−1(j)αjs]bs(ot),s=q1,q2,...,qN
∙ 计算完毕。
P(O∣λ)=∑s=q1qNαT(s)
-
例子
沿用上一篇文章的例子:
假设有 4 个盒子,每个盒子都装有红白两种颜色的球,各盒子的红白球数为:
盒子编号 |
1 |
2 |
3 |
4 |
红球数 |
5 |
3 |
6 |
8 |
白球数 |
5 |
7 |
4 |
2 |
我们按照以下方法抽取小球并产生颜色的观测序列:
开始时,从 4 个盒子中 等概率 随机选取一个盒子,从盒子中抽取 1 个小球记录颜色并放回;
且 状态转移概率矩阵为:
A=⎣⎢⎢⎡00.400100.4000.600.5000.60.5⎦⎥⎥⎤
图模型表示:
观测概率矩阵 为:
B=⎣⎢⎢⎡0.50.30.60.80.50.70.40.2⎦⎥⎥⎤
假设已知观测序列为:
O=(红,白)
那么使用前向算法计算:
在 t=1 时刻:
⎩⎪⎪⎪⎨⎪⎪⎪⎧α1(1)=π1b1(o1)=0.25∗0.5=0.125α1(2)=π2b2(o1)=0.25∗0.3=0.75α1(3)=π3b3(o1)=0.25∗0.6=0.15α1(4)=π4b4(o1)=0.25∗0.8=0.2
在 t=2 时刻:
⎩⎪⎪⎪⎨⎪⎪⎪⎧α2(1)=[∑i=14α(i1)ai1]⋅b1(o2)=[0+0.125+0+0]∗0.5=0.0625α2(2)=[∑i=14α(i2)ai2]⋅b2(o2)=[0.3+0+0.45+0]∗0.7=0.525α2(3)=[∑i=14α(i3)ai3]⋅b3(o2)=[0+0.06+0+0.09]∗0.4=0.06α2(4)=[∑i=14α(i4)ai4]⋅b4(o2)=[0+0+0.1+0.1]∗0.2=0.04
最终
P(O∣λ)=0.0625+0.525+0.06+0.04=0.6875
所以,该模型
λ 产生观测序列
O=(红,白) 的概率为 0.6875