前向概率与隐马尔可夫模型的解码问题

embedded/2024/11/27 3:10:16/

前向概率与隐马尔可夫模型的解码问题

机器学习和信号处理领域,隐马尔可夫模型(HMM)是一种广泛应用于时间序列数据的统计模型。它不仅可以用于序列的生成,还可以用于序列的解码。本文将介绍前向概率和隐马尔可夫模型的解码问题,并通过示例和代码进行说明,最后探讨其在语音模型(如降噪模型)中的应用。

一、前向概率

前向概率是隐马尔可夫模型中的一个重要概念,用于计算在给定观测序列的情况下,某个状态序列的概率。具体来说,前向概率表示在时间点 t t t 时,系统处于状态 S t S_t St 的概率,考虑到从初始状态到当前状态的所有可能路径。

前向算法的原理

前向算法的核心在于利用动态规划的思想,通过递归关系来计算前向概率。我们定义前向概率 α t ( i ) \alpha_t(i) αt(i) 为在时刻 t t t 处于状态 S i S_i Si 的概率,给定观测序列 O = o 1 , o 2 , … , o t O = o_1, o_2, \ldots, o_t O=o1,o2,,ot

公式
  1. 初始化
    α 1 ( i ) = P ( S i ) ⋅ P ( o 1 ∣ S i ) \alpha_1(i) = P(S_i) \cdot P(o_1 | S_i) α1(i)=P(Si)P(o1Si)
    其中, P ( S i ) P(S_i) P(Si) 是初始状态概率, P ( o 1 ∣ S i ) P(o_1 | S_i) P(o1Si) 是在状态 S i S_i Si 下生成观测 o 1 o_1 o1 的概率。

  2. 递归
    α t ( j ) = ∑ i = 1 N α t − 1 ( i ) ⋅ P ( S i → S j ) ⋅ P ( o t ∣ S j ) \alpha_t(j) = \sum_{i=1}^{N} \alpha_{t-1}(i) \cdot P(S_i \to S_j) \cdot P(o_t | S_j) αt(j)=i=1Nαt1(i)P(SiSj)P(otSj)
    其中, N N N 是状态的总数, P ( S i → S j ) P(S_i \to S_j) P(SiSj) 是从状态 S i S_i Si 转移到状态 S j S_j Sj 的概率, P ( o t ∣ S j ) P(o_t | S_j) P(otSj) 是在状态 S j S_j Sj 下生成观测 o t o_t ot 的概率。

  3. 归纳
    整个观测序列的概率为:
    P ( O ) = ∑ i = 1 N α T ( i ) P(O) = \sum_{i=1}^{N} \alpha_T(i) P(O)=i=1NαT(i)
    其中, T T T 是观测序列的长度。

示例

假设我们有一个简单的隐马尔可夫模型,用于天气预测。我们定义以下内容:

  • 状态集 S = { S 1 , S 2 } S = \{S_1, S_2\} S={S1,S2},其中 S 1 S_1 S1 表示“晴天”, S 2 S_2 S2 表示“雨天”。

  • 观测集 O = { o 1 , o 2 } O = \{o_1, o_2\} O={o1,o2},其中 o 1 o_1 o1 表示“走路”, o 2 o_2 o2 表示“看电影”。

  • 初始状态概率

    • P ( S 1 ) = 0.6 P(S_1) = 0.6 P(S1)=0.6(晴天的初始概率)
    • P ( S 2 ) = 0.4 P(S_2) = 0.4 P(S2)=0.4(雨天的初始概率)
  • 状态转移概率

    • P ( S 1 → S 1 ) = 0.7 P(S_1 \to S_1) = 0.7 P(S1S1)=0.7
    • P ( S 1 → S 2 ) = 0.3 P(S_1 \to S_2) = 0.3 P(S1S2)=0.3
    • P ( S 2 → S 1 ) = 0.4 P(S_2 \to S_1) = 0.4 P(S2S1)=0.4
    • P ( S 2 → S 2 ) = 0.6 P(S_2 \to S_2) = 0.6 P(S2S2)=0.6
  • 观测概率

    • P ( o 1 ∣ S 1 ) = 0.8 P(o_1 | S_1) = 0.8 P(o1S1)=0.8
    • P ( o 1 ∣ S 2 ) = 0.1 P(o_1 | S_2) = 0.1 P(o1S2)=0.1
    • P ( o 2 ∣ S 1 ) = 0.1 P(o_2 | S_1) = 0.1 P(o2S1)=0.1
    • P ( o 2 ∣ S 2 ) = 0.9 P(o_2 | S_2) = 0.9 P(o2S2)=0.9

