「前向算法/后向算法/EM算法」在 隐马尔可夫模型(HMM) 中求概率

好的西门~我们来详细讲解「前向算法(Forward Algorithm) 」在 隐马尔可夫模型(HMM) 中求概率的用法。


📘 前向算法(Forward Algorithm)求概率


✅ 一句话总结

前向算法 是用于计算给定观测序列出现的概率 的动态规划方法,关键思想是:逐步累积前面所有可能路径的概率和


🔶 一、问题背景

我们在 HMM(隐马尔可夫模型) 中有:

  • 状态序列(隐藏):Q={q1,q2,...,qT}Q = \{q_1, q_2, \dots, q_T\}

  • 观测序列(可见):O={o1,o2,...,oT}O = \{o_1, o_2, \dots, o_T\}

  • 初始概率:πi=P(q1=Si)\pi_i = P(q_1 = S_i)

  • 状态转移概率:aij=P(qt+1=Sj∣qt=Si)a_{ij} = P(q_{t+1} = S_j | q_t = S_i)

  • 观测概率(发射概率):bj(ot)=P(ot∣qt=Sj)b_j(o_t) = P(o_t | q_t = S_j)


🔶 二、目标

我们想要求:

P(O∣λ)P(O | \lambda)

即:在模型参数 λ\lambda(包含 π,A,B\pi, A, B)已知的情况下,观测序列 OO 出现的总概率。


🔶 三、前向概率定义

令:

αt(i)=P(o1,o2,...,ot,qt=Si∣λ)\alpha_t(i) = P(o_1, o_2, \dots, o_t, q_t = S_i | \lambda)

即:在时间 tt 时处于状态 SiS_i,且前 tt 个观测为 o1,...,oto_1, \dots, o_t 的联合概率


🔶 四、算法步骤(动态规划)

🟡 第一步:初始化(t=1)

α1(i)=πi⋅bi(o1)\alpha_1(i) = \pi_i \cdot b_i(o_1)

表示初始时就处于状态 SiS_i,并发出观测 o1o_1 的概率。


🟡 第二步:递推(t=2 到 T)

αt(j)=∑i=1Nαt−1(i)⋅aij⋅bj(ot)\alpha_t(j) = \sum_{i=1}^N \alpha_{t-1}(i) \cdot a_{ij} \cdot b_j(o_t)

含义:

  • 从前一步所有状态 SiS_i 转移到当前状态 SjS_j 的所有路径的概率总和,

  • 再乘上当前状态发出当前观测 oto_t 的概率。


🟡 第三步:终止

P(O∣λ)=∑i=1NαT(i)P(O|\lambda) = \sum_{i=1}^N \alpha_T(i)

所有在最后时刻可能处于的状态的前向概率的总和,就是观测序列的总概率。


✅ 示例(小模型)

假设有两个状态 S1,S2S_1, S_2,一个观测序列 O={o1,o2}O = \{o_1, o_2\},我们就能通过上面的步骤,用表格或代码,快速算出 P(O∣λ)P(O|\lambda)。


🧠 为什么用前向算法而不是枚举路径?

因为枚举所有隐藏状态路径的组合是 指数级别 O(NT)O(N^T) 的计算复杂度。

而前向算法的动态规划方式将复杂度降为 O(N2T)O(N^2 T),效率高得多。


📌 总结公式

步骤 公式 含义
初始化 α1(i)=πibi(o1)\alpha_1(i) = \pi_i b_i(o_1) 初始时刻
递推 αt(j)=∑iαt−1(i)aijbj(ot)\alpha_t(j) = \sum_i \alpha_{t-1}(i) a_{ij} b_j(o_t) 当前步依赖前一步
终止 P(O)=∑iαT(i)P(O) = \sum_i \alpha_T(i) 最终概率和

如果你想要:

✅ 图示解释

✅ Python 实现

✅ 和后向算法/EM算法联合讲解

✅ 应用于语音识别、信息抽取

我可以继续扩展~要不要演示下一个例子?