机器学习:基于PCA对人脸识别数据降维并建立KNN模型检验

news2024/11/27 4:17:28

在这里插入图片描述

基于PCA对人脸识别数据降维并建立KNN模型检验

作者:i阿极

作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


大家好,我i阿极。喜欢本专栏的小伙伴,请多多支持

专栏案例:机器学习案例
机器学习(一):线性回归之最小二乘法
机器学习(二):线性回归之梯度下降法
机器学习(三):基于线性回归对波士顿房价预测
机器学习(四):基于KNN算法对鸢尾花类别进行分类预测
机器学习(五):基于KNN模型对高炉发电量进行回归预测分析
机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析
机器学习(七):基于多项式贝叶斯对蘑菇毒性分类预测分析
机器学习(十四):基于逻辑回归对超市销售活动预测分析
机器学习(十五):基于神经网络对用户评论情感分析预测
机器学习(十六):线性回归分析女性身高与体重之间的关系
机器学习(十七):基于支持向量机(SVM)进行人脸识别预测
机器学习(十八):基于逻辑回归对优惠券使用情况预测分析
机器学习(十九):基于逻辑回归对某银行客户违约预测分析
机器学习(二十):LightGBM算法原理(附案例实战)
机器学习(二十一):基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测
机器学习(二十二):基于逻辑回归(Logistic Regression)对股票客户流失预测分析

文章目录

  • 基于PCA对人脸识别数据降维并建立KNN模型检验
  • 1、PCA算法简介
  • 2、数学原理
  • 3、实验环境
  • 4、实战案例-人脸识别
    • 4.1案例背景
    • 4.2数据读取
    • 4.3数据处理
    • 4.4数据划分与降维
    • 4.5KNN模型的搭建与使用


1、PCA算法简介

PCA(Principal Component Analysis)是一种常用的数据降维方法,通过线性变换将高维数据映射到低维空间,同时尽量保留原始数据的信息。PCA的主要思想是将原始数据的各个特征进行线性组合,使得新特征能够最大程度地保留原始数据的方差,从而达到降维的目的。

PCA的具体步骤如下:

  • 数据预处理:对数据进行标准化处理,使得每个特征的均值为0,方差为1。

  • 计算协方差矩阵:将标准化后的数据按列组成n维列向量,计算其协方差矩阵。

  • 计算特征值和特征向量:对协方差矩阵进行特征值分解,得到n个特征值和n个特征向量。

  • 选择主成分:将特征值按大小排列,选择前k个特征值对应的特征向量,这些特征向量组成的矩阵即为转换矩阵。通常只选择特征值较大的几个特征向量,将高维数据映射到低维空间中,从而实现数据降维。

  • 映射数据:将原始数据与转换矩阵相乘,得到新的低维数据。

PCA算法的主要优点是可以在不丢失太多信息的情况下降低数据的维度,从而减少计算量和存储空间。

2、数学原理

PCA(Principal Component Analysis)是一种线性降维技术,其数学原理涉及到线性代数中的特征值和特征向量。

给定一个数据矩阵 X ∈ R m × n X\in R^{m\times n} XRm×n,其中 m m m表示样本数量, n n n表示特征数量。我们需要通过PCA将 X X X降维到 k k k维( k < n k<n k<n),得到一个新的数据矩阵 Z ∈ R m × k Z\in R^{m\times k} ZRm×k,其中每一列代表着一个新的特征。

PCA的主要思想是将原始数据在新的坐标系中进行投影,使得投影后数据的方差最大。具体地,我们需要求出一个正交矩阵 W ∈ R n × k W\in R^{n\times k} WRn×k,使得将原始数据 X X X乘以 W W W后得到的新数据矩阵 Z = X W Z=XW Z=XW,其中每一列都是正交的且具有最大方差。

因此,我们需要求解如下优化问题:

在这里插入图片描述

x i x_i xi表示数据矩阵 X X X的第 i i i