我们要计算观测序列 O = [ o 1 , o 2 ] O = [o_1, o_2] O=[o1,o2] 的前向概率。

计算推导过程

  1. 初始化

    • 计算 t = 1 t=1 t=1 时的前向概率:
      α 1 ( S 1 ) = P ( S 1 ) ⋅ P ( o 1 ∣ S 1 ) = 0.6 ⋅ 0.8 = 0.48 \alpha_1(S_1) = P(S_1) \cdot P(o_1 | S_1) = 0.6 \cdot 0.8 = 0.48 α1(S1)=P(S1)P(o1S1)=0.60.8=0.48
      α 1 ( S 2 ) = P ( S 2 ) ⋅ P ( o 1 ∣ S 2 ) = 0.4 ⋅ 0.1 = 0.04 \alpha_1(S_2) = P(S_2) \cdot P(o_1 | S_2) = 0.4 \cdot 0.1 = 0.04 α1(S2)=P(S2)P(o1S2)=0.40.1=0.04
  2. 递归计算 t = 2 t=2 t=2):

    • 对于 S 1 S_1 S1
      α 2 ( S 1 ) = ∑ i = 1 2 α 1 ( S i ) ⋅ P ( S i → S 1 ) ⋅ P ( o 2 ∣ S 1 ) \alpha_2(S_1) = \sum_{i=1}^{2} \alpha_1(S_i) \cdot P(S_i \to S_1) \cdot P(o_2 | S_1) α2(S1)=i=12α1(Si)P(SiS1)P(o2S1)
      = α 1 ( S 1 ) ⋅ P ( S 1 → S 1 ) ⋅ P ( o 2 ∣ S 1 ) + α 1 ( S 2 ) ⋅ P ( S 2 → S 1 ) ⋅ P ( o 2 ∣ S 1 ) = \alpha_1(S_1) \cdot P(S_1 \to S_1) \cdot P(o_2 | S_1) + \alpha_1(S_2) \cdot P(S_2 \to S_1) \cdot P(o_2 | S_1) =α1(S1)P(S1S1)P(o2S1)+α1(S2)P(S2S1)P(o2S1)
      = 0.48 ⋅ 0.7 ⋅ 0.1 + 0.04 ⋅ 0.4 ⋅ 0.1 = 0.48 \cdot 0.7 \cdot 0.1 + 0.04 \cdot 0.4 \cdot 0.1 =0.480.70.1+0.040.40.1
      = 0.0336 + 0.0016 = 0.0352 = 0.0336 + 0.0016 = 0.0352 =0.0336+0.0016=0.0352

    • 对于 S 2 S_2 S2
      α 2 ( S 2 ) = ∑ i = 1 2 α 1 ( S i ) ⋅ P ( S i → S 2 ) ⋅ P ( o 2 ∣ S 2 ) \alpha_2(S_2) = \sum_{i=1}^{2} \alpha_1(S_i) \cdot P(S_i \to S_2) \cdot P(o_2 | S_2) α2(S2)=i=12α1(Si)P(SiS2)P(o2S2)
      = α 1 ( S 1 ) ⋅ P ( S 1 → S 2 ) ⋅ P ( o 2 ∣ S 2 ) + α 1 ( S 2 ) ⋅ P ( S 2 → S 2 ) ⋅ P ( o 2 ∣ S 2 ) = \alpha_1(S_1) \cdot P(S_1 \to S_2) \cdot P(o_2 | S_2) + \alpha_1(S_2) \cdot P(S_2 \to S_2) \cdot P(o_2 | S_2) =α1(S1)P(S1S2)P(o2S2)+α1(S2)P(S2S2)P(o2S2)
      = 0.48 ⋅ 0.3 ⋅ 0.1 + 0.04 ⋅ 0.6 ⋅ 0.9 = 0.48 \cdot 0.3 \cdot 0.1 + 0.04 \cdot 0.6 \cdot 0.9 =0.480.30.1+0.040.60.9
      = 0.0144 + 0.0216 = 0.036 = 0.0144 + 0.0216 = 0.036 =0.0144+0.0216=0.036

  3. 汇总前向概率
    P ( O ) = α 2 ( S 1 ) + α 2 ( S 2 ) = 0.0352 + 0.036 = 0.0712 P(O) = \alpha_2(S_1) + \alpha_2(S_2) = 0.0352 + 0.036 = 0.0712 P(O)=α2(S1)+α2(S2)=0.0352+0.036=0.0712

