PCA原理

article/2025/10/13 19:03:50

PCA

各位,久违了~

什么是PCA?

什么是PCA呢?这是一个问题,什么样的问题?简单而又复杂的问题,简单是因为百度一下就会出现一大堆的解释,复杂是因为它里面蕴含的内容还是很多的,值得我们仔细研究研究。

PCA 取自其英文的三个单词的首字母:Principle component analysis。中文名字:主成分分析。恐怕大家很早就知道PCA是个什么东东,并且还用过matlab、python、C++等语言的各类机器学习算法包中的PCA函数进行数据处理。即便是没有自己写过这个PCA的程序可能也看过好多博客告诉我们:首先预处理数据,然后计算矩阵X的协防差阵。然后计算协防差阵的特征值和特征向量,最后根据特征值和特征向量建立一个映射矩阵…吧喇叭啦,一大堆的东西。然后感觉用编程实现这个过程应该也不是很难吧,然后就觉得自己会了PCA了,哈哈。

坦白说,上面是我的经历,并不是别人的经历,所以很惭愧,这个经历并不是很好,说实话,经过上面的经历我其实还是不知道什么是主成分分析,PCA对我来讲只是一个名字而已。但是为什么今天要写这篇文章呢?这是有原因的,因为之前看视频的时候发现视频中老师在讲PCA,重要的是老师不单单讲计算过程,而且讲了其中的原理。遗憾的是当时没听懂,也可能是当时睡着了,管他呢。最近写东西的时候遇到了和这个PCA相关的AutoEncoder,和学长交流的时候学长非常耐心地回答了我各种疑问,然后我知道了有AutoEncoder这个东西的存在,因为在这之前,我一直在考虑PCA。我靠,又跑题了,回归问题:什么是PCA? 如果想记住这个名字的话很容易:三个字母PCA,po ci a 。如果想知道具体的内容和原理,往下看,当然,书本上,视频里都有,只不过我不能保证比下面的内容有趣。

PCA 用来干什么?

PCA呀,用来做什么呢?这个很重要,PCA也有很多应用,可能我们之前听过用PCA做人脸识别,PCA做异常检测等等。但事实上PCA没有那么强大的功能,PCA能做的事其实很有限,那就是:降维。其他拓展应用都是在这基础上做了相应额工作。为什要降维呢?很明显,数据中有些内容没有价值,这些内容的存在会影响算法的性能,和准确性。

如上图,数据点大部分都分布在x2方向上,在x1方向上的取值近似相同,那么对于有些问题就可以直接将x1坐标的数值去掉,只取x2坐标的值即可。但是有些情况不能直接这样取,例如:

上图的数据分布在x1和x2方向都比较均匀,任一去掉一个坐标的数值可能对结果都会有很大的影响。这个时候就是PCA展现作用的时候了。黑色坐标系是原始坐标系,红色坐表系是我后面构建的坐标系,如果我的坐标系是红色的,那么这个问题是不是就和上面那个问题一样了,我只需要去掉y2坐标系的数据即可。实际上黑色坐标系和红色坐标系是等价的,差异仅仅是在空间中他们的基不同,黑色坐标系的基是我们最习惯的(1, 0), (0, 1),红色坐标系的基是(1, 1),(-1, -1),事实上,他们是等价的,只不过经常默认使用的就是黑色坐标系。主成分分析可以让数据的投影到那些数据分布比较分散的平面上,比如上图的y1,从而忽视y2的作用,进而达到降维的目的。

PCA 数学原理

为了达到目的,可以不择手段

上面我们说PCA可以将数据投影到分布分散的平面内,而忽略掉分布集中的平面。我们可以这样理解,如上面的图2,大部分数据投影到y1坐标系中的化,数据分布会比较分散,投影到x1、x2等其他坐标轴分布会相对集中,其中,投影到y2上面分布最集中。所以我们尽可能将数据转化到红色坐标系,然后去掉y2坐标。好了,问题描述完了,该想象怎样才能达到这样的目的。

任何形式的变化在数学上都可以抽象成一个映射,或者函数。好,现在我们需要构建一个函数 f ( X m × n ) f(X_{m\times n}) f(Xm×n)使得这个函数可以将矩阵 X m × n X_{m\times n} Xm×n降维,矩阵 X X X是原始数据,矩阵的每一行是一个样本的特征向量,即矩阵 X m × n X_{m\times n} Xm×n中有m个样本,每个样本有n个特征值。所以,所谓的降维,其实是减少n的数量。
假设降维后的结构为 Z m × k Z_{m \times k} Zm×k,其中 k < n k < n k<n
那么PCA的数学表达可以这样表示:
Z m × k = f ( X m × n ) , k < n Z_{m\times k} = f(X_{m\times n}), k < n Zm×k=f(Xm×n),k<n

