【人脸识别】基于PCA+LDA实现人脸识别matlab 源码
发布日期:2021-05-04 12:56:14 浏览次数:13 分类:技术文章

本文共 3936 字,大约阅读时间需要 13 分钟。

一、简介

1 PCA

1.1 数据降维
降维的方法包括:主成分分析(PCA)、因子分析(FA)、和独立成分分析(ICA)
主成分分析:寻找向量,使各个样本到该向量的投影之和最小。
因子分析:
独立成分分析:

1.2 PCA:目的是降维,降维的实际原理是最大化目标函数(数据投影后的方差最大)

强推原理博文:https://blog.csdn.net/fendegao/article/details/80208723
(1)假设有m个n维样本: {Z1,Z2,…,Zm}
(2)样本中心 u 为: 所有样本观测值之和/(mxn)
(3)去中心化后,得到矩阵 {X1,X2,…,Xm}={Z1-U,Z2-U,…,Zm-U}
(4)记含有n个元素的向量W,则样本X1在w方向上的投影为二者内积 X1 . W
(5)PCA的目标函数为最大化投影
在这里插入图片描述
目标方程可以化为矩阵形式求解,求解方法:
(1)构建拉格朗日算子,求导为0,解得投影最大的向量为特征值最大对应的特征向量。
根据特征值的累计贡献率可以指定选取多少个W向量作为K-L变换矩阵。若选择了4个主成分,则对于每一个n维度样本,经过矩阵变换后,都变为了(1xn)x(nx4)=1x4维向量,即达到了降维的目的。
(2)SVD奇异值分解:降维只需求出右奇异矩阵,即AA(T)的特征向量,不需要求A的协方差矩阵。对内存友好。

1.3 基于PCA的人脸识别

(1)基于人脸样本库,例如现实中人脸拍照(银行、车站)等数据采集方法,建立人脸库。
(2)求取训练人脸库的协方差阵的特征值和特征向量。
(3)对于需要判别的人脸,判断其在特征向量上的投影与哪个训练样本的投影最接近。

!!!注::需要注意,协方差矩阵是维度之间的协方差,故是nxn维,但是在实际应用时,例如图像降维(假设一幅图像有200*10个像素,有100幅图像),一个像素就是一个维度,则原本协方差阵XX’为 (2000x100)x (100x2000)维,计算机存储计算消耗过大,此时可以考虑使用替代矩阵P=X’X(100x2000)x(2000x100)替代:

在这里插入图片描述
P的特征值即原始协方差阵的特征值,P的特征向量左乘数据矩阵即为原始协方差阵的特征向量。

2 LDA

LDA:线性判别分析,也称为Fisher线性判别,是常用的降维技术。
基本思想:将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性。
LDA降维后的维度是直接和类别的个数相关的,与数据本身的维度没关系,比如原始数据是n维的,一共有C个类别,那么LDA降维之后,维数取值范围为(1,C-1),举个例子,假设图像分类,两个类别正例反例,每个图像用10000维特征表示,那么LDA之后,就只有1维特征,并且这维特征的分类能力最好。
对于很多两类分类的情况,LDA之后就剩下1维,找到分类效果最好的一个阈值貌似就可以了。
假设,x是一个N维的列向量,要使x通过LDA降到C维,只需要找到一个投影矩阵w,也即,一个N*C的矩阵,让w的转置矩阵和x相乘,便成为C维的了。(投影在数学上的表示就是用一个矩阵去相乘)
此时,问题的关键就在于:寻找一个投影矩阵!并且,该投影矩阵要保证模式样本在新的子空间有最大的类间距离和最小的类内距离。

2.2 LDA数学表示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、源代码

