Python | 机器学习之PCA降维

news2024/11/29 0:52:03

🌈个人主页:Sarapines Programmer
🔥 系列专栏:《人工智能奇遇记》
🔖少年有梦不应止于心动,更要付诸行动。

目录结构


1. 机器学习之PCA降维概念

1.1 机器学习

1.2 PCA降维

2. PCA降维

2.1 实验目的

2.2 实验准备

2.3 实验原理

2.4 实验内容

2.5 实验心得

致读者


1. 机器学习之PCA降维概念

1.1 机器学习

传统编程要求开发者明晰规定计算机执行任务的逻辑和条条框框的规则。然而,在机器学习的魔法领域,我们向计算机系统灌输了海量数据,让它在数据的奔流中领悟模式与法则,自主演绎未来,不再需要手把手的指点迷津。

机器学习,犹如三千世界的奇幻之旅,分为监督学习、无监督学习和强化学习等多种类型,各具神奇魅力。监督学习如大师传道授业,算法接收标签的训练数据,探索输入与输出的神秘奥秘,以精准预测未知之境。无监督学习则是数据丛林的探险者,勇闯没有标签的领域,寻找隐藏在数据深处的秘密花园。强化学习则是一场与环境的心灵对话,智能体通过交互掌握决策之术,追求最大化的累积奖赏。

机器学习,如涓涓细流,渗透各行各业。在图像和语音识别、自然语言处理、医疗诊断、金融预测等领域,它在智慧的浪潮中焕发生机,将未来的可能性绘制得更加丰富多彩。

1.2 PCA降维

PCA(Principal Component Analysis),主成分分析,是一种常用的降维技术。其主要目的是通过线性变换,将原始数据投影到一个新的坐标系中,使得数据在新坐标系中的方差尽可能大,从而减少数据的维度。

PCA的工作原理是找到数据中方差最大的方向,将数据映射到这个方向上,形成第一个主成分。然后,在与第一个主成分正交的方向上找到第二大方差的方向,形成第二个主成分,依此类推。通过选择最大方差的前几个主成分,就可以实现对数据维度的降低。

降维的好处在于可以减少数据的冗余性,提高计算效率,去除噪声,同时保留数据中的主要结构和特征。在实际应用中,PCA常被用于处理高维数据,例如图像处理、模式识别和数据压缩等领域。通过选择合适数量的主成分,可以在保持数据信息的同时显著减少数据的维度。

机器学习源文件icon-default.png?t=N7T8https://download.csdn.net/download/m0_57532432/88521407


2. PCA降维

2.1 实验目的

(1)理解和掌握PCA原理;

(2)利用PCA降维,辅助完成一项实战内容。


2.2 实验准备

(1)安装机器学习必要库,如NumPy、Pandas、Scikit-learn等;

(2)配置环境用来运行 Python、Jupyter Notebook和相关库等内容。


2.3 实验原理

矩阵的主成分就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的特征值就是第一主成分,其次是第二主成分,以此类推。

算法流程:

图4-1

2.4 实验内容

人脸识别步骤

1.利用给定的数据集,执行上述算法,得到投影矩阵W;

2.计算训练集的投影后的矩阵:P=WX;

3.加载一个测试图片T,测试图片投影后的矩阵为:TestT=WT;

4.计算TestT和P中每个样本距离,选出最近的那个即可。

5.做成可视化界面 显示投影前后的两张图片。

具体内容:

使用PCA降维人脸代码如下:

import matplotlib
import numpy as np
from sklearn.decomposition import PCA
from sklearn.datasets import fetch_olivetti_faces
import matplotlib.pyplot as plt
import cv2
matplotlib.use('TkAgg') # 指定交互式框架为TkAgg
# 加载人脸数据集
faces = fetch_olivetti_faces()
X = faces.data

# 将人脸数据进行PCA降维
pca = PCA(n_components=50)
X_pca = pca.fit_transform(X)

# 将降维后的数据进行逆转换
X_restored = pca.inverse_transform(X_pca)

# 随机选择一张人脸图片
face = X[20].reshape(64, 64)
face_restored = X_restored[20].reshape(64, 64)

# 使用均值滤波器模糊图像
face_blur = cv2.blur(face_restored, (20, 20))

# 显示结果
fig, axs = plt.subplots(1, 3, figsize=(10, 5))
axs[0].imshow(face, cmap='gray')
axs[0].set_title('Original Face')
axs[1].imshow(face_restored, cmap='gray')
axs[1].set_title('Restored Face')
axs[2].imshow(face_blur, cmap='gray')
axs[2].set_title('Blurred Face')
plt.show()

PCA降维后运行结果:

图4-2

源码分析:

