【机器学习算法】主成分分析(PCA)

news2024/11/24 8:36:30

主成分分析(PCA)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OQ2UkQmi-1689528282890)(D:\YHT\SVD博客\13.png)]

PCA(Principal Component Analysis) 是实现数据降维的一种算法。正如其名,假设有一份数据集,每条数据的维度是d,PCA通过分析这d个维度的前k个主要特征(这k个维度在原有d维特征的基础上重新构造出来,且是全新的正交特征),将d维的数据映射到这k个主要维度上进而实现对高维数据的降维处理。 PCA算法所要达到的目标是,降维后的数据所损失的信息量应该尽可能的少,即这K个维度的选取应该尽可能的符合原始d维数据的特征。

本篇博客中所有的可视化及数据预处理代码已上传至github:

Machine-Learning/SVD_PCA at main · Scienthusiasts/Machine-Learning (github.com)

1.理论部分

PCA之所以能够实现将数据降维后依然最大程度保持原有数据的特征,主要依赖于对数据集每个维度两两之间的协方差(或方差)分析。

我们知道,协方差可以表示两种数据之间的相关性/分散程度。对数据的不同维度之间进行协方差分析,协方差的绝对值越大,表明两个维度越线性相关,越是相关的两个维度之间的信息熵越低(因为知道一个维度的分布就可以大差不差推出另一个维度的分布),信息熵越低则意味着合并这两个维度所损失的信息量越小。

因此,PCA通过寻找数据d个维度之间的最佳线性组合,找到其中的某一超平面(使得这一方向数据的方差或协方差最大)作为主成分,将数据投影到这个超平面上[如开头图所示], 将d个存在线性相关性的维度压缩为d-1一个维度(压缩的过程中舍弃的是方差最小的方向)。 而对于如何寻找这d个维度之间的最佳线性组合,则可以通过对数据集的协方差矩阵进行特征分解来实现。

而实际情况是,数据集所在的d维空间按照重要程度排序可以有多个主成分,选取其中的前k个最重要的主成分,将d维数据投影到这k个主成分上,舍弃相对不那么重要的d-k个成分,实现数据的降维。

实现PCA有两个基本出发点,一个是最大化投影方差,另一个是最小化投影距离,下面以最大化投影方差为例进行说明。

最大化投影方差

我们首先假设输入n条数据,每个数据原始有d维,以列优先存放,每一列是数据集的一条数据,数据集构成一个d行n列的矩阵X