这里可能比较抽象,我尽量说得有趣:

开始数学了,手段是数学

为了找到上面说的 f ( x ) f(x) f(x)我们需要做一些工作,在线性空间中,矩阵可以表示为一种映射,所以上面的问题可以转化为寻找这样一个矩阵 W W W,该矩阵可以实现上面的映射目的:
Z m × k = X m × n W n × k Z_{m\times k} = X_{m\times n}W_{n\times k} Zm×k=Xm×nWn×k
都进行转秩吧,看着舒服,一般映射是放在左边的:

Z k × m = W k × n X n × m Z_{k\times m} = W_{k\times n}X_{n\times m} Zk×m=Wk×nXn×m

现在假设我们要把矩阵的维数降为1,也就是最后每个样本只有一个属性,即 k = 1 k=1 k=1
目标是使降维后的数据在那个坐标轴中的分布尽可能分散,数据的分布的离散程度我们用方差来衡量。
现在我们的目标:
z = w x z=wx z=wx

最大化新坐标轴上的方差,就是让数据更加分散:
max ⁡ w 1 m ∑ i m ( z i − z ˉ ) 2 s . t . ∥ W ∥ 2 = 1 \max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(z_i - \bar{z})^2 \newline s.t. \ \ \ \ \lVert W \rVert_2 = 1 wmaxm1im(zizˉ)2s.t.    W2=1

将上面的优化问题转化一下:
max ⁡ w 1 m ∑ i m ( z i − z ˉ ) 2 = max ⁡ w 1 m ∑ i m ( w x i − w x ˉ ) 2 = max ⁡ w 1 m ∑ i m ( w ( x i − x ˉ ) ) ( w ( x i − x ˉ ) ) T = max ⁡ w 1 m ∑ i m ( w ( x i − x ˉ ) ( x i − x ˉ ) T w T ) T = max ⁡ w 1 m w ∑ i m ( x i − x ˉ ) ( x i − x ˉ ) T w T max ⁡ w 1 m w C o v ( x ) w T \max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(z_i - \bar{z})^2 \newline = \max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(wx_i - w\bar{x})^2 \newline = \max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(w(x_i - \bar{x}))(w(x_i - \bar{x}))^T \newline = \max\limits_{w}\frac{1}{m}\sum\limits_{i}^{m}(w(x_i - \bar{x})(x_i - \bar{x})^Tw^T)^T \newline = \max\limits_{w}\frac{1}{m}w\sum\limits_{i}^{m}(x_i - \bar{x})(x_i - \bar{x})^Tw^T \newline \max\limits_{w}\frac{1}{m}wCov(x)w^T wmaxm1im(zizˉ)2=wmaxm1im(wxiwxˉ)2=wmaxm1im(w(xixˉ))(w(xixˉ))T=wmaxm1im(w(xixˉ)(xixˉ)TwT)T=wmaxm1wim(xixˉ)(xixˉ)TwTwmaxm1wCov(x)wT

最终的目标转化为:
max ⁡ w 1 m w C o v ( x ) w T s . t . ∥ w ∥ 2 = 1 \max\limits_{w}\frac{1}{m}wCov(x)w^T \newline s.t. \ \ \lVert w\rVert _2 = 1 wmaxm1wCov(x)wTs.t.  w2=1
C o v ( x ) Cov(x) Cov(x)是矩阵 x x x的协防差阵。
利用lagrange multiplier 方法求解上面问题

L = max ⁡ w 1 m w C o v ( x ) w T + α ( ∥ w ∥ 2 − 1 ) = max ⁡ w 1 m w C o v ( x ) w T + α ( w T w − 1 ) L = \max\limits_{w}\frac{1}{m}wCov(x)w^T + \alpha (\lVert w \rVert _2 -1 )\newline = \max\limits_{w}\frac{1}{m}wCov(x)w^T + \alpha (w^Tw - 1) L=wmaxm1wCov(x)wT+α(w21)=wmaxm1wCov(x)wT+α(wTw1)
这里解释一下为什么要限制 ∥ w ∥ 2 = 1 \lVert w \rVert_2 = 1 w2=1,如果不这样限制,那么问题
max ⁡ w 1 m w C o v ( x ) w T s . t . ∥ w ∥ 2 = 1 \max\limits_{w}\frac{1}{m}wCov(x)w^T \newline s.t. \ \ \lVert w\rVert _2 = 1 wmaxm1wCov(x)wTs.t.  w2=1
直接取 w = ( ∞ , ∞ , . . . , ∞ ) w = (\infty, \infty, ..., \infty) w=(,,...,)即可满足最大,那这样没有任何意义,所以这个限制条件是非常有用的。

