机器学习——主成分分析(PCA)

目录

背景

引入 

特征维度约减

特征维度约减的概念

为何要维度约减?

维度约减的应用

常规维度约减方法

主成分分析

主成分分析 (PCA)基本思路

主成分的代数定义和代数推导

主成分的代数定义

主成分的代数推导

PCA算法两种实现方法

1、基于特征值分解协方差矩阵实现PCA算法

2、基于SVD分解协方差矩阵实现PCA算法

PCA具体实现

数据集介绍

具体代码实现及运行结果

数据获取

PCA降维

总结


背景

在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下,许多变量之间可能存在相关性,从而增加了问题分析的复杂性。如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。因此需要找到一种合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。主成分分析与因子分析就属于这类降维算法。

引入 

PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法(非监督的机器学习方法)。其最主要的用途在于“降维”,通过析取主成分显出的最大的个别差异,发现更便于人类理解的特征。也可以用来削减回归分析和聚类分析中变量的数目。

特征维度约减

特征维度约减的概念

• 特征约减的目的是将高维特征向量映射到低维子空间中.

• 给定n个样本(每个样本维度为p维){x1,x2,……xn}
通过特征变换/投影矩阵实现特征空间的压缩:

为何要维度约减?

•大多数机器学习算法在高维空间中表现不够鲁棒
–Curse of Dimensionality
–查询速度与精度随着维度增加而降低.
•有价值的维度往往很少
–例如,在基因序列中对于特定疾病有价值的点位十分有限.        

• 可视化: 高位数据在 2D 或 3D空间中的可视化
• 维度约减: 高效的存储与检索
• 噪声消除: 提升分类或识别精度

维度约减的应用

常规维度约减方法

• 无监督方法
– Latent Semantic Indexing (LSI): truncated SVD
– Independent Component Analysis (ICA)
– Principal Component Analysis (PCA)
– Canonical Correlation Analysis (CCA)
• 监督方法
– Linear Discriminant Analysis (LDA)
• 半监督方法
– Research topic

主成分分析

主成分分析 (PCA)基本思路

–通过协方差分析,建立高维空间到低维空间的线性映射/矩阵
–保留尽可能多的样本信息
–压缩后的数据对分类、聚类尽量不产生影响,甚至有所提升

•将原始高维向量通过投影矩阵,投射到低维空间
–这些向量称为主成分 (PCs), 具有无关性、正交的特点。重要的是这些向量的数量要远小于高维空间的维度。

主成分的代数定义和代数推导

主成分的代数定义

给定n个样本(每个样本维度为p维):

定义z_{1j}为样本x_{j}在第一主成分/主方向a1上的投影:

其中

我们的目标是找到a1, 使z1的方差最大。

主成分的代数推导

首先根据z1的方差定义,推导得出:

可以看出,S是维度之间的协方差矩阵,\bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_{i}是样本均值,在实际计算中,可以先将样本减去均值使得\bar{x}=0。

假设\bar{x}=0,根据样本组成的矩阵:

有协方差矩阵:

                                        可证明S半正定!

目标是找到主方向a1,使得z1的方差 a_{1}^{T}Sa_{1}最大化,且满足a_{1}^{T}a_{1}=1,令 λ 为一个 Lagrange 乘子,则有: 

得出a1是协方差矩阵 S 的特征向量。可验证a1对应的特征值,是S的最大特征值。

在a1的基础上,要计算下一个主成分a2,使得z2方差最大化,则有:

根据协方差定义,有:

分别令 λ 与 φ 为 Lagrange 乘子,问题变成最大化:

实际上可以求证a2也是协方差矩阵 S 的特征向量,且a2是S的第二大的特征向量。
以此类推, 可以验证:

• 协方差矩阵S的第k大特征向量对应数据的第k主成分
• 第k大特征向量对应的特征值,为投影到该主成分的方差

PCA算法两种实现方法

1、基于特征值分解协方差矩阵实现PCA算法

输入:数据集 X=\left \{ x_{1} , x_{2} , x_{3} ... x_{n} \right \},需要降到k维。

1、去平均值(即去中心化),即每一位特征减去各自的平均值。

2、计算协方差矩阵 \frac{1}{n}XX^{T},注:这里除或不除样本数量n或n-1,其实对求出的特征向量没有影响。

3、用特征值分解方法求协方差矩阵\frac{1}{n}XX^{T} 的特征值与特征向量。

4、对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P。

5、将数据转换到k个特征向量构建的新空间中,即Y=PX。

2、基于SVD分解协方差矩阵实现PCA算法

输入:数据集X=\left \{ x_{1} , x_{2} , x_{3} ... x_{n} \right \} ,需要降到k维。

1、去平均值,即每一位特征减去各自的平均值。

2、计算协方差矩阵。

