什么是前向算法

前向算法(Forward Algorithm)

前向算法是一种动态规划算法,用于在隐马尔可夫模型(HMM)中计算给定观测序列的概率。这是 HMM 的第一个核心问题,即:在模型参数已知的情况下,计算一个观测序列 O = { o 1 , o 2 , … , o T } O = \{o_1, o_2, \dots, o_T\} O={o1,o2,,oT} 的概率 P ( O ∣ λ ) P(O \mid \lambda) P(Oλ),其中 λ \lambda λ 表示 HMM 的参数。

问题描述

我们想知道,在一个隐马尔可夫模型中,产生观测序列 O O O 的概率 P ( O ) P(O) P(O) 是多少。这个概率可以通过将所有可能的隐状态路径 Q = { q 1 , q 2 , … , q T } Q = \{q_1, q_2, \dots, q_T\} Q={q1,q2,,qT} 的联合概率求和得到:

P ( O ) = ∑ Q P ( O , Q ) P(O) = \sum_{Q} P(O, Q) P(O)=QP(O,Q)

但直接计算所有可能的隐状态路径的联合概率是非常困难的,因为隐状态数量随着时间步数呈指数增长(对于 N N N 个状态,路径数为 N T N^T NT)。


前向算法的思想

前向算法通过动态规划避免了对所有隐状态路径的穷举计算,显著降低了复杂度。它通过递归地计算“前向概率”,一步步将问题分解到更小的子问题。

前向概率定义

定义前向概率 α t ( i ) \alpha_t(i) αt(i) 为:
α t ( i ) = P ( O 1 , O 2 , … , O t , S t = s i ∣ λ ) \alpha_t(i) = P(O_1, O_2, \dots, O_t, S_t = s_i \mid \lambda) αt(i)=P(O1,O2,,Ot,St=siλ)
即,在时间 t t t 时,部分观测序列 O 1 , O 2 , … , O t O_1, O_2, \dots, O_t O1,O2,,Ot 以及隐状态为 S t = s i S_t = s_i St=si 的概率


递推公式

前向算法的递推过程可以分为以下三步:

1. 初始化

在时间 t = 1 t = 1 t=1,前向概率是:
α 1 ( i ) = π i ⋅ b i ( o 1 ) , ∀ i = 1 , 2 , … , N \alpha_1(i) = \pi_i \cdot b_i(o_1), \quad \forall i = 1, 2, \dots, N α1(i)=πibi(o1),i=1,2,,N
其中:

  • π i \pi_i πi 是初始状态分布,表示隐状态为 s i s_i si 的初始概率。
  • b i ( o 1 ) b_i(o_1) bi(o1) 是在隐状态 s i s_i si 下生成观测 o 1 o_1 o1 的概率。
2. 递推

对于 t = 2 , 3 , … , T t = 2, 3, \dots, T t=2,3,,T,前向概率通过以下公式递归计算:
α t ( j ) = [ ∑ i = 1 N α t − 1 ( i ) ⋅ a i j ] ⋅ b j ( o t ) , ∀ j = 1 , 2 , … , N \alpha_t(j) = \left[ \sum_{i=1}^N \alpha_{t-1}(i) \cdot a_{ij} \right] \cdot b_j(o_t), \quad \forall j = 1, 2, \dots, N αt(j)=[i=1Nαt1(i)aij]bj(ot),j=1,2,,N
其中:

  • α t − 1 ( i ) \alpha_{t-1}(i) αt1(i) 是时间 t − 1 t-1 t1 时隐状态为 s i s_i si 的前向概率。
  • a i j a_{ij} aij 是从隐状态 s i s_i si 转移到隐状态 s j s_j sj 的转移概率。
  • b j ( o t ) b_j(o_t) bj(ot) 是在隐状态 s j s_j sj 下生成观测 o t o_t ot 的概率。
3. 终止

在时间 t = T t = T t=T(观测序列的最后一个时刻),总的观测序列概率为:
P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) P(O \mid \lambda) = \sum_{i=1}^N \alpha_T(i) P(Oλ)=i=1NαT(i)
即,将所有隐状态在最后一个时间步的前向概率相加。


算法流程

假设:

  • N N N 是隐状态数量。
  • T T T 是观测序列长度。
  1. 输入:HMM 参数 λ = ( π , A , B ) \lambda = (\pi, A, B) λ=(π,A,B) 和观测序列 O O O
  2. 初始化
    α 1 ( i ) = π i ⋅ b i ( o 1 ) , ∀ i = 1 , 2 , … , N \alpha_1(i) = \pi_i \cdot b_i(o_1), \quad \forall i = 1, 2, \dots, N α1(i)=πibi(o1),i=1,2,,N
  3. 递推
    t = 2 , 3 , … , T t = 2, 3, \dots, T t=2,3,,T
    α t ( j ) = [ ∑ i = 1 N α t − 1 ( i ) ⋅ a i j ] ⋅ b j ( o t ) \alpha_t(j) = \left[ \sum_{i=1}^N \alpha_{t-1}(i) \cdot a_{ij} \right] \cdot b_j(o_t) αt(j)=[i=1Nαt1(i)aij]bj(ot)
  4. 终止
    P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) P(O \mid \lambda) = \sum_{i=1}^N \alpha_T(i) P(Oλ)=i=1NαT(i)
  5. 输出:观测序列的概率 P ( O ∣ λ ) P(O \mid \lambda) P(Oλ)

复杂度分析

  • 时间复杂度 O ( N 2 ⋅ T ) O(N^2 \cdot T) O(N2T),因为对于每个 t t t 和每个 j j j,我们需要对所有 i i i 求和。
  • 空间复杂度 O ( N ⋅ T ) O(N \cdot T) O(NT),存储每个时刻的前向概率。

相比于穷举所有隐状态路径(复杂度为 O ( N T ) O(N^T) O(NT)),前向算法大幅降低了计算复杂度。


应用场景

  1. 语音识别:评估一个观测序列(如音频信号)的生成概率,用于模式匹配。
  2. 自然语言处理:评估文本序列的可能性,例如词性标注中的概率计算。
  3. 生物信息学:分析基因序列,计算某个基因片段的出现概率。

总结

前向算法是 HMM 中的一个高效算法,用于计算给定观测序列的概率。它通过动态规划避免了对隐状态路径的穷举,使得问题在计算上变得可行。通过前向概率的递归计算,前向算法为许多实际问题的解决奠定了基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值