基于监督NPE的子空间降维算法实现
项目简介
本项目实现了一种增强型的子空间学习算法——监督邻域保持嵌入(Supervised Neighborhood Preserving Embedding, S-NPE)。该算法旨在解决高维数据的特征提取与降维问题,特别适用于分类任务。
传统的NPE算法作为无监督流形学习方法,虽然能够保留数据的局部几何结构,但在缺乏类别信息引导的情况下,提取的特征往往缺乏足够的判别力。本项目通过引入样本的类别标签信息,改进了邻接图构建和权重计算过程,使其能够最大化类间距离同时保持同类样本的局部线性重构关系。
功能特性
- 高维数据模拟:内置高维合成数据集生成器,能够生成具有特定流形结构(如线性簇、非线性扭曲簇)的数据。
- 监督邻域构建:在构建近邻图时利用标签信息,强制仅在同类样本中寻找最近邻,增强了局部结构的纯度。
- 子空间特征学习:通过求解广义特征值问题,获得能够保持判别性局部结构的最优投影矩阵。
- 算法对比分析:集成了传统的PCA(主成分分析)算法作为基准,直观对比监督算法与无监督算法的差异。
- 可视化展示:提供降维后的2D散点图对比以及特征值谱图,直观展示聚类效果和能量分布。
- 量化评估:内置基于KNN分类器的评估模块,计算并对比原始空间、PCA空间及S-NPE空间的分类准确率。
系统要求
- MATLAB R2016a 或更高版本
- Statistics and Machine Learning Toolbox(用于
gscatter 绘图及统计功能)
使用方法
- 确保MATLAB路径中包含本项目脚本。
- 直接运行主函数即可启动流程。
- 程序将依次执行:数据生成 -> S-NPE降维 -> PCA降维 -> 结果可视化 -> 精度评测。
- 运行结束后,控制台将输出各阶段的分类准确率,并弹出包含对比图表的图形窗口。
代码实现逻辑详解
本项目的主逻辑分为四个主要步骤,严格遵循以下流程:
1. 环境初始化与数据生成
- 程序首先清理工作区并设置固定随机种子(42),以确保实验结果的可复现性。
- 生成D=100维的高维数据,包含3个类别,每类60个样本。
*
类别1:基于高斯分布生成的线性簇。
*
类别2:在随机基底上添加了正弦函数非线性扭曲和位移。
*
类别3:具有特定稀疏偏移特征的类簇。
- 所有数据在进入算法前均经过零均值化(Zero-mean)预处理。
2. S-NPE 算法执行与对比计算
- 调用核心算法函数
run_super_npe,传入归一化后的数据、标签、近邻数(K=8)和目标维度(d=2)。 - 作为对比,利用SVD分解计算标准PCA投影,提取前2个主成分作为基准降维结果。
3. 多维可视化
*
子图1:展示PCA降维后的数据分布,通常类间混叠较多。
*
子图2:展示S-NPE降维后的数据分布,验证同类样本的聚集程度和异类样本的分离度。
*
子图3:绘制S-NPE求解过程中的前20个广义特征值谱,用于分析子空间的结构特征。
4. 性能评估(KNN分类准确率)
- 使用1最近邻(1-NN)分类器对降维效果进行量化。
- 采用70%训练集、30%测试集的随机划分策略。
- 分别计算并输出以下三种情况的分类准确率:
1. 原始100维高维空间。
2. PCA降维后的2维子空间。
3. S-NPE降维后的2维子空间。
关键算法与实现细节
核心函数:run_super_npe
该函数实现了S-NPE算法的核心数学推导,具体步骤如下:
- 构建监督邻接图:
与传统NPE不同,该实现在寻找每个样本 $x_i$ 的 $K$ 个近邻时,首先根据
labels 筛选出同类样本,仅在同类样本集合中计算欧氏距离并选取最近邻。这确保了局部重构关系完全基于同类信息。
- 局部权重优化:
对于每个样本,计算其由同类近邻线性重构的权重系数。
* 构造局部Gram矩阵 $G = Z^T Z$,其中 $Z$ 为邻居节点与中心节点的差值。
* 为了防止 $G$ 矩阵奇异(即不可逆),代码中加入了一个微小的正则化项:$G + I times 10^{-3} times trace(G)$。
* 通过求解线性方程组 $G backslash mathbf{1}$ 并归一化,得到权重向量。
- 矩阵构建:
* 计算稀疏权重矩阵 $W$。
* 计算中间矩阵 $M = (I - W)^T (I - W)$。
- 求解广义特征值问题:
算法将优化目标转换为求解广义特征值问题 $A v = lambda B v$。
*
矩阵 A:$X M X^T$,为了数值稳定性,代码强制对其进行了对称化处理 $(A + A^T)/2$。
*
矩阵 B:$X X^T$,同样进行了对称化处理,并加入了 $10^{-6}$ 的微小扰动以保证正定性,防止求解时出现数值不稳定。
* 使用
eig 函数求解,并取实部特征值。
- 投影与映射:
对特征值进行升序排序,丢弃可能的虚部,选取最小的 $d$ 个特征值对应的特征向量作为投影矩阵 $W_{proj}$。最后将数据投影到低维空间。
辅助函数:evaluate_knn
- 这是一个通用的评估模块,接受数据和标签。
- 它实现了简单的留出法(Hold-out)交叉验证。
- 对测试集中的每个样本,计算其与训练集中所有样本的距离,选取最近的 $k$ 个邻居进行多数投票(Mode),以此计算预测准确率。