基于SPXY与KS算法的近红外光谱样本划分工具箱
项目介绍
本项目是一套基于MATLAB开发的近红外光谱(NIR)样本自动划分系统。针对化学计量学建模中训练集(校正集)与测试集(验证集)分配不均可能导致模型性能下降的问题,本项目实现了两种经典的样本选择算法:Kennard-Stone (KS) 算法和SPXY算法,并提供了随机划分(Random Selection)作为对照。
该工具箱集成了数据模拟、核心划分算法、统计分析以及多维可视化功能。通过科学的样本划分,可以确保训练集在光谱特征空间和理化性质空间中均具有良好的代表性,从而提高后续回归模型的预测精度及鲁棒性。
功能特性
- 内置数据模拟引擎:无需外部数据即可运行,代码内部自动生成包含高斯峰、基线漂移和噪声的模拟近红外光谱数据(X)及对应的理化性质(Y)。
- 多样化划分策略:
*
Random Selection:随机抽样,作为基准对照。
*
Kennard-Stone (KS) 算法:基于光谱空间(X变量)欧氏距离的最大相异性选择,确保训练集覆盖最大的光谱变异范围。
*
SPXY 算法:基于光谱特征(X)与理化性质(Y)的联合距离,同时兼顾光谱分布和目标属性分布的均匀性。
*
原始数据概览:展示模拟光谱波形图及理化性质直方图。
*
PCA空间分布图:利用主成分分析(PCA)将高维光谱降维,在二维平面直观展示训练集与测试集的空间分布覆盖情况。
*
分布一致性评估:通过直方图对比训练集与测试集的Y值分布,并动态计算均值、标准差、极值范围等统计指标进行量化评估。
- 自动化统计分析:自动计算各划分集合的统计学指标,辅助用户判断划分的合理性。
main.m 实现逻辑分析
本项目的核心逻辑全部主要集中在 main.m 脚本中,程序执行流程如下:
1. 数据准备 (Data Preparation)
程序首先生成模拟数据,以确保代码的可移植性和直接运行能力。
- 光谱生成 (X):创建200个样本,每个样本包含400个波长点。光谱由基线漂移(随机斜率)、三个不同位置和宽度的混合高斯峰以及随机噪声叠加而成。
- 性质生成 (Y):理化性质值基于特定波长处(峰1和峰2)的峰高线性组合生成,并加入随机扰动,模拟真实的“光谱-性质”相关性。
2. 参数设置与预处理
- 设定固定的随机种子(
rng),确保结果可复现。 - 定义训练集占比(默认为 0.75,即 3:1 划分),自动计算训练集和测试集的样本数量。
3. 核心算法实现
程序内部实现了三个核心处理模块:
* 利用 MATLAB 的
randperm 函数生成随机索引序列,直接截取指定数量的样本作为训练集,其余为测试集。
- Kennard-Stone (KS) 算法 (
alg_KS 函数)
*
距离计算:计算全体样本在X空间的欧氏距离矩阵。
*
初始点选择:选取距离矩阵中距离最远的两个样本作为初始训练集样本,确定边界。
*
迭代选择:采用“最大最小(MaxMin)”原则,在通过循环迭代中,对于每一个未入选的候选样本,先计算其到当前训练集中所有样本的最小距离;然后在这些最小距离中找到最大值对应的样本加入训练集。此过程保证了新选入的样本在空间上尽可能远离已选样本。
*
联合距离构建:作为KS算法的改进版,该函数分别计算X空间距离矩阵和Y空间距离矩阵。
*
标准化处理:为了消除X和Y量纲不同带来的权重差异,算法将两个距离矩阵分别除以其各自矩阵中的最大值进行归一化。
*
加和与选择:将归一化后的X距离与Y距离相加得到联合距离矩阵 ($D_{xy} = D_{x,norm} + D_{y,norm}$),随后的样本选择逻辑与KS算法完全一致(基于 $D_{xy}$ 执行 MaxMin 迭代)。
4. 结果可视化 (Visualization)
程序运行结束后会自动生成三个图形窗口:
* 左图绘制所有样本的近红外光谱曲线,展示模拟的吸光度变化。
* 右图使用直方图展示样本理化性质(Y值)的整体分布情况。
* 对标准化后的光谱数据进行PCA降维,提取前两个主成分(PC1, PC2)。
* 绘制三个子图,分别对应 Random、KS 和 SPXY 算法。
* 在PCA散点图中,使用不同颜色和标记(红色圆形为测试集,蓝色三角形为训练集)区分样本,直观展示算法是否在这个降维后的二维空间内均匀选取了样本。
* 采用 3x2 的子图布局。
* 左侧列绘制重叠直方图,直观对比训练集(蓝色)和测试集(红色)在Y值上的频率分布。
* 右侧列以文本形式列出详细的统计指标(均值 Mean、标准差 Std、范围 Range),方便用户精确对比两个集合的统计特性。
使用方法
- 环境准备:确保安装了 MATLAB 软件,并安装了 Statistics and Machine Learning Toolbox(用于
pdist2、pca、zscore 等函数)。 - 直接运行:在 MATLAB 编辑器中打开脚本文件,点击“运行”按钮或在命令行输入主函数名
main 即可。 - 结果解读:程序将自动清理工作区,生成模拟数据,执行计算并在屏幕上输出当前进度信息,最终弹出三个可视化窗口展示划分结果。
- 适配自定义数据:如需使用真实数据,仅需修改代码中“数据准备”部分,将
X 和 Y 变量替换为实际加载的矩阵数据即可(X 为 $n times m$ 光谱矩阵,Y 为 $n times 1$ 性质向量)。
系统要求
- MATLAB R2016a 或更高版本。
- 需要 Statistics and Machine Learning Toolbox。