3、通过SVD计算协方差矩阵的特征值与特征向量。

4、对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。

5、将数据转换到k个特征向量构建的新空间中。

在PCA降维中,我们需要找到样本协方差矩阵 XX^{T} 的最大k个特征向量,然后用这最大的k个特征向量组成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵 XX^{T},当样本数多、样本特征数也多的时候,这个计算还是很大的。当我们用到SVD分解协方差矩阵的时候,SVD有两个好处:

1、有一些SVD的实现算法可以先不求出协方差矩阵 XX^{T}也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解而是通过SVD来完成,这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是特征值分解。

2、注意到PCA仅仅使用了我们SVD的左奇异矩阵,没有使用到右奇异值矩阵,那么右奇异值矩阵有什么用呢?

假设我们的样本是m*n的矩阵X,如果我们通过SVD找到了矩阵 XX^{T}最大的k个特征向量组成的k*n的矩阵 V^{T},则我们可以做如下处理:

X{}'_{m*k}=X{}'_{m*n}V_{n*k}^{T}

可以得到一个m*k的矩阵X',这个矩阵和我们原来m*n的矩阵X相比,列数从n减到了k,可见对列数进行了压缩。也就是说,左奇异矩阵可以用于对行数的压缩;右奇异矩阵可以用于对列(即特征维度)的压缩。这就是我们用SVD分解协方差矩阵实现PCA可以得到两个方向的PCA降维(即行和列两个方向)。

PCA具体实现

数据集介绍

ORL人脸数据集一共包含40个不同人的400张图像,此数据集下包含40个目录,每个目录下有10张图像,每个目录表示一个不同的人。所有的图像是以PGM格式存储,灰度图,图像大小宽度为92,高度为112。

具体代码实现及运行结果

数据获取

代码

%matplotlib inline
# 导入所需模块
import matplotlib.pyplot as plt
import numpy as np
import os
import cv2# plt显示灰度图片
def plt_show(img):plt.imshow(img,cmap='gray')plt.show()# 读取一个文件夹下的所有图片,输入参数是文件名,返回文件地址列表
def read_directory(directory_name):faces_addr = []for filename in os.listdir(directory_name):faces_addr.append(directory_name + "/" + filename)return faces_addr# 读取所有人脸文件夹,保存图像地址在faces列表中
faces = []
for i in range(1,41):faces_addr = read_directory('E:/2388412628/FileRecv/Face_Dataset/Face/ORL_Faces/s'+str(i))for addr in faces_addr:faces.append(addr)# 读取图片数据,生成列表标签
images = []
labels = []
for index,face in enumerate(faces):# enumerate函数可以同时获得索引和值image = cv2.imread(face,0)images.append(image)labels.append(int(index/10+1))print(len(labels))
print(len(images))
print(type(images[0]))
print(labels)

先读取ORL数据集下的所有图像,同时生成列表标签。下图表示一共有400个标签、400张图像、图像的数据类型以及标签的值。

输出前二十组图片

代码:

