MatlabCode

本站所有资源均为高质量资源,各种姿势下载。

您现在的位置是:MatlabCode > 资源下载 > 一般算法 > 基于局部保持投影的非监督降维人脸识别

基于局部保持投影的非监督降维人脸识别

资 源 简 介

本项目致力于实现一种高效的非监督线性降维算法——局部保持投影(Locality Preserving Projections, LPP)。LPP是经典流形学习算法拉普拉斯特征映射(Laplacian Eigenmap)的线性近似方法,它有效地结合了线性技术的计算优势与非线性流形学习的局部结构保持特性。项目的主要功能包括:首先对高维输入数据进行预处理及归一化;其次构建图模型来表示数据点的局部几何结构,通过计算K近邻(KNN)或ε-邻域来确定样本间的连接关系,并利用热核函数或简单0-1权重构建邻接矩阵和拉普拉斯矩阵;接着通过求解广义特征值问题,计算出能最佳保持数据局部邻域关系的线性投影矩阵;最后将高维数据投影到低维子空间。该方法特别适用于高维人脸图像数据的特征提取,因为它能够捕捉到人脸流形的局部结构,对于表情、光照和姿态的变化具有比PCA(主成分分析)和LDA(线性判别分析)更好的鲁棒性。项目还将包含一个完整的人脸识别验证模块,用于对比LPP与其他降维算法的识别率性能,展示其在保留本质特征方面的优势。

详 情 说 明

基于局部保持投影(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 以支持 cvpartitioneigs 等函数)。
  • 使用方法
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_pcaX_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 个子图的综合界面:
  1. LPP 广义特征值分布:展示前 30 个特征值,观察流形结构的紧凑性。
  2. PCA 3D 投影:展示 PCA 降维后的前 3 维散点图。
  3. LPP 3D 投影:展示 LPP 降维后的前 3 维散点图,通常能观察到更好的类间分离度。
  4. 准确率对比曲线:绘制 PCA 和 LPP 随维度变化的识别率曲线。
  5. 文本总结:显示最佳识别率及性能提升百分比。

5. 关键算法与代码细节分析

run_lpp(X, k, sigma, out_dim)

这是 LPP 的核心实现函数:
  1. 邻接图构建:计算所有样本对的欧氏距离,对每个样本只保留最近的 $k$ 个邻居($k=7$)。
  2. 权重计算:使用热核函数 (Heat Kernel) $W_{ij} = e^{-frac{|x_i - x_j|^2}{2sigma^2}}$ 赋予权重,相比简单的 0-1 权重更能保留局部几何结构。
  3. 矩阵构建:计算度矩阵 $D$(行和)和拉普拉斯矩阵 $L = D - W$。
  4. 求解广义特征值问题
* 构造方程 $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)

  • 实现了一个基础的最近邻分类器。
  • 通过计算测试样本与所有训练样本的欧氏距离,将最近邻训练样本的标签赋给测试样本,直接反映降维后的特征是否具有良好的可分性。