机器学习——LDA(线性判别分析)与人脸识别

article/2025/11/10 14:20:18

    忆如完整项目/代码详见github:https://github.com/yiru1225(转载标明出处 勿白嫖 star for projects thanks)

目录

系列文章目录

一、LDA的概念与原理

1.LDA简介

2.LDA算法模型

3.LDA的不足与优化

二、LDA运用于人脸识别

1.预处理

1.1 数据导入与处理

1.2 算各类均值、类间散度Sb、类内散度Sw

2.LDA核心(构造目标函数并对其进行特征分解)

3.人脸识别

4.LDA与PCA图像降维与可视化对比

5.LDA与PCA的异同总结

6.其他

6.1 内部函数定义

6.2 数据集及资源

6.3 参考资料

总结


系列文章目录

本系列博客重点在机器学习的概念原理与代码实践,不包含繁琐的数学推导(有问题欢迎在评论区讨论指出,或直接私信联系我)

代码可以全抄    大家搞懂原理与流程去复现才是有意义的!!!
第一章 机器学习——PCA(主成分分析)与人脸识别_@李忆如的博客-CSDN博客

第二章 LDA与人脸识别


梗概

本篇博客主要介绍LDA(线性判别分析)算法并将LDA及其各种等价模型用于人脸的识别、图像降维可视化,并将LDA与PCA进行比较(内附数据集与matlab代码)


一、LDA的概念与原理

1.LDA简介

LDA(线性判别分析)为主流的一种线性降维算法。以”最小化类内方差,最大化类间方差“为目标导向,通过降维(投影),达到降维的目的更好地将样本分类。

2.LDA算法模型

经典的LDA解决问题可划分为以下步骤

1.将数据集分类,计算每个类的均值(LDA利用了样本的类别(数据)标签,为有监督学习)。

2.计算类间散度矩阵Sb与类内散度矩阵Sw。

3.构造目标函数(多种不同的目标函数)并对其进行特征分解。

4.取出一定数量的特征向量得到投影矩阵。

5.将测试数据投影到子空间中,使用KNN进行分类(实际问题中)。

3.LDA的不足与优化

1.有限投影轴问题(≤类别数 - 1)

2.小样本问题

3.处理高维数据时,计算代价很大

优化:先用PCA进行预处理再使用LDA,或在目标函数中加入正则化扰动

4.不能较好地刻画非线性问题

优化:使用核属性的LDA升维处理数据

二、LDA运用于人脸识别

1.预处理

1.1 数据导入与处理

利用imread批量导入人脸数据库,或直接load相应mat文件,并在导入时不断将人脸拉成一个个列向量组成reshaped_faces,并取出30%作为测试数据,剩下70%作为训练数据,重复此步骤,将导入数据抽象成框架,可以匹配不同数据集的导入(本实验框架适配ORL、AR、FERET数据集)。

clear;
% 1.人脸数据集的导入与数据处理框架
reshaped_faces=[];
% 声明数据库名
database_name = "ORL";% ORL5646
if (database_name == "ORL")for i=1:40    for j=1:10       if(i<10)a=imread(strcat('C:\Users\hp\Desktop\face\ORL56_46\orl',num2str(i),'_',num2str(j),'.bmp'));     elsea=imread(strcat('C:\Users\hp\Desktop\face\ORL56_46\orl',num2str(i),'_',num2str(j),'.bmp'));  end          b = reshape(a,2576,1);b=double(b);        reshaped_faces=[reshaped_faces, b];  endend
row = 56; 
column = 46;
people_num = 40;
pic_num_of_each = 10;
train_pic_num_of_each = 7; % 每张人脸训练数量
test_pic_num_of_each = 3;  % 每张人脸测试数量
end%AR5040
if (database_name == "AR")for i=1:40    for j=1:10       if(i<10)a=imread(strcat('C:\AR_Gray_50by40\AR00',num2str(i),'-',num2str(j),'.tif'));     elsea=imread(strcat('C:\AR_Gray_50by40\AR0',num2str(i),'-',num2str(j),'.tif'));  end          b = reshape(a,2000,1);b=double(b);        reshaped_faces=[reshaped_faces, b];  endend
row = 50;
column = 40;
people_num = 40;
pic_num_of_each = 10;
train_pic_num_of_each = 7;
test_pic_num_of_each = 3;
end%FERET_80
if (database_name == "FERET")for i=1:80    for j=1:7       a=imread(strcat('C:\Users\hp\Desktop\face\FERET_80\ff',num2str(i),'_',num2str(j),'.tif'));              b = reshape(a,6400,1);b=double(b);        reshaped_faces=[reshaped_faces, b];  endend
row = 80;
column = 80;
people_num = 80;
pic_num_of_each = 7;
train_pic_num_of_each = 5;
test_pic_num_of_each = 2;
end% 取出前30%作为测试数据,剩下70%作为训练数据
test_data_index = [];
train_data_index = [];
for i=0:people_num-1test_data_index = [test_data_index pic_num_of_each*i+1:pic_num_of_each*i+test_pic_num_of_each];train_data_index = [train_data_index pic_num_of_each*i+test_pic_num_of_each+1:pic_num_of_each*(i+1)];
endtrain_data = reshaped_faces(:,train_data_index);
test_data = reshaped_faces(:, test_data_index);
dimension = row * column; %一张人脸的维度