为了求解上述问题,我们引入一个新的变量 U = X W U=XW U=XW,该变量表示数据矩阵 X X X在新坐标系下的投影。由于 U = X W U=XW U=XW,因此可以得到:
在这里插入图片描述

u i u_i ui表示 U U U的第 i i i

为了让方差最大,我们需要将上述问题转化为一个约束最优化问题:
在这里插入图片描述

I k I_k Ik表示 k k k维单位矩阵

我们可以通过拉格朗日乘子法将上述问题转化为一个无约束问题:
在这里插入图片描述

T r Tr Tr表示矩阵的迹

为了求解上述问题,我们需要求解矩阵 X T X X^TX XTX的特征值和特征向量,并选取前 k k k大的特征值所对应的特征向量组成一个新的矩阵 W W W。这个新的矩阵 W W W就是我们所需要的正交矩阵。

最后,我们将原始数据 X X X乘以矩阵 W W W,即可得到新的数据矩阵 Z = X W Z=XW Z=XW,其中每一列都代表着一个新的特征,且这些特征具有最大的方差。

3、实验环境

Python 3.9

Jupyter Notebook

Anaconda

4、实战案例-人脸识别

4.1案例背景

人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术。该技术蓬勃发展,应用广泛,例如:人脸识别门禁系统,刷脸支付软件,公安人脸识别系统。这一节我们便以一个人脸识别模型来讲解如何在实战中应用PCA主成分分析算法。
该节所讲的人脸识别的本质其实是根据每张人脸不同像素点的颜色不同来进行数据建模与判断,人脸的每个像素点的颜色都有不同的值,这些值可以组成人脸的特征向量们,不过因为人脸上的像素点过多,所以特征变量过多,因此需要利用PCA进行主成分分析进行数据降维。

4.2数据读取

读取数据

import os
names = os.listdir("D:\\CSDN\\machine learning\\data\\faces")

names[0:5]  # 查看前5项读取的文件名

在这里插入图片描述

获取到文件名称后,便可以通过如下代码在Python中查看这些图片

from PIL import Image
img0 = Image.open("D:\\CSDN\\machine learning\\data\\faces\\" + names[0])
img0.show()
img0

在这里插入图片描述

4.3数据处理

图像灰度处理及数值化处理

import numpy as np
img0 = img0.convert('L')
img0 = img0.resize((32, 32))
arr = np.array(img0)

arr  # 查看数值化后的结果

在这里插入图片描述

为了方便数据建模,将二维数组转化为一维数组

arr = arr.reshape(1, -1)

print(arr) 

在这里插入图片描述

构造所有图片的特征变量

X = []  # 特征变量
for i in names:
    img = Image.open("D:\\CSDN\\machine learning\\data\\faces\\" + i)
    img = img.convert('L')
    img = img.resize((32, 32))
    arr = np.array(img)
    X.append(arr.reshape(1, -1).flatten().tolist())

查看400张图片转换后的结果

import pandas as pd
X = pd.DataFrame(X)

X 

在这里插入图片描述

查看此时的表格结构

print(X.shape) 

在这里插入图片描述

批量获取所有图片的目标变量y

y = []  # 目标变量
for i in names:
    img = Image.open("D:\\CSDN\\machine learning\\data\\faces\\" + i)
    y.append(int(i.split('_')[0]))
    
print(y)  # 查看目标变量,也就是对应的人员编号

在这里插入图片描述

4.4数据划分与降维

划分训练集和测试集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

PCA数据降维

from sklearn.decomposition import PCA
pca = PCA(n_components=100)
pca.fit(X_train)

对训练集和测试集进行数据降维

X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)

验证PCA是否降维

print(X_train_pca.shape)
print(X_test_pca.shape)

在这里插入图片描述

4.5KNN模型的搭建与使用

模型搭建

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()  # 建立KNN模型  
knn.fit(X_train_pca, y_train)  # 用降维后的训练集进行训练模型

