基于局部保持投影(LPP)的非监督降维人脸识别系统
1. 项目介绍
本项目实现了一种基于
局部保持投影 (Locality Preserving Projections, LPP) 的非监督人脸识别与数据降维分析系统。LPP 是一种经典的流形学习算法(拉普拉斯特征映射)的线性逼近方法,它通过寻找能够最佳保持数据局部邻域结构的投影方向,解决了传统 PCA(主成分分析)无法有效发现数据非线性流形结构的问题。
该系统在一个模拟的高维人脸流形数据集上运行,完整展示了从数据生成、预处理、图模型构建、特征提取到识别验证的全过程,并直观对比了 LPP 与 PCA 的性能差异。
2. 功能特性
- 高维流形数据模拟:内置数据生成器,模拟具有各向异性高斯分布和流形结构的高维人脸数据(模拟光照、姿态变化)。
- PCA 预处理机制:实现 PCA 降维以保留主要能量(98%),解决高维小样本情况下 LPP 矩阵奇异性问题。
- LPP 核心算法实现:基于邻接图和拉普拉斯矩阵的 LPP 算法,支持 K 近邻构图和热核函数权重计算。
- 多维度性能评估:自动评估不同子空间维度下的识别率,使用 K 近邻(KNN)分类器进行验证。
- 可视化分析平台:提供综合的可视化窗口,包含广义特征值分布、3D 空间投影对比(PCA vs LPP)以及准确率对比曲线。
3. 系统要求与使用方法
- 环境要求:MATLAB R2016a 及以上版本(需包含 Statistics and Machine Learning Toolbox 以支持
cvpartition 和 eigs 等函数)。 - 使用方法:
1. 直接运行
main 函数即可启动系统。
2. 程序将自动生成数据、训练模型并输出可视化结果图表。
3. 控制台将实时打印各阶段的处理进度和最终识别率对比结果。
4. 系统详细实现逻辑
系统的主程序
main 严格按照以下流程执行:
4.1 参数初始化与数据生成
- 初始化系统参数:样本总数 400,特征维数 1024,类别数 10,近邻数 $k=7$。
- 调用生成函数创建模拟数据,并按 7:3 的比例划分为训练集和测试集。
4.2 数据预处理 (PCA)
由于原始特征维数(1024)远大于类别样本数,直接计算 LPP 会导致矩阵奇异。程序首先对训练数据执行 PCA:
- 保留 98% 的主要能量。
- 将高维数据投影到 PCA 中间子空间,得到
X_train_pca 和 X_test_pca。 - 此步骤对应代码中提到的 He 等人提出的 LPP 标准处理流程。
4.3 局部保持投影 (LPP) 计算
在 PCA 投影后的数据上执行 LPP 算法:
- 构图:基于欧氏距离计算样本间的相似度。
- 投影矩阵:计算出 LPP 变换矩阵
LPP_map。 - 综合投影:构建最终的投影矩阵 $W_{total} = W_{pca} times W_{lpp}$,将数据从原始空间直接映射到最终的低维流形子空间。
4.4 识别性能评估
系统对降维后的数据进行分类测试,维度范围从 5 维到 30 维(步长为 5):
- 对比算法:LPP vs PCA(直接截取前 d 维)。
- 分类器:1-NN(一最近邻)分类器。
- 输出:分别记录两种算法在不同维度下的测试集识别准确率。
4.5 结果可视化
程序最后绘制一个包含 5 个子图的综合界面:
- LPP 广义特征值分布:展示前 30 个特征值,观察流形结构的紧凑性。
- PCA 3D 投影:展示 PCA 降维后的前 3 维散点图。
- LPP 3D 投影:展示 LPP 降维后的前 3 维散点图,通常能观察到更好的类间分离度。
- 准确率对比曲线:绘制 PCA 和 LPP 随维度变化的识别率曲线。
- 文本总结:显示最佳识别率及性能提升百分比。
5. 关键算法与代码细节分析
run_lpp(X, k, sigma, out_dim)
这是 LPP 的核心实现函数:
- 邻接图构建:计算所有样本对的欧氏距离,对每个样本只保留最近的 $k$ 个邻居($k=7$)。
- 权重计算:使用热核函数 (Heat Kernel) $W_{ij} = e^{-frac{|x_i - x_j|^2}{2sigma^2}}$ 赋予权重,相比简单的 0-1 权重更能保留局部几何结构。
- 矩阵构建:计算度矩阵 $D$(行和)和拉普拉斯矩阵 $L = D - W$。
- 求解广义特征值问题:
* 构造方程 $X L X^T a = lambda X D X^T a$。
* 为防止 $X D X^T$ 奇异,引入了正则化项
epsilon。
* 使用
eigs 求解最小的特征值对应的特征向量(排除接近 0 的最小特征值,因为其对应常数向量)。
run_pca(X, keep_ratio)
实现了标准的 PCA 算法,并针对高维小样本(Small Sample Size)问题进行了优化:
- 当特征维数大于样本数时,使用快照法(Snapshot Method),即先计算 $X X^T$ 的特征值,再推导 $X^T X$ 的特征向量,极大地减少了计算量。
- 支持按能量比例(如 0.98)自动确定保留的主成分数量。
generate_synthetic_data(params)
用于生成具有流形结构的数据:
- 在 1024 维空间中生成 10 个聚类中心。
- 每个类内的样本并非简单的高斯球状分布,而是沿着特定的非线性路径(由线性项 $t cdot v_1$ 和二次项 $t^2 cdot v_2$ 混合而成)分布,以此模拟人脸图像因光照或姿态变化形成的非线性流形。
knn_classify(Train_Data, Train_Label, Test_Data, Test_Label)
- 实现了一个基础的最近邻分类器。
- 通过计算测试样本与所有训练样本的欧氏距离,将最近邻训练样本的标签赋给测试样本,直接反映降维后的特征是否具有良好的可分性。