1.2 算各类均值、类间散度Sb、类内散度Sw

样本的类间散度矩阵Sb和类内散度矩阵Sw分别定义为:

图1 Sb与Sw的定义

 将人脸数据集按人数n分为n类,算各类均值,并按Sb与Sw的定义与数学推导求出相应矩阵。

% 算每个类的平均
k = 1; 
class_mean = zeros(dimension, people_num); 
for i=1:people_num% 求一列(即一个人)的均值temp = class_mean(:,i);% 遍历每个人的train_pic_num_of_each张用于训练的脸,相加算平均for j=1:train_pic_num_of_eachtemp = temp + train_data(:,k);k = k + 1;endclass_mean(:,i) = temp / train_pic_num_of_each;
end% 算类类间散度矩阵Sb
Sb = zeros(dimension, dimension);
all_mean = mean(train_data, 2); % 全部的平均
for i=1:people_num% 以每个人的平均脸进行计算,这里减去所有平均,中心化centered_data = class_mean(:,i) - all_mean;Sb = Sb + centered_data * centered_data';
end
Sb = Sb / people_num;% 算类内散度矩阵Sw
Sw = zeros(dimension, dimension);
k = 1; % p表示每一张图片
for i=1:people_num % 遍历每一个人for j=1:train_pic_num_of_each % 遍历一个人的所有脸计算后相加centered_data = train_data(:,k) - class_mean(:,i);Sw = Sw + centered_data * centered_data';k = k + 1;end
end
Sw = Sw / (people_num * train_pic_num_of_each);

2.LDA核心(构造目标函数并对其进行特征分解)

Tips:本实验使用pinv(矩阵伪逆)代替inv(矩阵的逆),消除部分奇异值对实验带来的影响

每个目标函数对应不同LDA的等价模型(除法的、减法的及其调换位置的等)以及PCA模型(目标函数以及具体原理可以查看对应博客),确定目标函数后对其进行特征分解。

% 目标函数一:经典LDA(伪逆矩阵代替逆矩阵防止奇异值)
target = pinv(Sw) * Sb;% 目标函数二:不可逆时需要正则项扰动
%   Sw = Sw + eye(dimension)*10^-6;
%   target = Sw^-1 * Sb;% 目标函数三:相减形式
% target = Sb - Sw;% 目标函数四:相除
% target = Sb/Sw;% 目标函数五:调换位置
% target = Sb * pinv(Sw);%PCA
% centered_face = (train_data - all_mean);
% cov_matrix = centered_face * centered_face';
% target = cov_matrix;% 求特征值、特征向量
[eigen_vectors, dianogol_matrix] = eig(target);
eigen_values = diag(dianogol_matrix);% 对特征值、特征向量进行排序
[sorted_eigen_values, index] = sort(eigen_values, 'descend'); 
eigen_vectors = eigen_vectors(:, index);

3.人脸识别

降维过程LDA与PCA基本一致,在按特征值排好序的特征向量中取出前n大的特征向量来构建投影矩阵,实现降维(降维到n维),并用KNN进行分类预测,实现人脸识别,并比较PCALDA的各种等价模型与正则模型在不同数据集下的人脸识别精度。

Tips:单次运行为选定目标函数对应的人脸识别率。