模型预测

y_pred = knn.predict(X_test_pca)  # 用降维后的测试集进行测试
print(y_pred)  # 将对测试集的预测结果打印出来

在这里插入图片描述
将预测值和实际值进行对比

import pandas as pd
a = pd.DataFrame()  # 创建一个空DataFrame 
a['预测值'] = list(y_pred)
a['实际值'] = list(y_test)

a.head()  # 查看表格前5行

在这里插入图片描述
查看预测准确度

from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)

在这里插入图片描述


📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs+vue+springboot+python电影放映厅购票网站

&#xff08;结合完成了以上的基本目标之后&#xff0c;能够帮助管理人员对系统的方便管理&#xff0c;从而能够为管理员节省时间&#xff0c;给了用户极大的方便。系统中的数据要存储于数据库当中&#xff0c;能够通过SQL代码把数据库中的数据取出&#xff0c;映射到实体类中&…

Classic AUTOSAR专题 | 存储模块简介

往期小怿向各位小伙伴介绍了Classic AUTOSAR的OS模块&#xff0c;相信看过的小伙伴对Classic AUTOSAR的OS已经有基本的认知了&#xff0c;本期我们将继续介绍Classic AUTOSAR专题之存储模块的知识。 目录 1.AUTOSAR存储模块概述 2.NvM功能简介 3.应用层SWC如何访问NvM 4.小…

在Docker中安装并运行Redis(纯步骤)

在Docker中安装并运行Redis容器实例 此文章只有操作步骤&#xff0c;没有原理解释&#xff0c;只供学习时提醒安装步骤。 安装并运行可以分为四步 第一步&#xff1a;安装redis镜像 从远程仓库上查询redis的相关版本信息&#xff08;可以省略&#xff09; docker search red…

mac环境VSCode 配置C++,并写Hello World

安装VSCode&#xff0c;点击下载链接&#xff0c;下载Mac版本的vscode。安装“C extension for VS Code”&#xff0c;在扩展 (⇧⌘X)中搜索c&#xff0c;并安装确保CLANG安装成功。在mac的终端下输入clang --version&#xff0c;如果安装成功会打印相关信息&#xff0c;未成功…

《基于深度卷积神经网络的光电容积脉搏图血管老化评估》阅读笔记

目录 一、论文摘要 二、十个问题 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一…

亚马逊云科技帮助创新成长企业云端构建、全球化布局及规模化增长

4月13日&#xff0c;以“加速创新&#xff0c;成就未来”为主题的亚马逊云科技创新成长中国行深圳论坛圆满举行。会上亚马逊云科技宣布&#xff0c;将围绕创新成长企业的三大业务需求——云上创新、出海拓展、业务加速&#xff0c;提供行业聚焦、技术支撑、伙伴扶持、人才培养四…

Dubbo 高级特性 (3)

其实Dubbo的官方文档非常强大&#xff0c;里面的各种各样的标签都会介绍到&#xff0c;但是最新版的官方文档好像找不那么多详细的使用了。在此&#xff0c;我推荐一篇博客&#xff0c;里面列举的也蛮全面的&#xff0c;可以参考&#xff1a; dubbo配置参考手册_dubbo使用手册_…

前端叹了口气,并表示谣言止于智者

如何评价此次“前端已死”言论引起的轩然大波&#xff1f; 从市景角度来看&#xff0c;那就是“一传十&#xff0c;十传百&#xff0c;越传越离谱”。 从新闻角度来看&#xff0c;是“传播扭曲效应”&#xff0c;指信息传播的链条越长&#xff0c;信息越失真。 用《乌合之众…

博客系统[Java]

目录 一.准备工作 二.实现数据库代码(JDBC) 1.创建数据库/表结构>数据库设计 2.封装数据库(Model) 1>创建DBtil封装数据库连接操作 2>创建实体类-->表示一条记录 3>封装针对数据的增删改查 三.博客列表页 1.约定前后端 2.编写服务器代码 3.编写客户端…