通过求解 Lagrange 函数,得到结果为
C o v ( x ) w − α w = 0 Cov(x)w - \alpha w = 0 Cov(x)wαw=0

C o v ( x ) = S Cov(x) = S Cov(x)=S S w − α w = 0 Sw - \alpha w = 0 Swαw=0正好是特征值的定义,也就是 α \alpha α是矩阵 S S S的特征值, w w w是矩阵 S S S的特征向量。但是特征值那么多, w w w到底是那个特征值呢?
max ⁡ w 1 m w S w T = max ⁡ w w T S T w = max ⁡ w w T α w = α max ⁡ w w T w = α \max\limits_{w}\frac{1}{m}wSw^T \newline = \max\limits_{w}w^TS^Tw \newline = \max\limits_{w}w^T\alpha w \newline = \alpha \max\limits_{w}w^Tw \newline = \alpha wmaxm1wSwT=wmaxwTSTw=wmaxwTαw=αwmaxwTw=α

所以,要想最大化那个问题,就需要找到最大特征值。
同样道理,如果是需要将数据映射为2维数据,还是求解上述的最大化方差,但是需要加一个约束条件: w 1 ⋅ w 2 = 0 w_1\cdot w_2 = 0 w1w2=0,同样的思路,最终求解出 w 2 w_2 w2是第二大特征值对应的特征向量。更高维的计算以此类推。

经过上面一番推理,我们知道了PCA的原理,但是要记住PCA用途很广,但需要记住不是什么时候都可以用到PCA的,由证明过程我们知道PCA其实是有很多限制的。比如,可以做PCA降维的前提必须保证数据是线性分布的,如果数据不是线性的,比如下图这样的

数据分布不是线性的,用PCA效果可能就不会很理想。

PCA 用编程实现的流程

经过上面原理的推倒我们可以总结一下,真正进行PCA实际操作的时候都要经过哪些步骤?

  1. 整理原始矩阵 X m × n X_{m\times n} Xm×n
  2. 求原始矩阵 X m × n X_{m \times n} Xm×n的协防差阵 S m × m = C o v ( X ) S_{m\times m}=Cov(X) Sm×m=Cov(X)
  3. 求解协防差阵的特征值和特征向量。
  4. 选取最大的 K K K(人为给定)个特征值所对应的特征向量组成构成矩阵 W n × k W_{n\times k} Wn×k
  5. 直接进行矩阵计算 Z m × k = X m × n W n × k Z_{m\times k} = X_{m\times n}W_{n\times k} Zm×k=Xm×nWn×k

流程很明确,那具体的编程要怎么做呢?难点在哪?

难点1:协防差矩阵的计算

假设原始矩阵为 X m × n X_{m\times n} Xm×n,原始矩阵的各个属性的均值向量为 X ˉ \bar{X} Xˉ
协防差距阵的计算如下:
C o v ( X ) = 1 m ( X − X ˉ ) T ( X − X ˉ ) Cov(X) = \frac{1}{m}(X-\bar{X})^T(X-\bar{X}) Cov(X)=m1(XXˉ)T(XXˉ)
这样用程序就非常好实现了。

难点2:特征值和特征向量的求解

特征值和特征向量这里的内容比较多,虽然有很多算法可以计算特征值和特征向量,但是其背后的数学原理着实有点复杂,记得有本书叫矩阵论,特征值和特征向量的计算方法和原理都可以在上面找到,惭愧的是,我也搞不懂。听说有什么QR算法、Jocobi方法、SVD等,似乎是一些矩阵分解的理论。这个还需要再好好学学才能继续吹牛,所以现在不能随便吹。

PCA等价于只包含一个隐层的神经网络

李宏毅老师的视频里用另外一种视角解释PCA,但是我觉得还是没有听明白,具体的关系,我觉得是老师没讲明白,其中最难以理解的就是 x − x ˉ x-\bar{x} xxˉ x ^ \hat{x} x^计算重构误差,为什么??