我实现加载Olivetti人脸数据集,使用PCA对人脸数据进行降维,并通过逆转换恢复了部分原始数据。然后,选择其中一张人脸图像进行处理,包括模糊处理,并使用Matplotlib库在图形界面中展示了原始人脸图像、恢复的人脸图像和模糊的人脸图像。这样可以直观地比较PCA降维对人脸图像的影响以及图像处理的效果。

1.导入必要的库:

  1. matplotlib:用于图像展示。
  2. numpy:用于数据处理和数组操作。
  3. sklearn.decomposition.PCA:用于进行主成分分析(PCA)降维。
  4. sklearn.datasets.fetch_olivetti_faces:用于获取Olivetti人脸数据集。
  5. cv2:OpenCV库,用于图像处理。

2.设置交互式框架:

  1. matplotlib.use('TkAgg'):指定使用TkAgg作为交互式框架,这是一种用于在图形用户界面中显示图形的后端。

3.加载人脸数据集:

  1. fetch_olivetti_faces():从Olivetti人脸数据集中加载人脸图像数据。
  2. faces.data:获取加载的人脸数据。

4.进行PCA降维:

  1. PCA(n_components=50):创建一个PCA对象,将数据降维到50个主成分。
  2. pca.fit_transform(X):对人脸数据进行PCA降维,返回降维后的数据集X_pca。

5.进行逆转换:

  1. pca.inverse_transform(X_pca):将降维后的数据X_pca进行逆转换,返回重建的人脸数据X_restored。

6.随机选择一张人脸图片:

  1. X[20]:选择人脸数据集中的第21个样本(索引从0开始)。
  2. X[20].reshape(64, 64):将一维的人脸数据转换为64x64的二维图像表示,得到原始人脸图像。

7.使用均值滤波器模糊图像:

  1. cv2.blur(face_restored, (20, 20)):使用20x20的均值滤波器对face_restored进行图像模糊处理,得到模糊的人脸图像face_blur。

8.显示结果:

  1. 创建一个1行3列的子图布局,用于在同一画布上显示原始人脸图像、重建的人脸图像和模糊的人脸图像。
  2. axs[0].imshow(face, cmap='gray'):在第一个子图上显示原始人脸图像,使用灰度颜色映射。
  3. axs[1].imshow(face_restored, cmap='gray'):在第二个子图上显示重建的人脸图像,使用灰度颜色映射。
  4. `axs[2].imshow(face_blur, cmap 'gray')`:在第三个子图上显示模糊的人脸图像,使用灰度颜色映射。
  5. axs[0].set_title('Original Face'):设置第一个子图的标题为"Original Face"。
  6. axs[1].set_title('Restored Face'):设置第二个子图的标题为"Restored Face"。
  7. axs[2].set_title('Blurred Face'):设置第三个子图的标题为"Blurred Face"。
  8. plt.show():显示图像结果。

除了实现上述的基本要求,我额外实现了读取本地的图片识别人脸和调用本地电脑摄像头实时识别人脸。

1. 读取本地的图片识别人脸

代码如下:

# 导入所需要使用的包
import cv2
import paddlehub as hub
from matplotlib import pyplot as plt

# 加载Paddlehub人脸检测模型
face_detector = hub.Module(name="pyramidbox_lite_mobile")

# 使用模型进行图片预测
result = face_detector.face_detection(paths=['./img/1.jpg'],  # 图片路径列表
                                      use_gpu=False,  # 是否使用GPU进行推理
                                      visualization=True,  # 是否可视化结果
                                      output_dir='./output',  # 输出目录路径
                                      confs_threshold=0.5)  # 置信度阈值

# 打印检测结果
print(result)

# 显示可视化图片
output = cv2.imread('./output/555.jpg')  
# 读取可视化结果图片

output = output[:, :, ::-1] 
# 将图片通道顺序由BGR转换为RGB

plt.imshow(output)  
# 显示图片

运行结果:

图4-2 (a)为输入,(b)为输出

2. 调用本地电脑摄像头实时识别人脸

代码如下:

# 导入必要的库
import cv2  
# 导入OpenCV库,用于图像处理和显示
import paddlehub as hub  
# 导入Paddlehub库,用于加载和使用Paddlehub模型

# 加载Paddlehub人脸检测模型
face_detector = hub.Module(name="pyramidbox_lite_mobile") 
# 使用Paddlehub的pyramidbox_lite_mobile模型进行人脸检测

# 调用摄像头,参数为0时,即调用系统默认摄像头,如果有其他的摄像头可以调整参数为1,2等
cap = cv2.VideoCapture(0)  
# 创建一个VideoCapture对象,用于读取摄像头的视频流

