基于LGB算法的矢量量化随机初始码本训练系统
项目简介
本项目实现了一个基于Linde-Buzo-Gray (LGB) 算法(也称为广义Lloyd算法)的矢量量化(Vector Quantization, VQ)码本训练演示系统。该系统旨在通过迭代优化过程,设计一个能够最小化平均量化失真的码本。
与通过分裂法初始化的LGB变体不同,本项目采用了随机选择策略进行码本初始化,即直接从训练数据集中随机抽取样本作为初始码字。这一策略实现简便,能够确保初始码字位于样本分布空间内。系统配备了完整的数据生成、训练迭代、收敛检测以及结果可视化模块,直观地展示了高维数据(演示为2D)如何被量化为有限的离散状态。
功能特性
- 模拟数据生成:内置高斯混合模型(GMM),能够生成具有多个聚类中心的模拟训练数据,用于验证量化算法的有效性。
- 随机初始化策略:实现了从大规模训练集中随机抽取指定数量矢量作为初始码本的逻辑。
- LGB迭代优化:包含完整的编码(最近邻划分)与更新(质心计算)循环,直至算法收敛。
- 高效距离计算:利用矩阵运算优化欧氏距离计算过程,加速最近邻搜索。
- 自动收敛检测:基于相对失真改进量(Relative Improvement)自动判断迭代终止条件。
- 可视化分析:提供双子图可视化,分别展示数据分布与码字移动轨迹,以及量化失真的收敛曲线。
系统要求
- MATLAB R2016a 或更高版本
- 不需要额外的工具箱(代码仅使用MATLAB基础函数)
使用方法
- 将代码保存至本地环境。
- 在MATLAB中打开脚本文件。
- 直接运行主函数。
- 程序将在控制台输出每次迭代的MSE(均方误差)和相对改进率,并在运行结束后弹出可视化窗口。
详细实现逻辑与算法分析
本项目的主程序严格遵循以下逻辑流程:
1. 环境初始化与参数配置
程序首先清理工作区并设置随机数种子(Seed=42),以确保训练结果的可复现性。配置的核心参数包括:
- 训练样本数:4000
- 矢量维度:2(支持高维,但可视化仅展示前两维)
- 目标码本尺寸:16
- 最大迭代次数:100
- 收敛阈值(Epsilon):1e-5
2. 数据集准备
系统调用数据生成函数,构建一个包含5个主要聚类中心的高斯混合分布数据集。数据在生成后会被随机打乱,模拟真实的非均匀分布数据源。
3. 码本初始化(Random Selection)
不同于分裂法,本实现在启动阶段直接使用
randperm 函数从4000个训练样本中随机抽取16个唯一的样本点。这些样本点直接构成了第0次迭代的初始码本。
4. 核心迭代循环(LGB算法)
系统进入
while 循环,直到达到最大迭代次数或满足收敛条件:
计算所有训练样本与当前码本中16个码字之间的欧氏距离。根据最近邻原则(Nearest Neighbor Rule),将每个样本分配给距离最近的码字,从而将样本空间划分为16个Voronoi区域。
*实现细节*:距离计算采用了矩阵展开公式 $||x-c||^2 = ||x||^2 + ||c||^2 - 2x^Tc$ 进行向量化加速。
计算当前的平均量化失真(即所有样本到其归属码字的最小平方距离的均值,MSE)。
计算相对改进量:$(上一次失真 - 当前失真) / 上一次失真$。
如果相对改进量小于设定的阈值(1e-5),则判定算法收敛,跳出循环。
根据划分结果,计算每个Voronoi区域内所有样本的算术平均值(质心),将该均值作为下一次迭代的新码字位置。
*异常处理*:如果某个码字在划分中没有分配到任何样本(空胞腔),系统采用的原地保留策略,即新码字位置保持与旧码字一致,不进行移动。
5. 结果可视化
训练结束后,通过图形界面展示结果:
- 左图:展示原始数据的散点分布。使用灰色点表示样本,蓝色圆点表示初始随机选择的码字,红色方块表示训练收敛后的最终码字。这直观展示了码字如何从随机位置移动到数据簇的中心。
- 右图:绘制MSE随迭代次数变化的曲线。并在图中标注最终的MSE值,展示算法的下降收敛特性。
关键函数说明
main
主控函数,负责参数定义、流程控制、迭代循环管理以及日志输出。
generate_synthetic_data
负责生成模拟数据。它定义了5个固定的中心点,并在这些中心周围添加随机高斯噪声来生成数据簇。如果维度大于2,会自动扩展中心坐标。
find_nearest_centroids
高性能的核心计算函数。输入数据矩阵和码本矩阵,输出每个样本对应的最近码字索引和最小距离。该函数利用了 bsxfun(或隐式扩展)和矩阵乘法来避免低效的 for 循环计算距离。
visualize_results
绘图函数。负责创建图形窗口,绘制数据分布散点图、初始/最终码字位置对比图,以及失真收敛趋势图。它还负责为不同簇的样本点可以进行逻辑上的区分(虽然主要以灰色显示背景)。