假设将这d维数据投影到新的坐标轴上的投影矩阵W,W大小为k行d列(k<d)
X = [ x 1 , x 2 , … , x n ] , W = [ w 1 T w 2 T ⋮ w k T ] X=\left[x_1, x_2, \ldots, x_n\right], \quad W=\left[\begin{array}{c} w_1^{\mathrm{T}} \\ w_2^{\mathrm{T}} \\ \vdots \\ w_k^{\mathrm{T}} \end{array}\right] X=[x1,x2,,xn],W= w1Tw2TwkT
其中W是一个标准正交基,每一行w是一个单位向量,即满足:
w i T w j = δ i j = { 1 , i = j 0 , i ≠ j w_i^T w_j=\delta_{i j}=\left\{\begin{array}{l} 1, i=j \\ 0, i \neq j \end{array}\right. wiTwj=δij={1,i=j0,i=j
基于最大化投影方差,PCA的目标是,我们希望降维后还能更多的保留原来数据的信息量,而且降维后不同维度的相关性越小越好,这样去掉某些维度不影响剩余维度。

最大化投影方差(协方差)意在使投影后的数据点之间的方差(协方差)达到最大。首先给出投影之后的方差(协方差)公式,注意这里D(X)其实就是协方差矩阵。
D ( X ) = ∑ i = 1 n ( W x i −  mean  ) 2 D(X)=\sum_{i=1}^n\left(W x_i-\text { mean }\right)^2 D(X)=i=1n(Wxi mean )2
一般地,我们会提前将数据每一维度0均值化处理(mean=0),这样一来,就可以简化后续的推导步骤.
D ( X ) = 1 n − 1 ∑ i = 1 n ( W x i ) 2 = 1 n − 1 ∑ i = 1 n ( W x i ) ( W x i ) T = 1 n − 1 ∑ i = 1 n W x i x i T W T = 1 n − 1 ( W X X T W T ) = W ( 1 n − 1 X X T ) W T = W C o v ( X ) W T \begin{aligned} D(X) & =\frac{1}{n-1} \sum_{i=1}^n\left(W x_i\right)^2=\frac{1}{n-1} \sum_{i=1}^n\left(W x_i\right)\left(W x_i\right)^T \\ & =\frac{1}{n-1} \sum_{i=1}^n{W x_ix_i}^T W^T=\frac{1}{n-1}\left(W X X^TW^T\right)=W(\frac{1}{n-1}XX^T)W^T\\ & = WCov(X)W^T \end{aligned} D(X)=n11i=1n(Wxi)2=n11i=1n(Wxi)(Wxi)T=n11i=1nWxixiTWT=n11(WXXTWT)=W(n11XXT)WT=WCov(X)WT
我们将协方差矩阵令为 Σ,最大化投影方差等价于:
m a x { W Σ W T } s . t . W W T = E max\{ W ΣW^T\}\quad s.t.WW^T=E max{WΣWT}s.t.WWT=E

上述带约束的极值问题,可以通过构造拉格朗日函数求解:
L ( W ) = − W Σ W T + λ ( W W T − E ) L(W) = -WΣW^T+λ(WW^T-E) L(W)=WΣWT+λ(WWTE)
对W求偏导,得(此处需运用矩阵求导法则):
∂ L ( w ) ∂ W = − 2 Σ W + 2 λ W = 0 ⟹ Σ W = λ W \frac{\partial L(w)}{\partial W}=-2 \Sigma W+2 \lambda W=0 \Longrightarrow \Sigma W=\lambda W WL(w)=W+2λW=0ΣW=λW
可以发现,我们所要寻找的投影矩阵W其实是 Σ的特征向量, λ是对应的特征值。

此时最大化投影方差,就等价于:
m a x { W λ W T } s . t . W W T = E ⇒ m a x { λ } max\{ Wλ W^T\}\quad s.t.WW^T=E\Rightarrow max\{ λ\} max{WT}s.t.WWT=Emax{λ}
可见,PCA要去寻找的第一主成分,就是使得X的协方差矩阵最大特征值对应的特征向量

若我们最终想要保留下k个维度,我们就选取前k个最大的特征值对应的特征向量,然后把原始的数据在这些轴上面进行投影即可:
x i ′ = [ w 1 T x i w 2 T x i ⋮ w k T x i ] ⇒ X ′ = W X x^{'}_{i}=\left[\begin{array}{c} w_1^{\mathrm{T}}x_i \\ w_2^{\mathrm{T}}x_i \\ \vdots \\ w_k^{\mathrm{T}}x_i \end{array}\right]\Rightarrow X^{'}=WX xi= w1Txiw2TxiwkTxi X=WX

一般而言,k的选取依照实际情况而定,我们可以通过降维前后的信息占比η来决定k应取多少:
η = ∑ j = 1 k λ j 2 ∑ i = 1 d λ i 2 \eta=\sqrt{\frac{\sum_{j=1}^k \lambda_j^2}{\sum_{i=1}^d \lambda_i^2}} η=i=1dλi2j=1kλj2

基于SVD分解的PCA

求解的协方差矩阵最大特征值对应的特征向量,本质就是对XXᵀ进行特征分解,当然我们也可以通过SVD分解来完成这一操作。

由SVD分解的形式可知:
X X T = U Σ V T V Σ U T = U Σ 2 U T X X^T=U \Sigma V^T V \Sigma U^T=U \Sigma^2 U^T XXT=UΣVTVΣUT=UΣ2UT
因此XXᵀ的特征值就是奇异值分解后得到的奇异值的平方,特征向量就是左奇异矩阵U中的每一列。

核PCA

值得注意的是,PCA属于线性分析方法,假设数据各个维度之间既不相关也不独立,PCA就有可能失效,比如下面这种数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V1y2KCNV-1689528282891)(D:\YHT\SVD博客\14.png)]

再回顾一下数据的协方差矩阵:
X X T = ∑ k = 1 n x k x k T X X^T=\sum_{k=1}^n x_k x_k^T XXT=k=1nxkxkT
可以注意到,在求解协方差矩阵的过程中,出现了XXᵀ的形式,因此我们就可以使用核函数,将原始数据映射到非线性的高维曲面上,在更高维度的曲面上,X或许就是线性可分的。核函数的使用前提和具体形式可以回顾我之前记录的的SVM博客。即:
K = X X T = [ ϕ ( x 1 ) T ⋯ ϕ ( x N ) T ] [ ϕ ( x 1 ) , ⋯   , ϕ ( x N ) ] = [ k ( x 1 , x 1 ) ⋯ k ( x 1 , x N ) ⋮ ⋱ ⋮ k ( x N , x 1 ) ⋯ k ( x N , x N ) ] K=X X^T=\left[\begin{array}{c} \phi\left(x_1\right)^T \\ \cdots \\ \phi\left(x_N\right)^T \end{array}\right]\left[\phi\left(x_1\right), \cdots, \phi\left(x_N\right)\right]=\left[\begin{array}{ccc} k\left(x_1, x_1\right) & \cdots & k\left(x_1, x_N\right) \\ \vdots & \ddots & \vdots \\ k\left(x_N, x_1\right) & \cdots & k\left(x_N, x_N\right) \end{array}\right] K=XXT= ϕ(x1)Tϕ(xN)T [ϕ(x1),,ϕ(xN)]= k(x1,x1)k(xN,x1)k(x1,xN)k(xN,xN)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SkKetGto-1689528282891)(D:\YHT\SVD博客\15.png)]

