基于Lloyd算法的通用功率码生成及码本优化程序
项目介绍
本项目实现了一套基于通用Lloyd算法(Voronoi迭代)的量化码本优化方案。该程序的核心目标是在非均匀分布的数据集中,通过数学迭代的方式寻找一组最优的码字(Codewords),使得量化后的平均失真(均方误差 MSE)达到最小。Lloyd算法是矢量量化(VQ)和聚类分析中的经典算法,广泛应用于信号处理、非均匀量化器设计以及无线通信中的星座图重塑。
功能特性
- 非均匀分布建模:内置混合高斯分布(GMM)模拟非均分布数据,能够处理复杂的信号统计特性。
- 自动化特征优化:通过分区与质心更新两步循环,自动调整码字位置。
- 健壮性处理:具备空胞腔(Empty Cell)自愈功能,当某个码字未分配到任何样本时,程序会随机重新初始化该码字至数据密集区。
- 多维数据支持:虽然示例采用2D平面信号,但算法逻辑支持更高维度的矢量量化。
- 可视化分析:实时生成MSE下降曲线及带有Voronoi边界的码字分布图,直观展现收敛过程。
系统要求
- 软件版本:MATLAB R2016b 及以上版本。
- 工具箱需求:基础MATLAB环境(主要使用内置的矩阵运算、绘图函数及voronoi函数)。
实现逻辑与算法流程
程序严格遵循Lloyd-Max迭代逻辑,执行步骤如下:
- 数据生成阶段
程序首先创建一个包含10,000个样本的训练集。该数据集由两个均值分别为[2, 2]和[-2, -2]的高斯分布簇合并而成,权重比例为6:4,通过设置固定随机数种子保证了实验的可重复性。
- 码本初始化
从训练样本中随机选取16个点作为初始码字。这种基于样本的初始化方法比完全随机初始化具有更快的收敛速度。
- 核心迭代循环(Lloyd-Max)
*
分区步骤(Voronoi Partitioning):计算每个训练样本到当前码本中所有码字的欧氏距离平方,根据最近邻原则将每个样本归入对应的沃罗诺伊区域。
*
统计失真计算:计算当前迭代下所有样本到其所属码字的平均距离,即当前均方误差(MSE)。
*
质心更新步骤(Centroid Update):针对每一个沃罗诺伊区域,重新计算该区域内所有样本点的统计均值,以此均值作为该区域的新码字。
*
异常处理:若某个区域在划分中没有分配到样本点,程序将从原始数据集中随机抽取一个样本点来替换该空码字,防止迭代崩溃。
- 收敛判定
程序通过监测连续两次迭代之间MSE的变化率来判断是否平衡。当变化率低于设定阈值(1e-7)或达到最大迭代次数(100次)时,算法终止。
- 概率统计与结果评估
迭代结束后,程序计算每个码字在整个数据分布中所占的经验概率(即落入该区域的样本数占总样本数的比例),这对于后续计算熵值或信息速率具有参考意义。
关键实现细节分析
- 距离度量逻辑:程序采用二范数的平方作为失真测度。在分区过程中,通过矩阵运算(training_data - codebook(i, :))高效计算大规模样本到码字的距离。
- Voronoi几何表示:利用MATLAB的voronoi函数绘制决策边界,揭示了量化器在信号空间中的非均匀划分细节。
- 统计输出:除了图形输出,程序还会在命令行打印最终的优化码书矩阵、各码字的统计概率分布以及最终的收敛MSE值。
使用方法
- 打开MATLAB软件。
- 将程序代码复制并保存为后缀为.m的文件。
- 点击运行按钮或在命令行窗口键入该文件名后回车。
- 程序运行结束后,将自动弹出优化过程的图形窗口,并并在命令行显示最终的码本数据。