Python | 机器学习之PCA降维

🌈个人主页: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转换为RGBplt.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.mzph.cn/news/145132.shtml

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

相关文章

如何在Jupyter Lab中安装不同的Kernel

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

Jupyter Notebook的下载安装与使用教程_Python数据分析与可视化

Jupyter Notebook的下载安装与使用 Jupyter简介下载与安装启动与创建NotebookJupyter基本操作 在计算机编程领域,有一个很强大的工具叫做Jupyter。它不仅是一个集成的开发环境,还是一个交互式文档平台。对于初学者来说,Jupyter提供了友好的界…

linux实现SSH免密登录设置,以及shell脚本实现

原创/朱季谦 最近在搭建linux集群,做了SSH免密登录的设置,正好把过程记录一下: 一.用搭建好的两台虚拟机做演示,A机器:192.168.200.129,B机器:192.168.200.128 二.分别在两台机器上执行以下步…

机器人制作开源方案 | 守护一体化护耆卫士

作者:白玲玲、张硕、孔亚轩单位:兰州理工大学指导老师:毕广利 1. 场景调研 “探索者”平台是结合机械、电子、传感器、计算机软硬件、控制、人工智能和造型技术等众多的先进技术研发推出的专业型机器人设备原型设计工具,包含机构…

利用jquery对HTML中的名字进行替代

想法&#xff1a;将网页中经常要修改的名字放在一个以jquery编写的js文件中&#xff0c;如果需要修改名字&#xff0c;直接修改js文件中的名字即可。 新建name_07.html文件&#xff0c;写入下面的代码&#xff1a; <!DOCTYPE html> <html> <head><meta …

Excel Unix时间戳和日期时间格式的相互转换

时间戳转日期时间 ((A18*3600)/86400)DATE(1970,1,1) # 或 (A18*3600)/8640070*36519# 带格式化 TEXT((C18*3600)/8640070*36519,"yyyy-mm-dd hh:mm:ss")首先加8小时进行时区转换&#xff0c;然后转换成天数&#xff0c;再加上1970年1月1日&#xff0c;最后设置日期…

kafka分布式安装部署

1.集群规划 2.集群部署 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html &#xff08;1&#xff09;上传并解压安装包 [zhangflink9wmwtivvjuibcd2e package]$ tar -zxvf kafka_2.12-3.3.1.tgz -C ../software/&#xff08;2&#xff09;修改解压后的文件…

休闲娱乐 - 挂耳咖啡

公司有一个小的茶歇间&#xff0c;平时去喝个咖啡、放松身心、锻炼下身体。咖啡机是现磨咖啡豆的&#xff0c;喝喝就习惯了。 而我旁边一位同事习惯每天早上来自己泡一杯挂耳咖啡&#xff0c;再配上牛奶&#xff0c;感觉挺高级的。 关于挂耳咖啡就查了一下资料&#xff0c;介绍…

DDR SDRAM 学习笔记

一、基本知识 1.SDRAM SDRAM : 即同步动态随机存储器&#xff08;Synchronous Dynamic Random Access Memory&#xff09;, 同步是指其时钟频率与对应控制器&#xff08;CPU/FPGA&#xff09;的系统时钟频率相同&#xff0c;并且内部命令 的发送与数据传输都是以该时钟为基准…

web环境实现一键式安装启动

部署的痛点 一般在客户环境安装web环境&#xff0c;少说需要花费1-2小时。一般需要安装jdk、nginx、mysql、redis等 等你接触到了inno setup &#xff0c;你有可能会节约更少的时间去部署。也有可能是一个不懂技术的人&#xff0c;都可以进行操作的。废话不多说&#xff0c;接…

Ansible 企业实战详解

一、ansible简介1. ansible是什么2.ansible的特点ansible的架构图 二、ansible 任务执行1、ansible 任务执行模式2、ansible 执行流程3、ansible 命令执行过程 二 .Ansible安装部署1.yum安装2.ansible 程序结构3、ansible配置文件查找顺序4、ansible配置文件5.ansible自动化配置…

yolov5模型代码怎么修改

yaml配置文件 深度乘积因子 宽度乘积因子 所有版本只有这两个参数的不同&#xff0c;s m l x逐渐加宽加深 各种类型层参数对照 backbone里的各层&#xff0c;在这里解析&#xff0c;只需要改.yaml里的各层参数就能控制网络结构 修改网络结构 第一步&#xff1a;把新加的模块…

C++打怪升级(十一)- STL之list

~~~~ 前言1. list是什么2. list接口函数的使用1. 构造相关默认构造n个val构造迭代器范围构造拷贝构造 2 赋值运算符重载函数2 析构函数3 迭代器相关begin 和 endrbegin 和rend 4 容量相关emptysize 5 元素访问相关frontback 6 修改相关push_backpop_backpush_frontpop_frontins…

二进制的形式在内存中绘制一个对象实例

一、引用类型实例的内存布局 从内存布局的角度来看&#xff0c;一个引用类型的实例由如下图所示的三部分组成&#xff1a;ObjHeader TypeHandle Fields。前置的ObjHeader用来缓存哈希值和同步状态&#xff0c;TypeHandle部分存储类型对应方法表&#xff08;Method Table&…

并发编程之生产者消费者模型

什么是生产者消费者模型 生产者消费者模型是多线程中一个比较典型的模型。 打个比方&#xff1a;你是一个客户&#xff0c;你去超市里买火腿肠。 这段话中的 "你"就是消费者&#xff0c; 那么给超市提供火腿肠的供货商就是生产者。超市呢&#xff1f;超市是不是被…

Scrapy----Scrapy简介

文章目录 概述与应用背景架构和组件功能和特点社区生态概述与应用背景 Scrapy,一个高效、灵活、且强大的Web爬取框架,被广泛应用于数据抓取和网页内容的结构化提取。它是用Python编写的,支持多平台运行,适用于数据挖掘、在线零售信息收集、历史数据存档等多种场景。Scrapy…

【ArcGIS处理】行政区划与流域区划间转化

【ArcGIS处理】行政区划与流域区划间转化 引言数据准备1、行政区划数据2、流域区划数据 ArcGIS详细处理步骤Step1&#xff1a;统计行政区划下子流域面积1、创建批量处理模型2、添加批量裁剪处理3、添加计算面积 Step2&#xff1a;根据子流域面积占比均化得到各行政区固定值 参考…

设计基于STM32F103C8T6微控制器的巡线小车

巡线小车是一种能够在一条预定线追踪路径的小车&#xff0c;广泛应用于工业自动化、物流仓储、智能家居等领域。本设计将使用STM32F103C8T6微控制器来实现一个基础的巡线小车。 硬件组成&#xff1a;1. STM32F103C8T6微控制器开发板&#xff1a;作为巡线小车的核心控制器&…

如何快速搭建Spring Boot接口调试环境并实现公网访问

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

用归并排序算法merge_sort( )求解 逆序对的数量 降低时间复杂度为 nlogn

题目简述 给定一个序列有n个数&#xff0c;求n个数中逆序对的个数&#xff0c;逆序对的定义&#xff1a;i < j && a[i] > a[j]。 输入格式 第一行包含一个整数n。 第二行包含 n 个整数&#xff08;所有整数均在1~1e9范围内&#xff09;&#xff0c;表示整数数…