基于KSVD的字典学习与信号稀疏表示算法
项目介绍
本项目实现了基于K-SVD(K-Singular Value Decomposition)的字典学习算法。该算法是对传统K-means聚类算法的推广,旨在通过对训练样本的学习,构建一个能够高效表示信号特征的过完备字典。与预定义的离散余弦变换(DCT)或小波变换字典不同,K-SVD能够根据输入数据的统计特性自适应地更新字典原子,从而在图像去噪、压缩感知和信号重构等领域表现出更强的稀疏表示能力。
---
功能特性
- 全流程仿真验证:包含从模拟信号生成、含噪观测数据合成到字典学习及最终结果评估的完整闭环流程。
- 正交匹配追踪(OMP)集成:在稀疏编码阶段采用OMP算法,通过贪婪策略实现信号的快速、有效稀疏分解。
- 逐原子在线更新:字典更新阶段采用独特的逐原子(Column-by-column)优化策略,通过奇异值分解(SVD)同步优化字典原子及其对应的非零系数。
- 健壮性处理机制:代码包含针对“死原子”(即在迭代中未被执行任何信号表示的原子)的自编码处理,通过残差替换机制保证字典的高效性。
- 可视化评估指标:实时计算重构均方误差(MSE),并提供收敛曲线及原始信号与重构信号的对比图。
---
系统要求
- 软件环境:MATLAB R2016a 或更高版本。
- 硬件要求:基础办公配置即可,算法涉及大量矩阵运算,建议内存不低于 8GB。
- 工具箱依赖:无需外部第三方工具箱,仅依赖MATLAB内置的线性代数运算库(如svd, norm, randn等)。
---
使用方法
- 将算法脚本文件放置于MATLAB的当前工作路径下。
- 在MATLAB命令行窗口直接调用主函数名称并回车。
- 算法将自动开始执行20轮迭代。
- 程序运行结束后,将自动弹出绘图窗口,展示收敛过程和重构效果。
- 控制台中会实时打印每一轮迭代的MSE值以及最终的相对重构误差百分比。
---
详细实现逻辑
算法逻辑严格遵循K-SVD的数学框架,主要分为以下五个阶段:
1. 参数初始化与数据生成
- 维度定义:设置信号维度为20,训练样本数为512,字典原子数为50(构建过完备环境)。
- 真值构造:随机生成一个满足列归一化的真实字典,并根据指定的稀疏度(T=3)产生稀疏系数。
- 观测合成:将字典与系数相乘并加入标准差为0.01的高斯白噪声,模拟真实的训练环境。
2. 字典初始化
- 程序并未采用随机噪声初始化,而是从训练样本集中随机选取50个样本作为初始原子,并进行列归一化。这种方式往往能比随机初始化更快地引导模型进入收敛。
3. 稀疏编码模块 (基于OMP实现)
- 在固定的当前字典下,利用正交匹配追踪算法对每一个样本进行处理。
- 该模块通过不断寻找与当前残差相关性最大的原子,并利用最小二乘法进行投影更新,直至达到预设的稀疏度或残差阈值。
4. 字典更新模块 (核心KSVD逻辑)
- 迭代遍历:对字典中每一个原子进行顺序更新。
- 支持集筛选:仅关注那些使用了当前被更新原子的训练样本索引。
- 残差矩阵构造:计算去除当前原子贡献后的重构误差矩阵。
- SVD分解:对在该索引子集上的残差矩阵进行经济型奇异值分解(SVD)。
- 同步优化:取左奇异向量的第一列更新字典原子,取第一个奇异值与右奇异向量第一列的乘积直接更新该原子对应的非零稀疏系数。
5. 结果可视化与误差评估
- 计算Frobenius范数下的相对重构误差。
- 生成“迭代次数 vs MSE”的收敛曲线图。
- 绘制单个样本的“含噪信号”与“重构信号”对比曲线,展示算法对信号特征的恢复精度。
---
关键过程与细节分析
- 解决死原子问题:在字典更新阶段,如果某个原子没有被任何信号选中,算法逻辑会自动计算当前的全局重构残差,并从残差中提取能量最大的信号部分作为该原子的新值,确保了字典字典容量的有效利用。
- SVD的效率:字典更新阶段采用了基于索引子集的‘econ’型SVD。这意味着SVD仅在与该原子相关的样本子集上运行,避免了对全量512个样本的大矩阵运算,显著提升了单次迭代效率。
- 稀疏系数的保持性:在字典更新步骤中,不仅更新了字典原子,还同时修正了OMP找出的系数,这使得KSVD在每一轮迭代中都能最大限度地降低总残差,理论上保证了算法的收敛性。