所以这个理论还有待挖掘。

PCA和AutoEncoder的关系

  1. PCA限制多,要求数据是线性分布的,AutoEncoder可以解决非线性降维问题
    《Reducing the Dimensionality of Data with Neural Networks》这篇论文中有详细介绍:
    下面是论文中实验的结果:

同样的数据,第一个图是PCA降维到2-D平面上的结果,第二个图是AutoEncoder降维到2-D平面上的结果。从结果中也可以明显的看出AutoEncoder降维后对数据的分布仍然有明显的区分,而PCA的结果却有点令人失望,好象是揉成了一团。

  1. PCA理论基础更强,AutoEncoder可解释性差
    AutoEncoder通过挖掘潜在特性提高模型性能,但这些模糊的特性或许会对知识发现的结果产生不良影响。

  2. PCA计算速度更快,AutoEncoder好不好,需要做实验验证

参考资料:

  1. 李宏毅机器学习:PCA
  2. Reducing the Dimensionality of Data with Neural Networks

掌管天堂的空之王者,于地狱唱响容光之歌!


http://chatgpt.dhexx.cn/article/pZ0oaZSB.shtml

相关文章

python实现PCA降维

本文包括两部分&#xff0c;使用python实现PCA代码及使用sklearn库实现PCA降维&#xff0c;不涉及原理。 总的来说&#xff0c;对n维的数据进行PCA降维达到k维就是&#xff1a; 对原始数据减均值进行归一化处理&#xff1b;求协方差矩阵&#xff1b;求协方差矩阵的特征值和对…

PCA算法

主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。 参考&#xff1a;http://www.cnblogs.com/pinard/p/6239403.html PCA的思想 PCA顾名思义&#xff0c;就是找出数据里最主要的方面&#xff0c;用数据里最…

PCA

R语言实现PCA 一次来自男神MR.来的作业PCA读取数据PCA主体部分输出PCA的主要结果&#xff0c;列出主成分分析分析结果利用碎石图来展示PCA结果对component进行一些解释 简略分析利用PCA结果来进行一个排序下面进行聚类分析 一次来自男神MR.来的作业 PCA 读取数据 #读取数据&…

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

转载请声明出处&#xff1a;http://blog.csdn.net/zhongkelee/article/details/44064401 一、PCA简介 1. 相关背景 上完陈恩红老师的《机器学习与知识发现》和季海波老师的《矩阵代数》两门课之后&#xff0c;颇有体会。最近在做主成分分析和奇异值分解方面的项目&#xff0c…

PCA详解

本文目录 一、来源及作用存在问题基本作用 二、 基本原理及求解步骤核心思想如何选择投影方向 三、原理分析最大投影方差最小重构代价 四、SVD与PCA的关系 一、来源及作用 存在问题 在我们训练模型的过程中&#xff0c;有时会出现在训练集上误差较小&#xff0c;但到了测试集误…

主成分分析法(PCA)

主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA&#xff0c;下面我们就对PCA的原理做一个总结。 目录 …

主成分分析(PCA)方法步骤以及代码详解

主成分分析&#xff08;PCA&#xff09;方法步骤以及代码详解 前言 上一节我们了解到在构建神经网络模型&#xff0c;除了掌握如何搭建神经网络架构&#xff0c;了解参数具体含义&#xff0c;规避风险等方法。第一步是要对采用数据集的详细了解&#xff0c;无需接触任何神经网…

机器学习——PCA降维(我至今为止遇见的最好的博文)

参考文章&#xff1a;https://zhuanlan.zhihu.com/p/77151308 PCA&#xff08;Principal Component Analysis&#xff09; 是一种常见的数据分析方式&#xff0c;常用于高维数据的降维&#xff0c;可用于提取数据的主要特征分量。 PCA 的数学推导可以从最大可分型和最大重构性…

通达OA工作流数据报表二次开发版

此模块除具备工作流——数据报表所有功能外&#xff0c;新加入的功能包括&#xff1a; 1&#xff1a;查询条件自带可查询未完成的流程&#xff1b; 2&#xff1a;查询条件可设置查询所有子流程的字段&#xff1b; 3&#xff1a;报表可显示流程当前处理人&#xff0c;并且点击每…

开发通达OA工作流接口从ERP自动生成OA请款单(图文)

