机器学习之基于LDA的人脸识别

目录

LDA降维

思想

matlab代码

fisherface

思想

matlab代码

人脸识别

思想

matlab代码


LDA降维

思想

首先,代码通过使用dir函数获取指定路径下所有以".bmp"结尾的文件,并存储在变量pictures中。

然后,定义了一些参数:people表示人数,personPictureNumber表示每个人的图像数量,Dimension表示图像的维度大小,pictureNumber表示总图像数量。

接下来,创建一个空矩阵sample,用于存储所有图像的向量表示。然后利用循环遍历每个图片,并将其读取、转换为双精度类型,并将其转换为列向量picture。最后将该列向量添加到sample矩阵中。

接下来是LDA部分的代码。首先定义了两个空的矩阵SbSw,分别表示类间散度矩阵和类内散度矩阵。然后,通过循环遍历每个人的图像,计算出每个人图像的均值向量,并计算出类间散度矩阵Sb。同时,将每个人图像的均值向量存储在meanPerson中。接下来,计算类内散度矩阵Sw,循环遍历每个图像,计算出每个图像与其对应人的均值向量之差,并计算出类内散度矩阵Sw

然后根据不同模型进行不同处理构建协方差矩阵,然后提取特征向量。

matlab代码

pictures=dir('C:\Users\Yezi\Desktop\机器学习\face10080\*.bmp');
people=15;
personPictureNumber=11;
Dimension=100*80;
pictureNumber=people*personPictureNumber;
sample=[];
for i=1:pictureNumber
    picture=imread("C:\Users\Yezi\Desktop\机器学习\face10080\"+pictures(i).name);
    picture=double(picture);
    picture=picture(:);
    sample=[sample,picture];
end

% LDA
meanPerson=[];
meanTotal=mean(sample,2);
Sb=zeros(Dimension,Dimension);
for i=0:people-1
    temp=sample(:,i*personPictureNumber+1:(i+1)*personPictureNumber);
    one=mean(temp,2)-meanTotal;
    Sb=Sb+one*one';
    meanPerson=[meanPerson,mean(temp,2)]; 
end
Sb=Sb/people;
Sw=zeros(Dimension,Dimension);
for i=1:pictureNumber
    one=sample(:,i)-meanPerson(floor((i-1)/personPictureNumber)+1);
    Sw=Sw+one*one';
end
Sw=Sw/pictureNumber;

% 经典
covMatrix=pinv(Sw)*Sb;
% 正则
% Sb=Sb+eye(Dimension)*10^-6;
% covMatrix=pinv(Sw)*Sb;
% 减法
% covMatrix=Sb-Sw;

[egienvectors,diagonalMatrix]=eig(covMatrix);
egienvalues=diag(diagonalMatrix);
[egienvalues,order]=sort(egienvalues,'descend');
egienvectors=egienvectors(:,order);

fisherface

思想

首先,将样本矩阵sample中的第一列取出,表示选择了一个人脸图像作为重建的源图像,存储在变量oneFace中。

然后,通过循环遍历特征维度,从1到8逐渐增加。在每个循环中,选取特征向量矩阵egienvectors中的前dimension列,表示选择了部分特征向量用于重建。这些特征向量被存储在变量egienvector中。

接下来,通过将特征向量矩阵egienvector与其转置的乘积与源图像oneFace相乘,得到重建的人脸图像rebuildFace。然后,通过reshape函数将rebuildFace重新变换回100x80的图像矩阵。

然后,使用subplot函数将多个子图排列在一个2x4的网格上,其中每个子图显示一个特征维度下的重建人脸图像。imshow函数显示重建的人脸图像,并使用mat2gray函数将图像数据转换为灰度范围[0,1]内的值。xlabel函数设置子图的标题,显示当前特征维度。

通过以上的循环和绘图操作,代码可以展示在不同的特征维度下,对原始人脸图像的重建效果。随着特征维度的增加,重建图像将逐渐接近源图像,并展示出更多的细节和结构信息。

matlab代码

oneFace=sample(:,1);
for dimension=1:1:8
    egienvector=egienvectors(:,1:dimension);
    rebuildFace=egienvector*(egienvector'*oneFace);
    rebuildFace=reshape(rebuildFace,100,80);
    subplot(2,4,dimension);
    imshow(mat2gray(rebuildFace));
    xlabel(sprintf("dimension=%d",dimension));
end

人脸识别

思想

首先,定义训练样本数trainNumber和测试样本数testNumber,并创建了空的训练数据矩阵trainData和测试数据矩阵testData

然后,通过两个循环将样本矩阵sample中的数据按照一定规则划分为训练数据和测试数据。第一个循环根据不同的人数进行迭代,并将每个人的前trainNumber个图像添加到trainData中。第二个循环同样根据不同的人数进行迭代,并将每个人的后面的testNumber个图像添加到testData中。

接下来,定义了空的结果矩阵result,用于存储不同特征维度下的分类准确率。

然后,通过两个嵌套循环遍历K近邻算法的参数:knnKdimension。在每个循环中,选择特征向量矩阵egienvectors中的前dimension列,表示选择了部分特征向量进行降维。这些特征向量被存储在变量egienvector中。

接下来,通过矩阵乘法运算将训练数据和测试数据投影到特征向量所构成的子空间中,得到降维后的训练数据trainDataTemp和测试数据testDataTemp

然后,定义了变量error用于记录分类错误的样本数量。通过计算测试数据的数量和训练数据的数量,进行两个嵌套循环遍历测试数据。在每个测试样本中,计算与所有训练样本之间的欧式距离,并对距离进行排序。然后,根据K近邻算法的思想,选择距离最近的knnK个训练样本作为邻居。

接下来,根据邻居的类别信息,判断测试样本的类别。如果邻居中只有一个类别出现次数最多,则将该类别作为测试样本的预测类别;否则,使用出现次数最多的类别作为预测类别。

最后,统计错误分类的样本数量,并计算分类准确率。将准确率存储在结果矩阵result中。

最后,通过调用plot函数,将特征维度dimension作为横轴,分类准确率result作为纵轴进行绘图,展示不同特征维度下的分类准确率曲线。

matlab代码

trainNumber=4;
testNumber=3;
trainData=[];
testData=[];
for i=0:people-1
    trainData=[trainData,sample(:,i*personPictureNumber+1:i*personPictureNumber+trainNumber)];
end
for i=0:people-1
    testData=[testData,sample(:,i*personPictureNumber+trainNumber+1:i*personPictureNumber+personPictureNumber)];
end
result=[];
for knnK=1:1
    for dimension=1:1:10
        egienvector=egienvectors(:,1:dimension);
        trainDataTemp=egienvector'*trainData;
        testDataTemp=egienvector'*testData;
        error=0;
        testDataNumber=size(testDataTemp,2);
        trainDataNumber=size(trainDataTemp,2);
        for i=1:testDataNumber
            distances=[];
            for j=1:trainDataNumber
               distance=0;
               for k=1:dimension
                  distance=distance+(testDataTemp(k,i)-trainDataTemp(k,j))^2; 
               end
               distances=[distances,distance];
            end
            [distances,index]=sort(distances);
            rightIndex=floor((i-1)/testNumber)+1;
            testIndex=0;
            knn=[];
            for k=1:knnK
               knn=[knn,floor((index(k)-1)/trainNumber)+1];
            end
            [modeIndex,times]=mode(knn);
            if times==1
                testIndex=knn(1);
            else
                testIndex=modeIndex;
            end
            if testIndex~=rightIndex
                error=error+1;
            end
        end
        rate=(testDataNumber-error)/testDataNumber;
        result=[result,rate];
    end
end
X=1:1:10;
plot(X,result);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习之线性回归算法

目录 线性回归算法 求导法推导 梯度下降法推导 线性回归实现人脸识别 导入数据 构建标签矩阵 经典线性回归求导法实现 经典线性回归梯度下降法实现 岭回归实现 套索回归实现 局部加权线性回归实现 可视化 人脸识别 线性回归算法 求导法推导 梯度下降法推导 线性回…

TypeScript ~ TS 掌握编译文件配置项 ⑤

作者 : SYFStrive 博客首页 : HomePage 📜: TypeScript ~ TS 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &…

计算机网络——网络层

序言 计算机网络中的网络层在当今的社会起到了什么作用? 现在的互联网通信,远程办公和远程教育,电子商务和在线服务,信息共享和社交媒体,物联网和智能家居都是通过网络层才能使用的。它连接了人们、设备和信息&#xf…

chatgpt赋能python:Python编译成SO文件和反编译的介绍

Python编译成SO文件和反编译的介绍 什么是SO文件? SO文件,也称为共享对象文件,是一种二进制文件格式,用于在多个应用程序之间共享代码和数据。在Unix和类Unix系统中,它们通常是共享库文件的形式。因此,SO…

Vue-scoped(局部)样式

scoped(局部)样式 scoped是在脚手架有一个编写样式的小技巧 作用:让样式在局部生效,防止冲突 1 编写案例 现在有两个组件,一个student,一个school,现在想给组件写点样式 这里只给个背景色 没问题,样式生效 2 样式冲…

自然语言处理从入门到应用——动态词向量预训练:ELMo词向量

分类目录:《自然语言处理从入门到应用》总目录 在双向语言模型预训练完成后,模型的编码部分(包括输入表示层以及多层堆叠LSTM)便可以用来计算任意文本的动态词向量表示。最自然的做法是使用两个LSTM的最后一层隐含层输出作为词的动…

GPT学习笔记-Enterprise Knowledge Retrieval(企业知识检索)--私有知识库的集成

openai-cookbook/apps/enterprise-knowledge-retrieval at main openai/openai-cookbook GitHub 终于看到对于我解决现有问题的例子代码,对于企业私有知识库的集成。 我对"Retrieval"重新理解了一下,源自动词"retrieve"&#xf…

idea乱码的相关问题

idea控制台乱码(即:tomacat等启动时的乱码) 第一步: 控制台tomcat启动信息乱码解决(红色字体) 1 在本地 tomcat 的配置文件中找到 logging.properties 文件设置日志输出的编码为 UTF-8 追加的配置信息为…

插入排序-C语言实现

🥰前言 🍔在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据,当然操作数据首先想到的就是数据的排序,排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等,这些就是储存数据的方…

1.1 编写一个简单的C++程序

博主介绍:爱打游戏的计算机专业学生 博主主页:夏驰和徐策 所属专栏:夏驰和徐策带你从零开始学C 1.1.0 这段话告诉我们什么? 这段话解释了一个C程序中的main函数的基本结构和功能。 它告诉我们以下几点: 1. C程序的…

Python爬取城市天气数据,并作数据可视化

1.爬取广惠河深2022-2024年的天气数据 import requests # 发送请求要用的模块 需要额外安装的 import parsel import csvf open(广-惠-河-深天气.csv, modea, encodingutf-8, newline) csv_writer csv.writer(f) csv_writer.writerow([日期, 最高温度, 最低温度, 天气,…

深入理解深度学习——GPT(Generative Pre-Trained Transformer):GPT-3与Few-shot Learning

分类目录:《深入理解深度学习》总目录 相关文章: GPT(Generative Pre-Trained Transformer):基础知识 GPT(Generative Pre-Trained Transformer):在不同任务中使用GPT GPT&#x…

对英雄联盟英雄属性数据的预处理及相似度矩阵计算

目录 一、引言 二、任务1 1、填充缺失值 2、用中位数填充“生命值”属性列缺失值 3、 用均值填充“生命值”属性列缺失值 三、任务2 注:英雄联盟英雄属性数据资源可在博客资源中自行获取。 一、引言 英雄联盟作为一款古早的刀塔游戏,可谓之刀塔游…

[golang 微服务] 7. go-micro框架介绍,go-micro脚手架,go-micro结合consul搭建微服务案例

一.go-micro框架 前言 上一节讲解了 GRPC微服务集群 Consul集群 grpc-consul-resolver相关的案例,知道了微服务之间通信采用的 通信协议,如何实现 服务的注册和发现,搭建 服务管理集群,以及服务与服务之间的 RPC通信方式,具体的内容包括: pro…

聊聊微服务到底该如何划分

背景 现在动不动就是微服务架构,但是微服务划分的合理与否会极大的影响开发过程中的复杂度,划分的重要性不言而喻,但是在微服务划分这条路上并没有银弹,有的说DDD可以解决微服务的划分问题,吕哥想说的是那只是理论上的…

端午作业1

只要文件存在,就会有唯一对应的inode号,且相应的会存在一个struct inode结构体。在应用层通过open()打开一个设备文件,会对应产生一个inode号,通过inode号可以找到文件的inode结构体 根据inode结构体中文件…

JMU20 软件工程经济学 复习总结

文章目录 碎碎念0. 基准收益率 i1. 现金流量图2. 净现值 NPV,内部收益率 IRR3. 单利,复利计算4. 等额年金NAV5. 动态回收期 P t ′ P_t Pt′​6. 固定资产折旧 [书P44]7. 增值税8. 软件行业增值税的即征即退9. 利息备付率 ICR,偿债备付率 DSC…

C语言学习(二十六)---指针练习题(二)

在上节的内容中,我们进一步学习了有关指针的内容,并做了一些关于指针的题目,今天我们将继续练习一些指针的题目,以便大家更好的理解和掌握指针的知识,好了,话不多说,开整!&#xff0…

GreasyFork+Github

GreasyForkGithub 好长时间没用 GreasyFork 了,最近在刷 Spring Boot 的各种知识点,其中很大时间都在学习 baeldung.com 这个站点。不知道是因为最近刷的勤了还是怎么的,这个网站经常会弹出一个“让我关闭广告阻拦插件”的提示框&#xff0c…

MongoDB集群管理(三)

MongoDB集群管理 集群介绍 为什么使用集群 随着业务数据和并发量的增加,若只使用一台MongoDB服务器,存在着断电和数据风险的问题,故采用Mongodb复制集的方式,来提高项目的高可用、安全性等性能。 MongoDB复制是将数据同步到多个…