前向算法(Forward Algorithm)
计算观察序列的概率(Finding the probability of an observed sequence)
1.计算t=1时的局部概率α‘S
按如下公式计算t=1的局部概率:
$$
\alpha_{t}{(j)} = Pr(观察状态|隐藏状态) ∗ Pr(t时刻所有指向j状态的路径)
$$
t=1的时,没有任何指向当前状态的路径。所以t=1时位于当前状态的概率是初始概率。
$$
\alpha_{1}{(j)} = \pi(j) ∗ b_{jk_{1}}
$$
|
|
2.计算t>1时的局部概率
我们可以假设(递归地),乘号左边项“Pr( 观察状态 | 隐藏状态j )”已经有了,现在考虑其右边项“Pr(t时刻所有指向j状态的路径)”。
为了计算到达某个状态的所有路径的概率,我们可以计算到达此状态的每条路径的概率并对他们求和。否则用穷举的思想是指数级别上升的。
计算α所需要的路径数目随着观察序列的增加而指数级递增,但是t-1时刻!α’s给出了所有到达此状态的前一路径概率,因此,我们可以通过t-1时刻的局部概率定义t时刻的α’s,即:
$$
\alpha_{t+1}{(j)} = b_{jk_{t+1}} \sum_{i=1}^{n} {\alpha_{t}(i) \alpha_{ij}}
$$
对于这一步,可以结合着前一篇文章马尔科夫模型2后面对前向算法的简单例子来看。
3.降低计算复杂度
假设观察序列O的长度为T以及一个含有n个隐藏状态的隐马尔科夫模型 I = (pi,A,B)。
穷举搜索的时间复杂度是2TN^T,前向算法的时间复杂度是T*N^2。
根据上述可以把前向算法的公式进行简化(但实际复杂度是没有改变的)
$$
\sum_{X}{\pi(i_{1})b_{i_{1}k_{1}}}\prod_{j=2}^{T}{\alpha_{i_{j-1}i_j}b_{i_{j}k_j}}
$$
4.前向算法代码的简单实现
|
|
5.总结
前向算法的目标是计算给定隐马尔科夫模型HMM下的观察序列的概率—Pr(observations | ℷ)。
我们首先通过计算局部概率降低计算整个概率的复杂度,局部概率表示的是t时刻到达某个状态s的概率。
t=1时候,可以利用初始概率(来自于P向量)和观察概率Pr(observation | state)(来自于混淆矩阵)计算局部概率;而t>1时的局部概率可以利用t-1时的局部概率进行计算。
因此,这个问题是递归定义的,观察序列的概率就是通过依次计算t=1,2,…,T时的局部概率,并且对于t=T时所有局部概率。