基于ORL人脸库的主成份分析与线性判别分析对比实验项目
项目背景与介绍
本项目是专门针对机器学习课程教学开发的实践案例,旨在通过对经典降维算法的底层实现,帮助学习者掌握特征工程的核心逻辑。项目以经典的ORL人脸数据库为实验环境,系统性地实现了主成分分析(PCA)与线性判别分析(LDA)两种特征提取方法。
相比于直接调研工具箱函数,本项目强调对数学原理的深度复现,通过详尽的中文注释阐述了矩阵分解、散度矩阵构建以及特征投影的物理意义。项目通过集成朴素贝叶斯分类器,直观地展示了无监督学习(PCA)与有监督学习(LDA)在处理高维生物识别数据时的性能差异,是初学者理解线性降维与分类模型协作的理想参考资料。
核心功能特性
- 逐行详细中文注释:针对算法中的每一个数学步骤(如中心化、协方差矩阵优化计算等)均配有原理说明,适合教学演示。
- 参数化降维控制:允许用户通过修改特定数值直接指定保留的特征向量个数,便于观察特征维数对分类准确率的直接影响。
- 优化的PCA实现:针对图像数据维度极高(112x92像素)的特点,采用了低秩分解技巧,通过处理小维度的内积矩阵来间接获取高维空间的特征向量,显著降低了计算开销。
- 鲁棒的LDA流程:在执行LDA之前加入了PCA预降维环节,有效解决了类内散度矩阵在小样本情况下容易产生的奇异性(不满秩)问题。
- 手动实现的朴素贝叶斯:未使用内置函数,而是基于高斯分布假设手动计算类别的均值、方差及后验概率,完整展现了统计学习的预测逻辑。
逻辑实现流程
- 数据模拟与预处理:程序首先初始化ORL数据库仿真模型,将400个样本(40人,每人10张图)展开为10304维的向量,并按照每人5张训练、5张测试的比例划分数据集。
- PCA特征提取:
- 对训练数据进行中心化处理,移除均值背景。
- 利用内积矩阵技巧求解特征值与特征向量,并按特征值大小进行降序排列。
- 选取前若干个主成分构建投影矩阵,将原始图像投影至低维空间。
- LDA特征提取:
- 为了保证数值稳定性,首先利用PCA将维度预压缩至样本数与类别数之差。
- 在预处理后的空间中,分别计算所有样本的全局均值以及各个类别的类内均值。
- 构建类内散度矩阵(Sw)与类间散度矩阵(Sb)。
- 通过求解广义特征值问题(Sb * v = lambda * Sw * v)寻找最具辨别力的投影方向。
- 分类器训练与预测:
- 构建朴素贝叶斯函数,计算降维特征在各个类别下的先验概率和高斯分布参数(均值与方差)。
- 在测试阶段,通过对数似然累加的方式防止数值溢出,计算测试样本属于各类的概率,取最大值作为预测结果。
- 结果可视化:
- 自动生成对比柱状图,显示PCA与LDA在相同维数下的识别准确率。
- 绘制“特征脸”图像,将抽象的PCA特征向量重新调整为图像尺寸进行可视化展示,帮助用户理解特征的物理形态。
关键算法实现细节分析
- 维数选择策略:项目通过变量明确定义了降维后的数值,这种硬性指定而非比例指定的方式,使得实验在对比不同算法在相同信息密度下的表现时更具可控性。
- 线性判别准则:在LDA实现中,算法试图寻找一个方向,使得同类样本的投影点尽可能接近(减少类内散度),而不同类别样本的中心点尽可能远离(增加类间散度)。
- 朴素贝叶斯独立假设:分类器假设降维后的特征各维度之间相互独立,通过计算每一维特征在特定类别下的高斯概率密度并相乘(实际实现中采用对数相加)来得到最终分值。
- 数值偏移处理:在计算方差时,代码引入了极小的偏移量(1e-6),确保在特征方差极小时不会出现除以零的计算错误。
使用指南
- 环境配置:建议在MATLAB R2018a或更高版本环境下运行。
- 参数调整:用户可以在脚本顶部的参数设置区修改目标降维维度或每人提取的训练样本数。
- 运行实验:直接启动主程序,命令行将实时显示当前正在执行的降维算法阶段。
- 结果查看:实验结束后,程序会自动弹出两张结果图表,一张为准确率对比直方图,另一张为展示PCA前四个主成分的特征脸缩略图。
系统要求
- 软件:具备基础矩阵运算能力的MATLAB环境。
- 硬件:标准开发笔记本即可,由于PCA部分采用了计算优化,内存占用较低。
- 数据集:程序内置了ORL数据的模拟生成逻辑,无需外部导入即可直接运行演示。
---
结论:通过本实验可以观察到,LDA作为有监督方法,由于利用了类别标签信息,在低维空间通常能比无监督的PCA展现出更优的分类性能。