% 人脸识别index = 1;
X = [];
Y = [];
% i为降维维度
for i=1:5:161% 投影矩阵project_matrix = eigen_vectors(:,1:i);projected_train_data = project_matrix' * (train_data - all_mean);projected_test_data = project_matrix' * (test_data - all_mean);% KNN的k值K=1;% 用于保存最小的k个值的矩阵% 用于保存最小k个值对应的人标签的矩阵minimun_k_values = zeros(K,1);label_of_minimun_k_values = zeros(K,1);% 测试脸的数量test_face_number = size(projected_test_data, 2);% 识别正确数量correct_predict_number = 0;% 遍历每一个待测试人脸 for each_test_face_index = 1:test_face_numbereach_test_face = projected_test_data(:,each_test_face_index);% 先把k个值填满,避免在迭代中反复判断for each_train_face_index = 1:Kminimun_k_values(each_train_face_index,1) = norm(each_test_face - projected_train_data(:,each_train_face_index));label_of_minimun_k_values(each_train_face_index,1) = floor((train_data_index(1,each_train_face_index) - 1) / pic_num_of_each) + 1;end% 找出k个值中最大值及其下标[max_value, index_of_max_value] = max(minimun_k_values);% 计算与剩余每一个已知人脸的距离for each_train_face_index = K+1:size(projected_train_data,2)% 计算距离distance = norm(each_test_face - projected_train_data(:,each_train_face_index));% 遇到更小的距离就更新距离和标签if (distance < max_value)minimun_k_values(index_of_max_value,1) = distance;label_of_minimun_k_values(index_of_max_value,1) = floor((train_data_index(1,each_train_face_index) - 1) / pic_num_of_each) + 1;[max_value, index_of_max_value] = max(minimun_k_values);endend% 最终得到距离最小的k个值以及对应的标签% 取出出现次数最多的值,为预测的人脸标签predict_label = mode(label_of_minimun_k_values);real_label = floor((test_data_index(1,each_test_face_index) - 1) / pic_num_of_each)+1;if (predict_label == real_label)correct_predict_number = correct_predict_number + 1;endendcorrect_rate = correct_predict_number/test_face_number;X = [X i];Y = [Y correct_rate];fprintf("k=%d,i=%d,总测试样本:%d,正确数:%d,正确率:%1f\n", K, i,test_face_number,correct_predict_number,correct_rate);if (i == 161)waitfor(plot(X,Y));end
end

图2 pinv改进的经典LDA在ORL下的人脸识别率与维数的关系

图3  LDA的各模型与PCA在FERET人脸识别率对比

分析:在FERET较大的数据集时,调换LDA、除法LDA、PCA的识别率波动较大,较其他三个模型识别率较低,而正则LDA与经典LDA在各数据集下表现相对稳定(其他图未展示),识别率均高于经典PCA,特别是在大数据集下,LDA相对PCA有明显优势。 

4.LDA与PCA图像降维与可视化对比

分别使用PCA与LDA对人脸图像进行降维至2与3维,并取前三类的分布作图,将每类第一幅图作为代表图。

Tips:本实验以测试集的二三维可视化为例

% 二三维可视化
class_num_to_show = 3;
pic_num_in_a_class = pic_num_of_each;
pic_to_show = class_num_to_show * pic_num_in_a_class;
for i=[2 3]% 取出相应数量特征向量project_matrix = eigen_vectors(:,1:i);% 投影projected_test_data = project_matrix' * (reshaped_faces - all_mean);projected_test_data = projected_test_data(:,1:pic_to_show);color = [];for j=1:pic_to_showcolor = [color floor((j-1)/pic_num_in_a_class)*20];end% 显示if (i == 2)subplot(1, 7, [1, 2, 3, 4]);scatter(projected_test_data(1, :), projected_test_data(2, :), [], color, 'filled');for j=1:3subplot(1, 7, j+4);fig = show_face(test_data(:,floor((j - 1) * pic_num_in_a_class) + 1), row, column);endwaitfor(fig);elsesubplot(1, 7, [1, 2, 3, 4]);scatter3(projected_test_data(1, :), projected_test_data(2, :), projected_test_data(3, :), [], color, 'filled');for j=1:3subplot(1, 7, j+4);fig = show_face(test_data(:,floor((j - 1) * pic_num_in_a_class) + 1), row, column);endwaitfor(fig);end
end

                             图4 LDA在ORL数据集下二三维可视化                                      

图5 PCA在ORL数据集下二三维可视化