二、隐马尔可夫模型的解码问题

隐马尔可夫模型的解码问题是指在给定观测序列的情况下,寻找最可能的状态序列。通常使用维特比算法(Viterbi Algorithm)来解决。

维特比算法的原理

维特比算法的核心在于动态规划,通过递归关系计算每个状态的最大概率,并在最后回溯找到最优路径。

公式
  1. 初始化
    δ 1 ( i ) = P ( S i ) ⋅ P ( o 1 ∣ S i ) \delta_1(i) = P(S_i) \cdot P(o_1 | S_i) δ1(i)=P(Si)P(o1Si)
    其中, δ t ( i ) \delta_t(i) δt(i) 表示在时刻 t t t 处于状态 S i S_i Si 的最大概率。

  2. 递归计算
    δ t ( j ) = max ⁡ i ( δ t − 1 ( i ) ⋅ P ( S i → S j ) ) ⋅ P ( o t ∣ S j ) \delta_t(j) = \max_{i} \left( \delta_{t-1}(i) \cdot P(S_i \to S_j) \right) \cdot P(o_t | S_j) δt(j)=imax(δt1(i)P(SiSj))P(otSj)

  3. 终止
    找到最大概率并回溯状态序列:
    P ∗ = max ⁡ i δ T ( i ) P^* = \max_{i} \delta_T(i) P=imaxδT(i)

示例

继续使用上面的天气预测模型,假设我们观察到的序列是 O = [ o 1 , o 2 ] O = [o_1, o_2] O=[o1,o2](走路,看电影)。我们希望找到最可能的状态序列。