【笔试强训选择题】Day7.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

使用注解实现REDIS分布式锁

一、业务背景 有些业务请求&#xff0c;属于耗时操作&#xff0c;需要加锁&#xff0c;防止后续的并发操作&#xff0c;同时对数据库的数据进行操作&#xff0c;需要避免对之前的业务造成影响。 二、分析流程 使用 Redis 作为分布式锁&#xff0c;将锁的状态放到 Redis 统一…

【传统方式部署kafka集群,efak 与迁移至k8s】

简介 Zookeeper集群&#xff1b;&#xff08;必须事先准备&#xff09;&#xff1b; 1、介绍kafka是什么&#xff1b;消息队列&#xff1b;kafka就是一个消息队列MQ&#xff1b; elk需要使用kafka来传递日志消息&#xff1b;一、传统方式部署kafka集群 1 环境说明 192.168.…

C++——类和对象[上]

目录 1.初识面向对象 2.类的引入 3.类的定义 4.成员变量的命名规则 5.类的实例化 6.类对象模型 7.this指针 1.初识面向对象 C语言是一门面向过程的语言&#xff0c;它关注的是完成任务所需要的过程&#xff1b;C是一门面向对象的语言&#xff0c;将一个任务分为多个对…

思维链Prompting促进大型语言模型的推理能力

论文标题&#xff1a;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 论文链接&#xff1a;https://arxiv.org/abs/2201.11903 论文来源&#xff1a;NeurIPS 2022 一、概述 近来NLP领域由于语言模型的发展取得了颠覆性的进展&#xff0c;扩大语言模型…

【接口自动化测试】selenium旗舰版Web测试理论篇

【接口自动化测试】selenium旗舰版Web测试理论篇 一、Web自动化测试 1.1 简介 1.2 优势 1.3 E2E测试 二、主流的Web自动化测试工具 三、SeleniumWeb自动化测试 3.1 conda终端一键搭建命令 3.2 测试浏览器 3.2.1 步骤①&#xff1a;自动打开浏览器 3.2.2 步骤②&#…

基于pytorch的车牌识别(一)

目录 CCPD2019数据集CCPD数据集标注信息单例再现 CCPD2019数据集 本项目所有的数据都是基于CCPD2019数据集&#xff0c;CCPD2019数据集包含了25万多幅中国城市车牌图像和车牌检测与识别信息的标注&#xff0c;主要采集于合肥市&#xff0c;采集人员手持Android POS机对停车场的…

轻量级网络EfficientNetB0,利用迁移学习中的微调技术进行小样本轴承故障诊断(Python代码,带有数据集,训练集集的每类只需10个样本)

1. 训练集数量&#xff08;正常类别&#xff1a;10个&#xff0c;内圈故障&#xff1a;10个&#xff0c;外圈故障&#xff1a;10个&#xff0c;滚动体故障&#xff1a;10个&#xff09; 测试集数量&#xff08;正常类别&#xff1a;90个&#xff0c;内圈故障&#xff1a;90个&…

LeetCode第160题——相交链表(Java)

题目描述&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交**&#xff1a;** 题目数据 保证 整个链式结构中不存在环。 注意&…

非线性扰动观测器的基本设计

非线性扰动观测器的基本设计 目录 非线性扰动观测器的基本设计前言问题描述扰动观测器设计小结参考资料 前言 因为看到论文中有扰动观测器的设计&#xff0c;但只是大概地明白设计的原理&#xff0c;实际上不明白扰动观测器是如何设计出来的。因此在查阅了相关文献和文章后&am…

树的刷题,嗝

今天忘记带本子了,就没有学习java了,于是一心刷题,好烦遇到了两个奇怪的题目,我没跟题解写的,但是我是没想到奇怪的样例. no.1 617. 合并二叉树 难度简单1221收藏分享切换为英文接收动态反馈 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中…