KSVD_Matlab_ToolBox
项目介绍
本项目是针对 Michael Elad 教授的经典论文《The K-SVD: An Algorithm for Designing of Overcomplete Dictionaries for Sparse Representation》所开发的 MATLAB 算法库。K-SVD 是一种高效的迭代算法,专门用于设计过完备字典以实现信号的稀疏表示。其核心目标是通过交替优化稀疏系数和字典原子,使信号在给定稀疏度约束下的重构误差达到最小。该工具箱提供了从合成数据生成、字典学习到结果分析的完整仿真环境。
功能特性
- 完整的迭代流程:实现了 K-SVD 的两个核心步骤——稀疏编码与字典原子逐一更新。
- 自适应字典学习:能够从原始观测数据中自动学习出比传统 DCT 或小波基更具代表性的特征基。
- 内置数据仿真:提供合成数据生成模块,方便验证算法在已知真实字典情况下的恢复能力。
- 鲁棒性处理:包含原子替换机制,能自动处理训练过程中出现的死原子(未被使用的原子)。
- 多维度可视化:支持学习曲线实时监控、字典原子图像化展示以及信号重构效果对比。
系统要求
- MATLAB R2016b 或更高版本。
- 无需额外工具箱,核心算法均采用原生 MATLAB 矩阵运算实现。
使用方法
- 在 MATLAB 中打开项目根目录。
- 运行主仿真函数。
- 程序将自动配置仿真参数:信号维度为 64(对应 8x8 图像块),字典大小为 128,稀疏度为 4。
- 观察命令行窗口输出的实时重构误差(RMSE)。
- 迭代完成后,系统会自动弹出三个图窗:
- 重构误差随迭代次数的变化曲线。
- 原始生成字典与学习后字典的原子对比图。
- 随机选取的原始信号与重构信号对比图。
实现逻辑与功能细节说明
本项目的核心算法逻辑通过以下模块化流程实现:
- 环境与数据初始化
- 创建一个 $64 times 128$ 的随机过完备字典,并对其列进行归一化。
- 构造 1000 个训练信号,每个信号由字典中随机选取的 4 个原子线性组合而成,并加入适量高斯白噪声。
- 初始字典通过从观测信号中随机抽取样本并进行单位化来构建。
- 稀疏编码阶段
- 固定当前字典,针对每一个观测信号,利用正交匹配追踪算法寻找其对应的稀疏系数向量。
- 编码过程受限于预设的最大非零系数个数(稀疏度)。
- 字典与系数更新阶段
- 采用逐列更新策略,遍历字典中的每一个原子。
-
支持集筛选:仅考虑那些利用了当前被更新原子的信号列及其对应的残差。
-
残差计算:通过剔除当前原子的贡献,计算不含该原子时的信号逼近误差矩阵。
-
SVD 优化:对上述误差矩阵进行经济型奇异值分解(SVD)。取左奇异向量的第一列作为更新后的字典原子,取第一个奇异值与右奇异向量的乘积作为更新后的非零稀疏系数。这一步确保了字典更新的同时优化了稀疏系数,且不改变原有的稀疏模式。
- 异常字典处理
- 逻辑中包含检测机制。若某个原子在稀疏编码阶段未被任何信号使用,算法会从输入信号中随机选取一个信号并归一化,将其作为该位置的新原子,防止字典退化。
关键算法与函数分析
- 正交匹配追踪 (OMP):这是一种贪婪搜索算法。在每步迭代中,计算字典原子与当前残差的绝对相关度,选取相关度最高的原子进入活动集。随后利用最小二乘法在已选原子子空间上投影以更新系统系数,并刷新残差直至达到稀疏度限制。
- 重构误差度量:使用 Frobenius 范数计算观测信号与字典/系数乘积之间的差异,并归一化为均方根误差(RMSE),以此作为算法收敛性的评判标准。
- 可视化转换:由于训练信号维度为 64,算法将原子重塑为 8x8 的正方形补丁进行拼图显示。通过对原子能量进行归一化处理,使得学习到的边缘、点等特征能在灰度图中清晰呈现。