计算推导过程

  1. 初始化

    • 计算 t = 1 t=1 t=1 时的最大概率:
      δ 1 ( S 1 ) = P ( S 1 ) ⋅ P ( o 1 ∣ S 1 ) = 0.6 ⋅ 0.8 = 0.48 \delta_1(S_1) = P(S_1) \cdot P(o_1 | S_1) = 0.6 \cdot 0.8 = 0.48 δ1(S1)=P(S1)P(o1S1)=0.60.8=0.48
      δ 1 ( S 2 ) = P ( S 2 ) ⋅ P ( o 1 ∣ S 2 ) = 0.4 ⋅ 0.1 = 0.04 \delta_1(S_2) = P(S_2) \cdot P(o_1 | S_2) = 0.4 \cdot 0.1 = 0.04 δ1(S2)=P(S2)P(o1S2)=0.40.1=0.04
  2. 递归计算 t = 2 t=2 t=2):

    • 对于 S 1 S_1 S1
      δ 2 ( S 1 ) = max ⁡ i ( δ 1 ( S i ) ⋅ P ( S i → S 1 ) ) ⋅ P ( o 2 ∣ S 1 ) \delta_2(S_1) = \max_{i} \left( \delta_1(S_i) \cdot P(S_i \to S_1) \right) \cdot P(o_2 | S_1) δ2(S1)=imax(δ1(Si)P(SiS1))P(o2S1)
      = max ⁡ ( δ 1 ( S 1 ) ⋅ P ( S 1 → S 1 ) , δ 1 ( S 2 ) ⋅ P ( S 2 → S 1 ) ) ⋅ P ( o 2 ∣ S 1 ) = \max(\delta_1(S_1) \cdot P(S_1 \to S_1), \delta_1(S_2) \cdot P(S_2 \to S_1)) \cdot P(o_2 | S_1) =max(δ1(S1)P(S1S1),δ1(S2)P(S2S1))P(o2S1)
      = max ⁡ ( 0.48 ⋅ 0.7 , 0.04 ⋅ 0.4 ) ⋅ 0.1 = \max(0.48 \cdot 0.7, 0.04 \cdot 0.4) \cdot 0.1 =max(0.480.7,0.040.4)0.1
      = max ⁡ ( 0.336 , 0.016 ) ⋅ 0.1 = 0.0336 = \max(0.336, 0.016) \cdot 0.1 = 0.0336 =max(0.336,0.016)0.1=0.0336

    • 对于 S 2 S_2 S2
      δ 2 ( S 2 ) = max ⁡ i ( δ 1 ( S i ) ⋅ P ( S i → S 2 ) ) ⋅ P ( o 2 ∣ S 2 ) \delta_2(S_2) = \max_{i} \left( \delta_1(S_i) \cdot P(S_i \to S_2) \right) \cdot P(o_2 | S_2) δ2(S2)=imax(δ1(Si)P(SiS2))P(o2S2)
      = max ⁡ ( δ 1 ( S 1 ) ⋅ P ( S 1 → S 2 ) , δ 1 ( S 2 ) ⋅ P ( S 2 → S 2 ) ) ⋅ P ( o 2 ∣ S 2 ) = \max(\delta_1(S_1) \cdot P(S_1 \to S_2), \delta_1(S_2) \cdot P(S_2 \to S_2)) \cdot P(o_2 | S_2) =max(δ1(S1)P(S1S2),δ1(S2)P(S2S2))P(o2S2)
      = max ⁡ ( 0.48 ⋅ 0.3 , 0.04 ⋅ 0.6 ) ⋅ 0.9 = \max(0.48 \cdot 0.3, 0.04 \cdot 0.6) \cdot 0.9 =max(0.480.3,0.040.6)0.9
      = max ⁡ ( 0.144 , 0.024 ) ⋅ 0.9 = 0.1296 = \max(0.144, 0.024) \cdot 0.9 = 0.1296 =max(0.144,0.024)0.9=0.1296

  3. 终止

    • 计算最终的最大概率:
      P ∗ = max ⁡ ( δ 2 ( S 1 ) , δ 2 ( S 2 ) ) = max ⁡ ( 0.0336 , 0.1296 ) = 0.1296 P^* = \max(\delta_2(S_1), \delta_2(S_2)) = \max(0.0336, 0.1296) = 0.1296 P=max(δ2(S1),δ2(S2))=max(0.0336,0.1296)=0.1296
  4. 回溯

    • 通过记录路径,回溯找到最可能的状态序列。

Python代码实现