ERP系统很多不带审批系统&#xff0c;即使有审批系统的话应用起来也不那么容易&#xff0c;因为领导一般都是不使用ERP系统的&#xff0c;那么我就用通达OA来完成ERP的单据审批吧&#xff0c;是不是很酷呢&#xff0c;而且还支持移动端app和微信审批。 ERP端的数据发起由ERP方…

OA工作流引擎:作为组织血脉支撑的重要性解析

前面提到协同OA管理平台是以“人和事”为管理对象&#xff0c;但如何把“人和事”通过一定的方法能全部贯通起来呢。就如同一个人&#xff0c;有手、脚、嘴、头脑等各种器官&#xff0c;但如何能把这些器官充分的调动起来&#xff0c;里面最核心的还是人的血液&#xff0c;OA系…

通达OA 工作流运行异常情况的紧急处理(图文)

本文整理自通达OA技术交流群&#xff08;QQ群号&#xff1a;378591362&#xff09;群友交流内容。 一位朋友的工作流设计和运行突然出现故障&#xff0c;显示的数据部分都不正常&#xff0c;如下图&#xff1a; 经过重启所有服务&#xff08;包括缓存服务&#xff09;现象依旧。…

通达OA二次开发 小飞鱼应用OA工作流二次开发智能公文系统(三)(图文)

流程流转完毕后&#xff0c;会自动进行归档&#xff0c;默认存成10年存档目录&#xff0c;并且可以在多个存档年限中进行调整切换。点击流程文号可以直接查看具体的流程表单及执行记录。 如果不需要对部门进行管理时&#xff0c;可以直接使用ajax方式快速将存档年限进行修改切换…

通达OA 工作流流转过程中使用系统自带的提醒功能设置(图文)

在流程流转过程中&#xff0c;可以通过增加步骤的方式来提醒相关人员。其实可以使用系统自带的提醒功能&#xff0c;比如需要在某一步骤提醒流程发起人&#xff0c;就可以在提醒设置下设置提醒发起人&#xff0c;有3个选项可选&#xff0c;其中使用手机短信需要短信猫的支持&am…

通达OA工作流不可编辑

找到表&#xff1a;flow_run 搜索自增长ID流水号&#xff0c;查看该条记录的用户是否ok 找到表&#xff1a;flow_run_prcs 搜索流水号&#xff1a;run_id*** 查看结果的PRCS_ID数字最大的那一条记录的OP_FLAG是否为1&#xff0c;如果不为1则改为1即可。

java oa工作流设计_简易OA漫谈之工作流设计(DB)

1、流程图。 工作流可以做得很复杂&#xff0c;也可以设计的很简单。看下图 看这个图&#xff0c;一个流程图最基础的三部分&#xff1a;流程&#xff0c;步骤&#xff0c;操作。 2、流程模板。 流程图的程序描述就叫流程模板。一个流程模板大概需要的一些属性如下图&#xff1…

OA审批工作流设计器实现

OA审批工作流设计器实现 wflow-web&#x1f440;界面一览工作区面板表单管理表单基本设置表单设计器流程设计器 wflow-web 由 Vue ElementUI 驱动&#xff0c;已开源不断更新中 &#xff0c;主要更新 Gitee &#x1f60b; 码云gitee | github地址 &#x1f449; 在线体验地…

OA工作流引擎设计(纯java开发,不需要额外任何插件引擎)

目录 1 系统概览 2 表单管理 2.1 添加表单 2.2 表单智能设置 2.2.1 单行文本 2.2.2 多行文本 2.2.3 下拉菜单&#xff0c;单选按钮和复选框 2.2.4 日期时间控件 2.2.5 计算控件 2.2.6 会签字段 2.2.7 员工选择框和部门选择框 2.3 表单测试 2.3.1 可选日期、时间、日…

OA 系统工作流引擎 Camunda 实践(1)

【审核人员看清楚再审核&#xff0c;我是把自己公司的案例分析一下&#xff0c; 这哪是广告&#xff1f;&#xff1f;&#xff1f;】 Camunda是Activiti最大的贡献者之一(除Alfresco以外)&#xff0c;同时也是它一个主 要的执行咨询合作伙伴。camunda表示Activiti可能太拘束于…

小飞鱼通达二开 OA工作流打印次数统计控制程序(图文)

每个工作流工作打印了多少次了&#xff0c;在OA里不知道&#xff0c;如何能够控制呢&#xff0c;今天小飞鱼带给大家的就是这个工作量打印次数统计控制程序&#xff0c;使用起来是不是会方便很多。 可以查询打印日志明细。 打印页面上多了一个打印按钮和流水号、打印次数的信息…