然后对K进行特征分解求出W即可。

2.应用部分

PCA可以对数据进行降维,以大家熟知的MNIST数据集为例,每张图像的尺寸为28x28,利用PCA将数据的维度压缩到我们所能理解的范围内,我们便可以可视化出每张图像在特征空间上的分布情况。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GLbrWVj-1689528282891)(D:\YHT\SVD博客\16.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pdtzDYYJ-1689528282892)(D:\YHT\SVD博客\17.png)]

基于ED的降维结果和基于SVD的降维结果基本一致。如上图所示,手写数字中属于同一类的数据大致聚集,但是PCA毕竟是一个线性的降维算法,仍然不能很好的将不同的类别区分开。

Reference

主成分分析(PCA)原理详解

PCA的数学原理

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

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

相关文章

SpringBoot+React学科竞赛管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootReact框架开发的学科竞赛管理系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代码简洁…

初学者怎么学习c++(合集)

学习c方法1 找一本好的书本教材&#xff0c;辅助看教学视频。好的教材&#xff0c;可以让你更快更好的进入C/C的世界。在校学生的话&#xff0c;你们的教材通常都是不错的。如果是自学&#xff0c;推荐使用谭浩强出的C/C经典入门教材。看视频是学习比较直观的方式。建议先看课本…

从零开始理解Linux中断架构(20)--关于二级中断控制-链式chained Handler

二级中断控制器是个双重角色,在上级中断控制器看来他是个中断设备,在连接到他的下级设备来看,他是个中断控制器。所以处理完成基本的中断控制器管理功能:映射本地中断,还要多个动作:修改上级中断的默认irq Handler,向上级中断设置自己的链式中断处理函数。 中断控制的层…

Springboot实现过滤器

一、导言 在Spring Boot中&#xff0c;过滤器是一种用于对HTTP请求进行预处理和后处理的组件。相较于拦截器&#xff0c;过滤器属于Servlet规范的一部分&#xff0c;它能够在请求进入Web容器之前或返回给客户端之前进行操作。 要在Spring Boot中实现过滤器&#xff0c;可以按…

指针进阶(万字深层次指针解析)

❤️ 作者简介 &#xff1a;对纯音乐情有独钟的阿甘 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 指针进阶 …

Java正则表达式,不定期更新

Java正则表达式 1. 匹配数字&#xff08;包含负数、小数&#xff09;2. 匹配不是纯数字和纯字母且需要8位以上的密码3. 密码&#xff1a;字母、数字、符号&#xff08;_-*.,!#符号可自定义&#xff09;三选二4. 密码&#xff1a;必须包含大写、小写、数字、符号&#xff08;_-*…

车道线检测|利用边缘检测的原理对车道线图片进行识别

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 这两个都是博主在学习Linux操作系统过程中的记录&#xff0c;希望对大家的学习有帮助&#xff01; 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…

工程监测振弦采集仪的解决方案案例解释