while True:
# 从摄像头读取图片
sucess, img = cap.read() 
 # 读取摄像头的视频流,并将每一帧存储为图像

# 从图片中检测人脸位置,默认开启GPU推理,若无GPU环境,请将use_gpu设置为False
result = face_detector.face_detection(images=[img], use_gpu=False)  
# 使用加载的人脸检测模型对图像进行人脸检测

    # 遍历结果并绘制矩形框
    if result[0]['data'] != []:
        for face in result[0]['data']:
            # 将Dict形式的key-value对转换成变量形式
            locals().update(face)  
            # 将人脸检测结果中的每个人脸信息存储为变量
            
            print('bbox:', [left, top, right, bottom])  
            # 打印人脸边界框的坐标信息
            # 绘制矩形框
            
            cv2.rectangle(img, tuple([left, top]), tuple([right, bottom]), (255, 0, 0), 2)  
            # 在图像上绘制人脸边界框

    # 显示图像
    cv2.imshow("img", img)  
# 在窗口中显示处理后的图像

    # 保持画面的持续。
    k = cv2.waitKey(1)  
    # 等待用户按键输入,等待时间为1毫秒

    if k == 27:
        # 通过esc键退出摄像
        cv2.destroyAllWindows()  # 关闭所有窗口
        break
# 关闭摄像头
cap.release()  # 释放摄像头资源

运行结果:

图4-3 实时输出结果

2.5 实验心得

通过本次实验,我成功实现了人脸识别的关键步骤,运用机器学习算法进行学习和应用。实验主要包括以下几个步骤:

  1. 利用fetch_olivetti_faces函数加载人脸数据集,将数据存储在变量X中。通过PCA算法将数据进行降维,将维度减少到50。

  2. 进行降维后数据的逆转换,使用PCA.inverse_transform()得到重建后的人脸数据,实现维度还原。

  3. 随机选择一张人脸图片,展示原始、重建以及模糊后的人脸图像。

  4. 利用PaddleHub库加载人脸检测模型,对测试图片进行人脸检测和可视化。

  5. 使用OpenCV和PaddleHub库进行实时人脸检测,并将检测结果嵌入摄像头的视频流中,实现实时人脸识别。

这些步骤涵盖了从数据加载、降维处理到模型应用和实时检测的全面流程。通过详细的代码说明,展现了人脸识别算法的实际应用和实验成果。


致读者

风自火出,家人;君子以言有物而行有恒

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

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

相关文章

Linux(多用户下)查看cuda、cudnn版本、查看已经安装的cuda版本相关命令

查看已经安装的CUDA多个版本 linux 中cuda默认安装在/usr/local目录中: -可以使用命令: ls -l /usr/local | grep cuda查看该目录下有哪些cuda版本: 如果输出: lrwxrwxrwx 1 root root 21 Dec 17 2021 cuda -> /usr/loc…

Python windows安装Python3环境

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

企业计算机服务器中了faust勒索病毒怎么办,faust勒索病毒解密文件恢复

网络技术的不断应用发展,为企业注入了新的生产运营方式,计算机服务器为企业的数据存储提供了便利,让企业的生产运营得到了有力保障,近期,云天数据恢复中心陆续接到很多企业的求助,企业的计算机服务器遭到了…

操作符前提:各种进制与各种码(计算机基础)

1.进制 A.二进制与各种转换 其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进制、10进制、16进制是数值的不同表⽰形式⽽已。 ⽐如:数值15的各种进制的表⽰形式: 15的2进制&#xff1…

Qt按钮大全续集(QCommandLinkButton和QDialogButtonBox )

## QCommandLinkButton 控件简介 QCommandLinkButton 控件中文名是“命令链接按钮”。QCommandLinkButton 继承QPushButton。CommandLinkButton 控件和 RadioButton 相似,都是用于在互斥选项中选择一项。表面上同平面按钮一样,但是 CommandLinkButton 除带有正常的按钮上的文…

为什么原生IP可以降低Google play账号关联风险?企业号解决8.3/10.3账号关联问题?

在Google paly应用上架的过程中,相信大多数开发者都遇到过开发者账号因为关联问题,导致应用包被拒审和封号的情况。 而众所周知,开发者账号注册或登录的IP地址及设备是造成账号关联的重要因素之一。酷鸟云最新上线的原生IP能有效降低账号因I…

使用Python进行可视化

字不如表,表不如图 在使用python进行数据分析的过程中,绘制图表常常是理解数据最为关键的一步; Python提供了5大可视化库: Matplotlib:是Python可视化库中的泰斗,公认的可视化工具,可以方便地…

xv6第一章:Operating system interfaces