clear allclcclose allstart=clock;sample_class=1:40;%样本类别sample_classnum=size(sample_class,2);%样本类别数fprintf('程序运行开始....................\n\n');for train_samplesize=3:8;    train=1:train_samplesize;%每类训练样本    test=train_samplesize+1:10;%每类测试样本        train_num=size(train,2);%每类训练样本数    test_num=size(test,2);%每类测试样本数        address=[pwd '\ORL\s'];    %读取训练样本    allsamples=readsample(address,sample_class,train);        %先使用PCA进行降维    [newsample base]=pca(allsamples,0.9);    %计算Sw,Sb    [sw sb]=computswb(newsample,sample_classnum,train_num);        %读取测试样本    testsample=readsample(address,sample_class,test);    best_acc=0;%最优识别率    %寻找最佳投影维数    for temp_dimension=1:1:length(sw)        vsort1=projectto(sw,sb,temp_dimension);                %训练样本和测试样本分别投影        tstsample=testsample*base*vsort1;        trainsample=newsample*vsort1;        %计算识别率        accuracy=computaccu(tstsample,test_num,trainsample,train_num);        if accuracy>best_acc            best_dimension=temp_dimension;%保存最佳投影维数            best_acc=accuracy;        end    end    %---------------------------------输出显示----------------------------------    fprintf('每类训练样本数为:%d\n',train_samplesize);    fprintf('最佳投影维数为:%d\n',best_dimension);    fprintf('FisherFace的识别率为:%.2f%%\n',best_acc*100);    fprintf('程序运行时间为:%3.2fs\n\n',etime(clock,start));endfunction [newsample basevector]=pca(patterns,num)%主分量分析程序,patterns表示输入模式向量,num为控制变量,当num大于1的时候表示%要求的特征数为num,当num大于0小于等于1的时候表示求取的特征数的能量为num%输出:basevector表示求取的最大特征值对应的特征向量,newsample表示在basevector%映射下获得的样本表示。[u v]=size(patterns);totalsamplemean=mean(patterns);for i=1:u    gensample(i,:)=patterns(i,:)-totalsamplemean;endsigma=gensample*gensample';[U V]=eig(sigma);d=diag(V);[d1 index]=dsort(d);if num>1    for i=1:num        vector(:,i)=U(:,index(i));        base(:,i)=d(index(i))^(-1/2)* gensample' * vector(:,i);    endelse    sumv=sum(d1);    for i=1:u        if sum(d1(1:i))/sumv>=num            l=i;            break;        end    end    for i=1:l        vector(:,i)=U(:,index(i));        base(:,i)=d(index(i))^(-1/2)* gensample' * vector(:,i);    endendfunction sample=readsample(address,classnum,num)%这个函数用来读取样本。%输入:address就是要读取的样本的地址,classnum代表要读入样本的类别,num是每类的样本;%输出为样本矩阵allsamples=[];image=imread([pwd '\ORL\s1_1.bmp']);%读入第一幅图像[rows cols]=size(image);%获得图像的行数和列数for i=classnum    for j=num        a=imread(strcat(address,num2str(i),'_',num2str(j),'.bmp'));        b=a(1:rows*cols);        b=double(b);        allsamples=[allsamples;b];    endend

三、运行结果

在这里插入图片描述

四、备注

完整代码或者代写添加QQ1575304183

转载地址:https://blog.csdn.net/qq_34763204/article/details/116379751 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:React基础语法
下一篇:【路径规划】基于改进动态窗口法DWA实现机器人动态避障matlab源码含 GUI

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月27日 06时58分41秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java web 防止sql注入攻击_JavaWeb防注入知识点(一) 2019-04-21
java ssm 异常分类_SSM项目常见的异常与处理提示(一) 2019-04-21
java定义矩形类_Java定义矩形类 2019-04-21
java变量怎么变常量_Java的常量与变量是什么?怎么学习呀? 2019-04-21
java开发招聘试题_客户化开发招聘试题-Java开发.doc 2019-04-21
java jdk win10 1335_win10下安装java jdk,tomcat 2019-04-21
java list二分查找_java中的ArrayList和LinkedList的二分查找速度比 | 学步园 2019-04-21
php中的变量名称用什么表示,PHP变量,方法,类等名称中的有效字符是什么? 2019-04-21
pic32mx是什么cpu_PIC32MX单片机外设库使用(Ⅰ)- 系统时钟及I/O口基本设置 2019-04-21
用c 在mysql上存图片_C 批量保存图片进 mysql 利用MYSQL_BIND插入longblob 2019-04-21
mysql 1045 28000_mysql报关于用户密码1045(28000),几种处理方法 (zhuan) 2019-04-21
solr比mysql的优势_Solr与Elasticsearch的优缺点比较总结和归纳 2019-04-21
华为博士招聘上机考试题目_牛客网-华为-2020届校园招聘上机考试-3 2019-04-21
python中for可以做变量名吗_Python中使用动态变量名的方法 2019-04-21
mysql 日期转换天数_MySQL 日期操作 增减天数、时间转换、时间戳 2019-04-21
java对象去重复_JAVA中List对象去除重复值的方法 2019-04-21
java bss_[转] .bss段和.data段的区别 2019-04-21
java上传图片损坏_大神求助 上传图片后 图片损坏 2019-04-21
java socket唯一标识符_Java Socket编程之常识网络基础知识 2019-04-21
java给xyz大小排序_java递归实现string xyz排序 2019-04-21