振弦采集仪是一种用于测量结构物的振动状态和应力变化的高精度仪器&#xff0c;广泛应用于建筑、桥梁、隧道、地铁等工程领域。以下是一些常见的解决方案案例分析&#xff1a; 基础监测方案&#xff1a;对于大型建筑或桥梁工程&#xff0c;需要对基础进行实时监测。使用振弦采集…

System类 BigInterger BigDecimal

System类 常用方法和案例 exit&#xff1a; 退出当前程序 System.out.println("zhang"); // 0表示一个正常退出的状态 System.exit(0); System.out.println("cheng");System.arraycopy&#xff1a; 复制数组元素&#xff0c;比较适合底层的调用&#xf…

基于linux下的高并发服务器开发(第二章)- 2.2 进程状态转换

01 / 进程的状态 &#xff08;1&#xff09;三态模型 进程状态分为三个基本状态&#xff0c;即就绪态&#xff0c;运行态&#xff0c;阻塞态 &#xff08;2&#xff09;五态模型 在五态模型中&#xff0c;进程分为新建态&#xff0c;就绪态&#xff0c;运行态&#xff0c;阻…

mongodb练习---增删改查

环境&#xff1a; 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若干数据 文档格式如下 &#xff5b;name:zhang,age&#xff1b;10,sex:m,hobby:[a,b,c]&#xff5d; hobby: draw sing dance basketball football pingpong compu…

Java8实战-总结2

Java8实战-总结2 基础知识方法和Lambda传递代码&#xff1a;一个例子从传递方法到Lambda 基础知识 方法和Lambda Scala和Groovy等语言的实践已经证明&#xff0c;让方法等概念作为一等值可以扩充程序员的工具库&#xff0c;从而让编程变得更容易。一旦程序员熟悉了这个强大的…

理解LLM中的ReAct

large language models (LLMs)大语言模型在语义理解和交互式决策方面有着不错的表现。ReAct在一次交互中循环使用推理和行动两个操作解决复杂问题&#xff0c;推理即利用模型自身语义理解能力&#xff0c;行动则利用模型以外的能力&#xff08;如计算、搜索最新消息&#xff0c…

OpenCv之滤波器

目录 一、卷积 二、方盒滤波与均值滤波 三、高斯滤波 四、中值滤波 五、双边滤波 一、卷积 图像卷积就是卷积核在图像上按行华东遍历像素时不断的相乘求和的过程 相关知识点: 步长:就是卷积核在图像上移动的步幅.(为充分扫描图片&#xff0c;步长一般为1)padding:指在图片…

跨服务器跨库数据联合查询

今天群里有人问多个数据源, 可否显示在一个dbgrid, 我感觉是可以的 应该有两种办法 1,如果你两个服务器上都是用的mssqlserver, 那比较好办的, 如果不同数据库,如一个mssql,一个oracle。 则需要ssms方式创建。 通过SSMS查看,如果Microsoft OLE DB Provider for …

docekr-compose搭建redis集群(三主三从)

硬件&#xff1a;三台主机 172.50.2.40 172.50.2.41 172.50.2.42 需求&#xff1a;不想让它随机分配主从关系。想指定主从关系&#xff0c;如下&#xff1a; 主节点&#xff1a;172.50.2.40:6379&#xff0c;从节点172.50.2.41:6378 主节点&#xff1a;172.50.2.41:6379&…

C波段可调谐激光器控制软件系统

花了两周时间&#xff0c;利用下班时间&#xff0c;设计了一个ITLA可调谐激光器控制系统&#xff0c;从硬件到软件。下面这个图片整套硬件系统&#xff0c;软件硬件都自己设计&#xff0c;可以定制&#xff0c;做到单片机问题也不大。相当于一套光源了 这是软件使用的界面&…

PyTorch中的torch.nn.Linear函数解析

torch.nn是包含了构筑神经网络结构基本元素的包&#xff0c;在这个包中&#xff0c;可以找到任意的神经网络层。这些神经网络层都是nn.Module这个大类的子类。torch.nn.Linear就是神经网络中的线性层&#xff0c;可以实现形如yXweight^Tb的加和功能。 nn.Linear()&#xff1a;…

Linux网络---网络预备

文章目录 计算机网络背景计算机网络协议网络传输基本流程 网络中的地址管理 一、计算机网络背景 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起 广域网WAN: 将远隔千里的计算机…

基于Javaweb实现ATM机系统开发实战(十二)用户转账功能实现

还是老规矩&#xff0c;先看前端传来怎样的参数&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core"…