操作系统通过接口为程序提供服务。xv6只包含一些基本的接口,如上图。 xv6采用kernel的方式。kernel是一种特殊的程序为一般程序提供服务。计算机中有许多进程但是只有一个进程。 当一个进程需要使用kernel服务,需要进行system call。 system call后&am…

Cesium+Vue:地形开挖

作者:CSDN @ _乐多_ 本文记录了在Cesium中进行地形开挖的方法和代码。使用Vue框架。 效果如下所示, 文章目录 前言:配置Cesium一、Vue文件二、创建地形开挖函数库三、创建绘制图形库四、创建提示语库前言:配置Cesium 参考《Vue:Vue项目中的Cesium配置备忘录》

Java小游戏之——贪吃蛇

今天详细讲解写贪吃蛇的遇到的问题 代码: Main类 GrameStart类 GamePanel类 启动main方法 在写贪吃蛇的时候,我接触到了两个新东西: 1.定时器Timer类。 2.paint()绘图方法。第一次出现在java.awt.Component类中&…

HackTheBox-Starting Point--Tier 2---Included

文章目录 一 Included 测试过程1.1 打点1.2 横向移动1.3 权限提升 二 题目 一 Included 测试过程 1.1 打点 1.端口扫描 nmap -sV -sC 10.129.193.212.访问web站点 3.文件包含漏洞探测 观察请求地址:http://10.129.193.21/?filehome.php,利用file参数动…

【ISP图像处理】Demosaic去马赛克概念介绍以及相关方法整理

1. 基本定义 使用彩色滤光器阵列(CFA)的数码相机需要一个去马赛克程序来形成完整的RGB图像。一般的相机传感器都是采用彩色滤光片阵列(CFA)放置在光感测单元上,在每个像素处仅捕获三种原色成分中的一种。 去马赛克方法主要关注于复原非常规区域,比如边缘…

解决:Error: Missing binding xxxxx\node_modules\node-sass\vendor\win32-x64-83\

一、具体报错 二、报错原因 这个错误是由于缺少 node-sass 模块的绑定文件引起的。 三、导致原因 3.1、环境发生了变化 3.2、安装过程出现问题 四、解决方法步骤: 4.1、重新构建 node-sass 模块 npm rebuild node-sass 4.2、清除缓存并重新安装依赖 npm c…

通付盾Web3专题 | KYT/AML:Web3合规展业的必要条件

与传统证券一样,基于区块链技术发展出来的虚拟资产交易所经历了快速发展而缺乏有效监管的行业早期。除了科技光环加持的各种区块链项目方、造富神话之外,交易所遭到黑客攻击、内部偷窃作恶、甚至经营主体异常而致使投资人血本无归的案例亦令人触目惊心。…

Unity中Shader矩阵的转置矩阵

文章目录 前言一、转置的表示二、转置矩阵三、转置矩阵的总结1、(A^T^)^T^ A2、(A B)^T^ A^T^ B^T^3、(kA)^T^ kA^T^ (k为实数)4、(AB)^T^ B^T^A^T^5、如果 A A^T^ 则称A为对称矩阵6、如果 AA^T^ I(单位矩阵),则称 A 为正交矩阵,同时 A^T^ A^-1…

Day32力扣打卡

打卡记录 买卖股票的最佳时机 IV(状态机DP) 链接 class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:n len(prices)max lambda x, y: x if x > y else yf [[-0x3f3f3f3f] * 2 for _ in range(k 2)]for i in range(k 2…

web 前台页面内弹出框(一)

本文已经不推荐在使用了,有更加优秀的 ,详情参考layui弹出层 前端当前页面编辑一些数据时,往往会用到弹出窗口,但每个页面单独修改有显得比较麻烦,因此,可以建立一个公用的方法,去掉用就可以了&…

深度学习之基于YoloV5苹果新鲜程度检测识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 深度学习之基于 YOLOv5 苹果新鲜程度检测识别系统介绍YOLOv5 简介苹果新鲜程度检测系统系统架构应用场景 二、功能三、系统四. 总结 一项目简介 深度学习之…

5.0 Java API

API(Application Programming Interface)指的是应用程序编程接口,API可以让编程变得更加方便简单。Java也提供了大量API供程序开发者使用,即Java API。Java API指的就是JDK提供的各种功能的Java类库,如之前所讲的Array…

C++运算符重载详解(日期类实操)

前言&#xff1a;为什么要实现运算符重载&#xff1f; 在C语言中&#xff0c;对于内置类型&#xff0c;我们可以根据符号>、<、等去直接比较大小&#xff0c;但是对于自定义来说&#xff0c;肯定不能直接比较大小&#xff0c;例如下面的日期类&#xff0c;想要比较两个两…