python">import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns# 定义模型参数
states = ['Sunny', 'Rainy']
observations = ['Walk', 'Shop']
initial_prob = np.array([0.6, 0.4])
transition_prob = np.array([[0.7, 0.3],[0.4, 0.6]])
emission_prob = np.array([[0.8, 0.1],[0.1, 0.9]])# 前向算法
def forward_algorithm(observations):n_states = len(states)n_observations = len(observations)# 初始化前向概率矩阵alpha = np.zeros((n_states, n_observations))# 初始化alpha[:, 0] = initial_prob * emission_prob[:, observations[0]]# 递归计算for t in range(1, n_observations):for j in range(n_states):alpha[j, t] = np.sum(alpha[:, t - 1] * transition_prob[:, j]) * emission_prob[j, observations[t]]return alpha# 维特比算法
def viterbi_algorithm(observations):n_states = len(states)n_observations = len(observations)# 初始化维特比矩阵和路径delta = np.zeros((n_states, n_observations))path = np.zeros((n_states, n_observations), dtype=int)# 初始化delta[:, 0] = initial_prob * emission_prob[:, observations[0]]# 递归计算for t in range(1, n_observations):for j in range(n_states):max_prob = -1max_state = -1for i in range(n_states):prob = delta[i, t - 1] * transition_prob[i, j]if prob > max_prob:max_prob = probmax_state = idelta[j, t] = max_prob * emission_prob[j, observations[t]]path[j, t] = max_state# 终止max_final_prob = np.max(delta[:, -1])best_last_state = np.argmax(delta[:, -1])# 回溯best_path = [best_last_state]for t in range(n_observations - 1, 0, -1):best_last_state = path[best_last_state, t]best_path.insert(0, best_last_state)return best_path, max_final_prob# 观测序列
obs_sequence = [0, 1]  # Walk, Shop# 计算前向概率
alpha = forward_algorithm(obs_sequence)# 可视化前向概率矩阵
plt.figure(figsize=(10, 6))
sns.heatmap(alpha, annot=True, fmt=".2f", cmap="YlGnBu", xticklabels=observations, yticklabels=states)
plt.title("Forward Probability Matrix")
plt.xlabel("Observations")
plt.ylabel("States")
plt.show()# 计算维特比算法
best_path, max_prob = viterbi_algorithm(obs_sequence)# 可视化维特比算法的结果
plt.figure(figsize=(8, 4))
plt.bar(states, [np.max(alpha[:, -1]) if i in best_path else 0 for i in range(len(states))],color=['blue' if i in best_path else 'gray' for i in range(len(states))])
plt.title("Viterbi Algorithm Result")
plt.xlabel("States")
plt.ylabel("Probability")
plt.xticks(ticks=np.arange(len(states)), labels=states)
plt.show()print("最可能的状态序列:", [states[i] for i in best_path])
print("最大概率:", max_prob)

三、在语音模型中的应用

隐马尔可夫模型在语音处理领域,尤其是在降噪模型中,具有重要的应用。降噪模型旨在从嘈杂的音频信号中恢复清晰的语音信号。HMM 可以用于建模语音信号的时序特性,帮助识别和分离语音与噪声。

应用示例

  1. 语音识别:HMM 可以用于建模语音信号的不同状态(如发音的不同阶段),并通过前向算法计算观测序列的概率,从而识别语音内容。
  2. 降噪处理:在降噪模型中,HMM 可以用于建模干净语音和噪声的状态,通过解码问题找到最可能的干净语音状态序列,从而去除背景噪声。

http://www.ppmy.cn/embedded/140802.html

相关文章

sklearn中常用数据集简介

scikit-learn库中提供了包括分类、回归、聚类、降维等多种机器学习任务所需的常用数据集,方便进行实验和研究,它们主要被封装在sklearn.datasets中,本文对其中一些常用的数据集进行简单的介绍。 1.Iris(鸢尾花)数据集…

MySql.2

sql查询语句执行过程 SQL 查询语句的执行过程是一个复杂的过程,涉及多个步骤。以下是典型的关系数据库管理系统 (RDBMS) 中 SQL 查询语句的执行过程概述: 1. ‌客户端发送查询‌ 用户通过 SQL 客户端或应用程序发送 SQL 查询语句给数据库服务器。 2. ‌…

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…

【ONE·基础算法 || 动态规划(二)】

总言 主要内容:编程题举例,熟悉理解动态规划类题型(子数组、子序列问题)。                文章目录 总言5、子数组问题(数组中连续的一段)5.1、最大子数组和(medium)5.1.…

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中,科技的力量正日益凸显。其中,移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能,成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式,更为农业生产带来了高效、精…

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…

Vercel 设置自动部署 GitHub 项目

Vercel 设置自动部署 GitHub 项目 问题背景 最近 Vercel 调整了其部署政策,免费版用户无法继续使用自动部署功能,除非升级到 Pro 计划。但是,我们可以通过配置 Deploy Hooks 来实现同样的自动部署效果。 解决方案 通过设置 Vercel 的 Dep…

vue2中的this.$el,this.$parent,this.$children 在vue3中如何表示

今天在从vue2升级vue3的时候&#xff0c;遇到了这个问题&#xff0c;下面说一下这些怎么表示 vue2中的this.$el其实就是获取当前的组件节点&#xff0c;让我们来看一下代码和输出 在vue2中我们有组件&#xff1a; <template><div class"aaa"><div …