# 画出前20组人脸图像
# 创建画布和子图对象
fig, axes = plt.subplots(10,20,figsize=(20,10),subplot_kw = {"xticks":[],"yticks":[]} #不要显示坐标轴)
# 图片x行y列,画布x宽y高
# 填充图像
for i, ax in enumerate(axes.flat):ax.imshow(images[i],cmap="gray") #选择色彩的模式

运行结果:

PCA降维

接下来把每张图片数据降到一维,a.flatten()就是把a降到一维,默认是按横的方向降,每张图片的维度是1×10304,与图片的大小92×112=10304相符,将其转换为numpy数组,方便后面的计算。

# 图像数据矩阵转换为一维
image_data = []
for image in images:data = image.flatten()# a是个矩阵或者数组,a.flatten()就是把a降到一维,默认是按横的方向降image_data.append(data)
print(image_data[0].shape)# 转换为numpy数组
X = np.array(image_data)
y = np.array(labels)
print(type(X))
print(X.shape)

运行结果

接下来导入sklearn的PCA模块,根据标签,使用train_test_split()划分数据集,训练PCA模型,保留100个维度,输出100个特征脸,可以发现越到后面人脸越模糊,意味着所占的比重越小。

代码如下:

# 导入sklearn的pca模块
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split# 画出每个图像数据降到一维后的矩阵
import pandas as pd
data = pd.DataFrame(X)
data.head()

运行结果:

然后划分数据集,训练PCA模型,输出结果

代码如下:

# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(X, y, test_size=0.2) # train训练,test测试# 训练PCA模型
pca=PCA(n_components=100) # 保留100个纬度
pca.fit(x_train) # 训练过程# 返回训练集和测试集降维后的数据集
x_train_pca = pca.transform(x_train) # 转换过程
x_test_pca = pca.transform(x_test)
print(x_train_pca.shape) # 320个训练集,保留了100个特征
print(x_test_pca.shape) # 80个测试集,保留了100个特征V = pca.components_
V.shape
# 100个特征脸
# 创建画布和子图对象
fig, axes = plt.subplots(10,10,figsize=(15,15),subplot_kw = {"xticks":[],"yticks":[]} #不要显示坐标轴)
#填充图像
for i, ax in enumerate(axes.flat):ax.imshow(V[i,:].reshape(112,92),cmap="gray") #reshape规定图片的大小,选择色彩的模式

运行结果:

可以看出来,虽然我们把图片的维度从10304维降低到100维,但是我们还是可以看出图片的大致人脸形状,但是数据量就大大的减小了,每张图片降低了10000维度,这对我们数据处理等操作提供了很大的便利。

我们来看看降到100维的图片还保留了原来多少信息

pca.explained_variance_ratio_
# 返回特征所携带的数据是原始数据的多少
pca.explained_variance_ratio_.sum()

运行结果

可以看到,虽然降到了100维但依旧保留了90%的信息,可见PAC的强大之处。

总结

        主成分分析(PCA)是一种常用的多变量数据降维技术,具有广泛的应用领域。本次实验旨在通过PCA方法对数据集进行降维,经过实验,我们发现,通过PCA降维后,仅保留100个维度ORL人脸数据集依旧能保存90%的图片信息,而且还可以大大减少数据存储和处理的复杂度。PCA可以将原始数据降到较低维度,从而提高算法的效率和准确性。在这个实验中,首先读取了所有人脸图片,并将其转换为一维数组。然后使用PCA模型对训练集进行训练,并将训练集和测试集分别进行降维处理。最后,展示了前100个特征脸,并输出了每个新特征向量所占的信息量、特征所携带的数据等信息。

PCA的优点:

  1. 可以减少数据集中的噪声。PCA可以通过降维来去除数据中的噪声,从而提高模型的精度和可靠性。

  2. 可以提高算法的效率。通过降维处理,PCA可以减少特征数量,从而提高算法的效率。

  3. 可以揭示数据背后的本质特征。PCA可以将原始数据转换为新的特征向量,这些特征向量表示数据背后的本质特征,有助于理解数据的本质结构和规律。

PCA的缺点:

  1. 不能处理非线性关系。PCA是一种线性变换方法,无法处理非线性关系的数据。

  2. 容易受到极端值干扰。PCA的计算过程涉及到协方差矩阵的计算,如果数据集中存在极端值,则协方差矩阵可能会失真,从而导致PCA的效果不佳。

  3. 可能会丢失一些重要信息。PCA通常会将数据降维到一个较低的维度,这可能会导致一些重要信息被丢失。

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

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

相关文章

【Android Gradle 插件】Android Plugin DSL Reference 离线文档下载 ( GitHub 下载文档 | 查看文档 )

一、Android Plugin DSL Reference 文档下载 二、Android Plugin DSL Reference 文档查看 一、Android Plugin DSL Reference 文档下载 在之前的博客 【Android Gradle 插件】Android Plugin DSL Reference 文档介绍 ( 1.2 ~ 3.4 版本文档地址 | 4.1 ~ 7.1 版本文档地址 ) 中…

第三十七周周报:文献阅读+掩码、多头注意力机制+位置编码

目录 摘要 Abstract 文献阅读:基于注意力的LSTM大地震预报网络 现有问题 提出方法 基于注意力的LSTM网络 研究实验 实验目的 数据集 评估指标 数据预处理和特征提取 结果讨论 Masked Self-Attention(掩码自注意力) Muti-Head S…

vue3-11

后端Java代码 src\router\a6router.ts文件 import { createRouter, createWebHashHistory } from vue-router import { useStorage } from vueuse/core import { Menu, Route } from ../model/Model8080 const clientRoutes [{path: /login,name: login,component: () > …

flutter学习-day23-使用extended_image处理图片的加载和操作

文章目录 1. 介绍2. 属性介绍3. 使用 1. 介绍 在 Flutter 的开发过程中,经常会遇到图片的显示和加载处理,通常显示一个图片,都有很多细节需要处理,比如图片的加载、缓存、错误处理、图片的压缩、图片的格式转换等,如果…

WinForm开发 - C# RadioButton(单选框) 设置默认选中或取消默认选中

WinForm开发中RadioButton组件使用过程中的小技巧。 1、属性界面操作 如果有多个组件,希望不显示默认选中单选框只需要将其Checked属性全部设置为False即可, 如果希望默认多个组件中显示默认选中,将其Checked属性设置为True。 2、代码实…

爱吃饼干的小白鼠2023年终总结

目录 前言 学习生活经历 回顾2023 参加活动 回顾点点滴滴 展望2024 2024年新的起点和目标 前言 大家好,我是爱吃饼干的小白鼠。今天刚好是2024年1月1日,时间飞逝,2023年过的飞快,我已经入驻CSDN有一年了,这一年…

Rust学习笔记005:结构体 struct

在 Rust 中,struct 是一种用于创建自定义数据类型的关键字,它允许你定义和组织数据的结构。struct 可以包含多个不同类型的字段(fields),每个字段都有一个名称和一个类型。 定义结构体 下面是一个简单的例子&#xff…

MySQL8.0 ROW_NUMBER 调用案例

ROW_NUMBER()是一个窗口函数或分析函数,它为从1开始应用的每一行分配一个序号。 创建表和生成所需要的数据 CREATE TABLE chapter11 ( shopname VARCHAR(255) NULL, sales VARCHAR(255) NULL, sale_date DATE NULL ); INSERT INTO chapter11 (shopname, sales, sal…

大数据背景下基于联邦学习的小微企业信用风险评估研究

摘要: 小微企业信用风险评估难是制约其融资和发展的一个主要障碍。基于大数据的小微企业信用风险评估依然面临着单机构数据片面、跨机构数据共享难、模型不稳定等诸多挑战。针对相关问题和挑战,本项目拟在多主体所有权数据隐私保护与安全共享的背景下&am…

构建基础wlan网络 hcia无线

实验 旁挂组网 二层网络 ac为 dhcp的服务器给ap地址 s1给sta的ip地址 DHCP 业务为直接转发 实验步骤 第一步 poe 开启 poe en 开启 第二步 有线连接 vlan的配置 s1 vlan batch 100 101 连接的端口 port link-type trunk port trunk allow-pass …

NodeJs - Chrome内存分析工具使用

NodeJs - Chrome内存分析工具使用 一. 前期准备二. Chrome 内存分析工具使用2.1 查看快照2.2 使用案例 一. 前期准备 我们下载好相关依赖: npm i v8-profiler-next测试代码: const v8Profiler require(v8-profiler-next) const fs require(fs)funct…

听GPT 讲Rust源代码--library/alloc(2)

File: rust/library/alloc/src/vec/mod.rs 在Rust源代码中,rust/library/alloc/src/vec/mod.rs这个文件是Rust标准库中的Vec类型的实现文件。Vec是一个动态大小的数组类型,在内存中以连续的方式存储其元素。 具体来说,mod.rs文件中定义了以下…

Elasticsearch:使用 ELSER v2 文本扩展进行语义搜索

Elastic 提供了一个强大的 ELSER 供我们进行语义搜索。ELSER 是一种稀疏向量的搜索方法。我们无需对它做任何的微调及训练。它是一种 out-of-domain 的模型。目前它仅对英文进行支持。希望将来它能对其它的语言支持的更好。更多关于 ELSER 的知识,请参阅文章 “Elas…

MySql——1146 - Table‘mysql.proc‘doesn‘t exit是这个

项目场景: 做自己的小项目需要连接mysql数据库 问题描述 点击数据库时报错 1146 - Table’mysql.proc’doesn’t exit 原因分析: 误删原生的mysql数据库 解决方案: 重新安装装部署mysql就好了 注意不要轻易删除原生的东西

day55 算法训练|动态规划part15

392.判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的…

react学习第一天

脚手架的创建 1.创建环境变量 npm init -y 2.创建node-modules npm add -D create-react-app 3.创建脚手架 npx create-react-app react-demo1 报错一号 报错原因:node版本太低 解决:升级版本 nvm install 14.0.0 nvm use 14.0.0 报错二号 报错原因&…

牛客网SQL训练5—SQL大厂面试真题

文章目录 一、某音短视频1.各个视频的平均完播率2.平均播放进度大于60%的视频类别3.每类视频近一个月的转发量/率4.每个创作者每月的涨粉率及截止当前的总粉丝量5.国庆期间每类视频点赞量和转发量6.近一个月发布的视频中热度最高的top3视频 二、用户增长场景(某度信…

git上传代码到github远程仓库

1、添加SSH公钥 为了把本地的仓库传到github,还需要配置ssh key,说白了就是为了把本地的代码上传到github。 1、前置准备 本地需要安装git:Git - Downloads。安装成功后本地右键鼠标会多出一些git选项。 2、添加SSH Key 首先在本地创建s…

红队打靶练习:MISDIRECTION: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.12.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.12.1 00:50:56:c0:00:08 …

Linux环境下OpenSSH升级到 OpenSSH_9.5p1(内置保姆级教程)

我最近在修复服务器的openssh漏洞的时候是服务器生产环境,自己在做的时候,就遇到的重启之后直接断掉ssh的连接,最后发现原因是没配置sshd_config的允许远程用户登录,因此,在此记录一下升级openssh的操作步骤&#xff0…