分析:图4 图5(其他数据集与模型可自己更改目标函数或框架尝试)展示了LDAPCA对图像的降维后分布,可以清晰地看出LDA降维同类图像较聚集,不同类图像较分散。而PCA则相对混杂,无明显规律。根据两算法的目的与原理,以此可以比较出PCALDA的不同(即eigenfacefisherface的不同

5.LDA与PCA的异同总结

参考其它作者图

                                           PCA                                                                                                                    LDA

分析:PCA与LDA都是常见的线性降维算法,但两算法的降维原理与目的不同,LDA的核心思想是“最小化类内方差,最大化类间方差”,从而更好地完成数据的分类与识别,而PCA的核心思想是“最小化协方差矩阵(最小化重构误差)”,从而实现数据的压缩与主成分重构,一般在小数据集下PCA与LDA效果相近甚至超过LDA,但在大数据集中,LDA明显优于PCA。另外,LDA使用了数据的标签(类别)信息,为有监督学习,而PCA则未使用,为无监督学习。

6.其他

6.1 内部函数定义

本实验中将人脸图像展示抽象为函数,函数定义如下:

% 输入向量,显示脸
function fig = show_face(vector, row, column)fig = imshow(mat2gray(reshape(vector, [row, column])));
end

6.2 数据集及资源

本实验以ORL5646数据集做展示,代码可适用多个数据集。

常用人脸数据集如下(不要白嫖哈哈哈)

链接:https://pan.baidu.com/s/12Le0mKEquGMgh5fhNagZGw 
提取码:yrnb

LDA完整代码:李忆如/忆如的机器学习 - Gitee.com

6.3 参考资料

1.赖志辉的课

2.LDA算法原理及matlab实现_dulingtingzi的博客-CSDN博客_lda matlab

3.基于LDA的人脸识别方法--fisherface - 知乎 (zhihu.com)

4.周志华《机器学习》


总结

LDA作为经典的线性降维算法,通过”最小化内类方差,最大化类间方差“为目标导向对数据进行投影实现降维,更好地完成数据的分类。如今仍然在机器学习许多领域(数据分类、语言图像处理、推荐系统)有优异表现。且作为一种有监督学习方法(利用了数据的原有信息),LDA能得到较好的保留数据信息。但LDA仍存在上文提到的有限投影轴问题、小样本问题、处理高维数据大计算代价问题、不好刻画非线性问题等等,另外,LDA是假设每个类的数据都是高斯分布的情况下开发的,这个属性在现实世界的问题中往往不存在。如果没有这个属性,不同类的可分离性就不能很好地通过类间散射来描述,从而影响实验结果,后续博客会分析其他算法优化或解决上述问题。


http://chatgpt.dhexx.cn/article/6BZvrcBJ.shtml

相关文章

线性判别分析(LDA)详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 目录 一、LDA简介 二、数学原理&#xff08;以二分类为例子&#xff09; 1、设定 2、每一类的均值和方差 3、目标函数 4、目标…

LDA算法——线性判别

目录 一、前言 二、什么是LDA&#xff1f; 三、LDA原理 1.二分类问题 2.多分类问题 3.几点说明 四、算法实现 一、前言 之前我们已经介绍过PCA算法&#xff0c;这是一种无监督的降维方法&#xff0c;可以将高维数据转化为低维数据处理。然而&#xff0c;PCA总是能适用吗&…

主题模型:LDA原理详解与应用

LDA算法简介&#xff1a; LDA是一种基于贝叶斯思想的无监督的聚类算法&#xff0c;广泛用于文本聚类&#xff0c;文本分析&#xff0c;文本关键词等场景。具体的&#xff0c;算法 的输入是一个文档的集合D{d1, d2, d3, ... , dn}&#xff0c;同时还需要主题Topic的类别数量m&a…

LDA主题模型简介及Python实现

一、LDA主题模型简介 LDA主题模型主要用于推测文档的主题分布&#xff0c;可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类。 LDA主题模型不关心文档中单词的顺序&#xff0c;通常使用词袋特征&#xff08;bag-of-word feature&#xff09;来…

制作属于自己的个人博客-超详细教程

SpringBoot个人博客 一.博客效果预览 博客首页预览 博客详情预览 博客评论区预览 博客底部栏预览 关于页面预览 二.博客效果在线预览 http://blog.ShaoxiongDu.top 三.项目技术 后端SpringBoot框架 分为控制层(Controller) 业务层(Service) 数据持久层(Dao) 按照Spring…

如何搭建个人博客

新的安装方式&#xff1a;(强烈推荐&#xff0c;简单方便) 利用dockernginx配置halo博客 先碎碎念一下&#xff0c;最近在学习springboot项目&#xff0c;在b站跟着up主研究如何写一个简易的博客来着&#xff0c;后来发现可以直接简易的搭建一个博客&#xff08;都不用写代码&a…

使用 nodejs 搭建个人博客

"使用nodejs搭建自己的个人博客" 说明运行后端 node 模块后端框架采用的是 express 框架进行接口构建&#xff0c;具体解释如下&#xff1a;数据库参数配置评论邮箱提示付费文件下载配置&#xff08;支付宝&#xff09;评论语句检测 关于跨域问题的解决 说明 使用no…

超详细图解:如何使用 WordPress搭建一个个人博客?

前两天我用WordPress 给自己搭建了一个网站&#xff0c;整个过程非常的顺利&#xff0c;体验非常地好&#xff0c;于是我就整个过程、以及其中的一些搭建心得&#xff0c;记录下来。 如果你也正好有搭建个人网站的想法&#xff0c;那么本文会给你一个参考&#xff0c;也许看了这…

个人博客网站的设计与实现

/ 前话 / 纯手工敲代码&#xff0c;代码结构简单&#xff0c;divcss布局html静态个人博客首页网页设计&#xff0c;dreamwaver和hb都可以编辑&#xff0c;文件结构包含了css、fonts、images、js和html&#xff0c;运用html5技术&#xff0c;包括nav标签、header标签和footer标签…

个人博客系统毕业设计开题报告

本文给出的是本科生个人博客系统的毕业设计开题报告&#xff0c;仅供参考&#xff01;&#xff08;具体模板和要求按照自己学校给的要求&#xff09; 毕业设计开题报告 一、选题意义二、博客系统概述三 、毕业设计研究方案四、功能结构图五、进度安排六、参考文献 一、选题意义…

基于HTML个人博客网站项目的设计与实现——个人博客作品展示6页 HTML+CSS

Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 个人博客网站 | 个人主页介绍 | 个人简介 | 个人博客设计制作 | 等网站的设计与制作 | 大学生个人HTML网页设计作品 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&…

HTML制作个人网页制作(简单静态HTML个人博客网页作品)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

个人主页博客网页设计制作HTML5+CSS大作业——清新春暖花开个人博客网站(6页)

HTML5CSS大作业——清新春暖花开个人博客网站(6页) 常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄…

如何使用HTML制作个人网站(如何搭建个人博客)

&#x1f4c2;文章目录 一、&#x1f468;‍&#x1f393;网站题目二、✍️网站描述三、&#x1f4da;网站介绍四、&#x1f310;网站演示五、⚙️ 网站代码&#x1f9f1;HTML结构代码&#x1f492;CSS样式代码 六、&#x1f947; 如何让学习不再盲目七、&#x1f381;更多干货…

10分钟搭建一个免费个人博客网站

一个程序员怎么能不拥有自己的博客&#xff0c;本文让10分钟快速搭建部署好自己的博客 准备工作 有Gitee账号有安装git会 markdown 编写文档Node.js 版本 > 8.6 博客采用VuePress搭建&#xff0c;Gitee部署&#xff0c;接下来&#xff0c;5步搞定。 1.创建项目 创建项目…

用html制作学生个人博客,网页制作论坛(学生个人网页制作代码)

许多开发人员认为擅长设计是一种天生的能力,而创造力是与生俱来的。但是设计是一项可以像其他任何东西一样学习的技能。你不必天生就可以创建一个漂亮的网站的艺术家,这需要实践。在身边的小伙伴的博客,自己的网站来看,很多人都是用了开源后台的网站模板,熟不知局限太大,…

个人网站、个人博客的设计案例,仅供参考

关于网站的内容&#xff0c;我也是纠结了好久&#xff0c;我这里说的是网站建设的内容。个人网站&#xff0c;大多数人还是做个博客&#xff0c;想着能平时写点内容&#xff0c;发点文章&#xff0c;图片&#xff0c;一些简短的分享什么的。 好&#xff0c;想到就做。 我做了…

如何用html制作博客页面,HTML个人博客页面

知识点总结&#xff1a;下面的是一个个人博客页面&#xff0c;歌词的段落用的时“p”标签&#xff0c;超链接为“a”标签。 包括鼠标经过的事件&#xff1a;颜色变换&#xff1b;去顶部去底部和指定位置&#xff1a;写入的锚点&#xff0c;点击后可以到制定位置。 刚开始学习ht…

手把手教你十五分钟搭建个人博客网站

文章目录 一、下载二、上传服务器与配置三、加备案号四、关闭所有评论五、删除自豪采用wordpress六、优雅主题配置七、安装md编译器八、自定义站点九、发一篇博客 一、下载 https://cn.wordpress.org/download/下载一个就行&#xff1a; 二、上传服务器与配置 解压&#xff…

HTML+CSS大作业: 个人介绍网页制作作业 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人博客网站制作成品下载

HTML5期末大作业&#xff1a;个人介绍网站设计——个人博客(6页) HTMLCSSJavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码 常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、…