【高中生讲机器学习】17. 讲人话的主成分分析,它来了!(上篇)

创建时间:2024-08-13
首发时间:2024-09-05
最后编辑时间:2024-09-05
作者:Geeker_LStar

你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~
我是 Geeker_LStar,一名准高一学生,热爱计算机和数学,我们一起加油~!
⭐(●’◡’●) ⭐
那就让我们开始吧!

诶嘿!这一篇想写很久啦,现在终于来了!(什么玩意都拖到开学了还没写完
如果想比较好的理解这两篇(这篇 & 下篇)的数学细节,需要你具有【矩阵特征值分解】和【矩阵奇异值分解】的前置知识,你可以在这一篇:【高中生讲机器学习】16. 线代小白也能看懂的矩阵奇异值分解!中找到对应的内容~!

话不多说,我们开始这一篇吧!!

文章目录

前置知识

okay,在正式开始讲主成分分析之前,按照惯例,我们还是需要补充一点数学知识…
不过别担心()不会像上一篇那样一补充就 “补充” 五千字线性代数基础(论《补充》(bushi)
今天要补充的东西还是相对好理解的,有一点点线性代数基础就够~

方差和标准差

啊这个其实应该不用补充吧()不过为了连贯一点,还是简单提一下吧~(看我如何 100 字内解决

协方差

嗯,上面讲的方差是衡量一维变量自身的波动程度的,但是如果我的变量是二维的呢?我怎么衡量这一堆二维变量之间的 “方差”?
well,现在就要协方差上场了!
还是老规矩,先放公式再解释。
假设我们现在有 n n n 个二维变量 ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) (x_1,y_1), (x_2, y_2), ..., (x_n, y_n) (x1,y1),(x2,y2),...,(xn,yn),则它们的协方差为:
Cov ( X , Y ) = 1 n ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) \text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y}) Cov(X,Y)=n1i=1n(xixˉ)(yiyˉ)

其中, x ˉ , y ˉ \bar{x}, \bar{y} xˉ,yˉ x , y x, y x,y 的均值。
okaya(ok 呀(《自创词》)),我们来看看这个公式的意思。
首先 x , y x, y x,y 分别减去均值,这一步和计算方差时减去均值的目的是一样的,都是为了将数据中心化,以消除数据绝对大小的影响。
然后,我们分别计算每一对 x i x_i xi y i y_i yi(中心化后)的乘积,并把所有对的结果加起来,再取均值,就得到了 X X X Y Y Y 的协方差。

协方差衡量的是什么?yes,它衡量的是两个变量之间的相关性
具体来说,如果协方差为正,反映出 X , Y X,Y X,Y 之间有较强的正相关关系(即 X X X 变大时 Y Y Y 也变大);如果协方差为负,反映出 X , Y X,Y X,Y 之间有较强的负相关关系;而如果协方差接近于 0,则说明 X , Y X,Y X,Y 之间不太存在相关关系。

emm 再详细解释一下,就是,如果 X , Y X,Y X,Y 之间有较强的正相关关系,那么(在中心化后), x > 0 x>0 x>0 y y y 也应该(或者大部分情况下) > 0 >0 >0 x < 0 x<0 x<0 同理。这样的话,每一项 ( x i − x ˉ ) ( y i − y ˉ ) (x_i - \bar{x})(y_i - \bar{y}) (xixˉ)(yiyˉ) 都应该 > 0 >0 >0,最终加起来协方差也大于 0。
负相关关系同理。
(不是,我着了什么魔,我刚才潜意识打出来的是 “特征值也大于 0”。。。)

okay,现在协方差应该很好理解了!我们来看一个和它高度相关的东西(和它的协方差为正的东西())——相关系数。

相关系数

咳咳咳,相关系数和协方差的相关系数接近于 1.((抖机灵

嗯,书接上文,协方差的计算方法有效,但是它忽略了一个对于数据来说很重要的东西——量纲
具体怎么说呢,就是如果两个变量都在 10^4 这个数量级(,和两个变量都在 10^1 这个数量级,哪怕这两组都是强正相关,最终计算出来的协方差也会相差很多——10^4 数量级的变量的协方差通常来讲会远大于 10^1 量级的变量。

okay,为了缓解量纲不同带来的协方差差距,我们有两种选择。

  • 在计算协方差之前就对原始数据进行处理。即除了中心化外,再做一步标准化操作。
  • 对得到的协方差进行处理,以消除量纲的影响。

在下面主成分分析的内容里面,我们会讲到具体的数据预处理方法。在相关系数这个部分,我们先来看第二种选择——对我们已有的协方差进行处理。

前面说过,协方差没有考虑数据的量纲问题,那解决这个问题要怎么办捏——没错,那就自己处理量纲呀。或者说,那就把计算协方差之前没有处理好的量纲放到计算之后处理。

okay,so 我们怎么统一量纲?
这其实也好办,通常量纲可以使用标准差来统一。也就是说,当两个数据的量纲不统一导致无法比较的时候,我们可以把两个数据都除以它的标准差,这样就避免了量纲的影响。
至于为什么可以这样,很简单,在标准化之前我们已经进行了中心化,即把均值变为了 0。而标准化又允许我们把数据的标准差变为 1,这样我们就消除了数据原始量纲的影响。或者说,现在的数据可以被看作是无量纲的了。

so,既然协方差会受到量纲的影响,那我们就让协方差再除以两个维度的标准差就可以了呀。
据此,我们得到了一个公式:

r = Cov ( X , Y ) σ X σ Y = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 r = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n} (x_i - \bar{x})^2 \sum_{i=1}^{n} (y_i - \bar{y})^2}} r=σXσYCov(X,Y)=i=1n(xixˉ)2i=1n(yiyˉ)2 i=1n(xixˉ)(yiyˉ)

该公式的计算结果被称为相关系数,是一个在 -1 和 1 之间的值。(别看这玩意很长,其实就是协方差除以标准差的乘积
嗯,或许你已经想到了,如果我先对数据进行标准化,然后再算协方差,那其实和我先算协方差再整体除以标准差是一样的,得到的结果都等于相关系数。
(为什么我要在这里提一句这个呢,因为后面会用到,嘿嘿。

嗯,既然相关系数只是标准化后的协方差,它的含义肯定也与协方差类似:它衡量的也是两个变量之间的线性相关程度。具体来说,我们有:

  • 相关系数 = 1,完全正相关(斜率 >0 的直线)
  • 相关系数 = 0,不存在任何相关性
  • 相关系数 = -1,完全负相关(斜率 <0 的直线)

相关系数比线性相关/线性无关包含的范围更广一点(这两个在上一篇讲过定义),相关系数为 ±1 对应两个变量线性相关,相关系数为 0 对应两个变量线性无关。相关系数在 0–1 或 -1–0 之间的都代表有相关性,相关系数的绝对值越大,代表相关性越强(越近似于线性相关)。(别着急,后面我们会遇到一个例子

协方差矩阵

weeeell,前面讲过了方差和协方差。方差衡量的是一个变量自身的波动程度,协方差则是衡量两个维度(变量)的相关程度。

嗯,到目前为止一切都好说,可是,如果我现在有三个或者更多维度,我也想计算它们的协方差,怎么办?
很显然,这个时候一个值就不够用了。那我们就要邀请矩阵出场了…

其实我感觉协方差矩阵这里会有点绕()为了避免绕晕,我们先把符号规定好。
我们有 n n n 个数据,每个数据有 m m m 个维度,对于第 i i i 个数据的第 j j j 个维度,我们记作 x i ( j ) x_{i}^{(j)} xi(j),即下标为第几个数据,上标为这个数据的第几维。

我们把所有数据的记录在一个大的矩阵 X X X 里,即:
X = [ x 1 ( 1 ) x 1 ( 2 ) . . . x 1 ( m ) x 2 ( 1 ) x 2 ( 2 ) . . . x 2 ( m ) . . . . . . . . . . . . x n ( 1 ) x n ( 2 ) . . . x n ( m ) ] X = \begin{bmatrix} x_1^{(1)} & x_1^{(2)} & ... & x_1^{(m)}\\ x_2^{(1)} & x_2^{(2)} & ... & x_2^{(m)} \\ ... & ... & ... & ... \\ x_n^{(1)} & x_n^{(2)} & ... & x_n^{(m)} \\ \end{bmatrix} X= x1(1)x2(1)...xn(1)x1(2)x2(2)...xn(2)............x1(m)x2(m)...xn(m)

这是一个 n ∗ m n*m nm 的矩阵,其中每一行代表一个数据,每一列代表一个特定的维度(变量)。

现在我们要干什么?yes,我们要计算【每一个维度之间】【彼此】的协方差。
也就是说,我们想要计算维度 1(第一列)和维度 2 到 m 的所有维度的协方差,维度 2 和维度 1,维度 3 到 m 的所有维度的协方差…
显然,最终计算出的值需要被存储在一个矩阵中。

weeeell,还是一样的,我们先写出计算的式子,然后再分析这个式子。
Cov ( X , X ) = E [ X T X ] \text{Cov}(X,X)=E[X^TX] Cov(X,X)=E[XTX]

X X X 是一个 n ∗ m n*m nm 的矩阵, X T X X^TX XTX 的结果则是一个 m ∗ m m*m mm 的方阵。我们不妨把这个方阵记作 C C C(cov 的简写)。
嗯,这很好。为什么好呢?因为 m ∗ m m*m mm 方阵中每一个位置都是一个协方差,这些协方差共同构成了我们想要的协方差矩阵!
具体来说, C i j C{ij} Cij 代表了数据的第 i i i 个维度和第 j j j 个维度的协方差。
在我们探讨 C C C 的更多细节和特点之前,我们还是先来看看为什么 C C C 就是我们想要的协方差矩阵吧。

我们不妨把整个算式写出来:
[ x 1 ( 1 ) x 2 ( 1 ) . . . x n ( 1 ) x 1 ( 2 ) x 2 ( 2 ) . . . x n ( 2 ) . . . . . . . . . . . . x 1 ( m ) x 2 ( m ) . . . x n ( m ) ] m ∗ n ∗ [ x 1 ( 1 ) x 1 ( 2 ) . . . x 1 ( m ) x 2 ( 1 ) x 2 ( 2 ) . . . x 2 ( m ) . . . . . . . . . . . . x n ( 1 ) x n ( 2 ) . . . x n ( m ) ] n ∗ m = [ C 11 C 12 . . . C 1 m C 21 C 22 . . . C 2 m . . . . . . . . . . . . C m 1 C m 2 . . . C m m ] m ∗ m \begin{bmatrix} x_1^{(1)} & x_2^{(1)} & ... & x_n^{(1)}\\ x_1^{(2)} & x_2^{(2)} & ... & x_n^{(2)} \\ ... & ... & ... & ... \\ x_1^{(m)} & x_2^{(m)} & ... & x_n^{(m)} \\ \end{bmatrix}_{m*n} * \begin{bmatrix} x_1^{(1)} & x_1^{(2)} & ... & x_1^{(m)}\\ x_2^{(1)} & x_2^{(2)} & ... & x_2^{(m)} \\ ... & ... & ... & ... \\ x_n^{(1)} & x_n^{(2)} & ... & x_n^{(m)} \\ \end{bmatrix}_{n*m}= \begin{bmatrix} C_{11} & C_{12} & ... & C_{1m} \\ C_{21} & C_{22} & ... & C_{2m} \\ ... & ... & ... & ... \\ C_{m1} & C_{m2} & ... & C_{mm} \\ \end{bmatrix}_{m*m} x1(1)x1(2)...x1(m)x2(1)x2(2)...x2(m)............xn(1)xn(2)...xn(m) mn x1(1)x2(1)...xn(1)x1(2)x2(2)...xn(2)............x1(m)x2(m)...xn(m) nm= C11C21...Cm1C12C22...Cm2............C1mC2m...Cmm mm

wow 你想不到这个算式对应的 latex 有多少(((
我们随便选取第一个矩阵 X T X^T XT 的一行和第二个矩阵 X X X 的一列,来看一下这个计算过程。嗯那就第一个矩阵的第一行和第二个矩阵的第二列吧。
也就是:
[ x 1 ( 1 ) x 2 ( 1 ) . . . x n ( 1 ) ] 1 ∗ n ∗ [ x 1 ( 2 ) x 2 ( 2 ) . . . x n ( 2 ) ] n ∗ 1 = C 12 \begin{bmatrix} x_1^{(1)} & x_2^{(1)} & ... & x_n^{(1)} \end{bmatrix}_{1*n} * \begin{bmatrix} x_1^{(2)} \\ x_2^{(2)} \\ ... \\ x_n^{(2)}\\ \end{bmatrix}_{n*1}=C_{12} [x1(1)x2(1)...xn(1)]1n x1(2)x2(2)...xn(2) n1=C12

展开成算式:
C 12 = ∑ i = 1 n x i ( 1 ) ∗ x i ( 2 ) C_{12}=\sum_{i=1}^{n}x_i^{(1)}*x_i^{(2)} C12=i=1nxi(1)xi(2)

okay,我们发现,这不计算的就是第一个维度和第二个维度的协方差嘛!
好嘞,这样一来,为什么最终的矩阵是协方差矩阵就很好理解了。

接下来我们继续来看这个协方差矩阵的特征…
有一个特征很显然——它是对称的。
回到上面说的这句话——“具体来说, C i j C{ij} Cij 代表了数据的第 i i i 个维度和第 j j j 个维度的协方差。”
同理, C j i C{ji} Cji 代表了数据的第 j j j 个维度和第 i i i 个维度的协方差。而两个维度的协方差只有一个,所以 C i j = C j i C_{ij}=C_{ji} Cij=Cji,即这个矩阵是对称的。

嗯,这很好!
说到方阵,说到(实)对称,你想到了什么。
——这是特征值分解的天然条件啊!

嗯好的,不过我们还得再等亿会(或者说在下篇)才能谈到它,先让我们切入到主题…(我感觉我扯了三四千字《数学基础》(好吧没事比上一篇的五千多字线性代数基础好那么点(

主成分分析概述

主成分分析要干什么?我们首先需要解决这个问题。
其实上一篇文章中我有一个不错的例子,直接抄到这里来吧。

比如说你现在要买房子,你的预算和时间都有限,所以你需要快速地通过一个房子的信息去判断这个房子(的价格)是否值得你考虑。不过,决定一个房子价格的因素可太多了——面积、朝向、户型、年限、是不是二手的、旁边有没有好学校…在估计一个房子价格的时候,我们不可能把所有这些因素都考虑进去,那这时候怎么办呢——没错,先看最能决定房子价格的因素,然后再做下一步决定。而对于一个房子来说,直接决定价格范围的、最重要的因素一般而言是它的面积。这样我们就把一个需要考虑很多(大多数时候没有那么有用)的因素的问题转化成了只需要考虑几个比较重要的信息的问题。

嗯,主成分分析就是干这个的——它是一种无监督学习算法,通常用于数据降维。它通过提取数据中的主要模式/特征/信息来减少数据的维度(特征数量)。换言之,它尝试(在尽量减少数据损失的条件下)使用更少的维度的信息去近似原始高维数据所包含的全部信息。这有利于提取出数据中真正有用的信息(去掉一些噪声或贡献很小的部分),同时减少数据所占的空间以及对数据进行分析所需的时间。

再举一个例子,很多图像压缩算法就使用了主成分分析,在尽量保证图片清晰度的情况下减少图片的大小。

and,理解主成分分析还有一个不错的角度——原始的数据可能在一些维度上线性相关或近似线性相关(强相关性),但是对数据进行主成分分析后的数据在任意维度上都线性无关(强相关性意味着相关系数接近于 ± 1)。这代表着什么呢?
well,(强)线性相关意味着有大量的数据是不必要的,因为其中一些数据可以用另一些数据的线性组合来近似表示。所以在这种情况下,我们大可以用主成分分析去掉其中的一些数据,同时只损失很少的信息。

豪德,说了这么多,主成分分析到底是怎么做的呢?它怎么就提取出了数据中最重要的信息?

okay,简单来讲,主成分分析寻找原始数据中变化最大的几个方向 (这是什么话) ,或者说方差最大的方向,并以这些方向为新的坐标轴(相当于对坐标系进行变换)。至于最终要选取几个方向作为新的坐标轴方向,取决于你希望保留多少数据,具体的计算方法后面会讲到。
(补充一句,如果不对数据进行降维,即不减少坐标轴的数量,则主成分分析可以看作对原始坐标系的旋转变换。)
你可能好奇为什么主成分分析要找数据中变化最大(方差最大)的方向,这其实也很好解释:方差大意味着数据在这个方向上比较分散,数据之间的相似度比较低,那每个数据的 “辨识度” 自然就更高。也就是说我们就更能通过这个方向上的值去把数据区分开来。这对于很多机器学习任务来说是非常有用且关键的。

ok 我想你现在或许有点懵,so maybe 几何会是一种更直观的解释,let us have a loook!

主成分分析的几何解释

weeell,休息一下脑子,这一部分我们来看一些直观但其实非常重要的东西(可以说这里面包含主成分分析思想的核心),也可以看作对上一部分的详细解释。

首先我们来看一个坐标系:

<a class=主成分分析的几何解释" />

先看左边那个图(a),这是原始的坐标系,数据由两个变量 x 1 , x 2 x_1, x_2 x1,x2 表示。可以看到这两个变量之间存在一种类似于线性关系的关系,即具有较强的相关性,目测一下相关系数估计 0.4-0.6?换言之,对于图(a),当我们知道 x 1 , x 2 x_1, x_2 x1,x2 中其一时,对另一个的预测不是完全随机的(因为我们知道大概的趋势,所以可以进行一个粗略的预测)。

okay,接下来我们走一遍主成分分析的流程。
首先选取数据方差最大的方向,这里的数据像一个椭圆,那么方差最大的方向就是椭圆的长轴,我们把这个方向记作 y 1 y_1 y1,也就是第一主成分。
可以看到, y 1 y_1 y1 和之前的坐标轴相比,更有助于我们区分数据
接下来我们选取和 y 1 y_1 y1 垂直且方差次之的方向,作为新坐标系的第二坐标轴,记作 y 2 y_2 y2,也就是第二主成分。这里因为是一个二维坐标系所以只剩下一个可选择的方向了,如果是 n n n 维坐标系的话就还会有 n − 1 n-1 n1 个可以选择的方向。

可以看到,在新的坐标系中,两个变量 y 1 , y 2 y_1, y_2 y1,y2 间是线性无关的,也就是知道其中一个的值并不能对我们预测另一个的值提供任何有用的信息。
同时,如果我们只选取第一主成分,那么等价于把数据投影到这个方向上,把二维数据变成了一维,实现了数据降维。

(感觉现在可能比较直观了!

okay,看完流程,我们不妨换一个角度,从几何上看看 “方差最大” 的含义。
为什么要选取方差最大的方向之前已经说过了,主成分分析的目的是在提取出数据中最重要的特征(在降低数据维度的同时保留大部分重要信息),而方差最大的方向可以说就是具有最多信息的方向

综上所述,我们可以用几句话简单地概括一下主成分分析

  • 主成分分析是一种无监督学习算法,常用于数据降维和数据压缩
  • 主成分分析的目的是在保证数据内容损失较少的前提下尽可能降低数据维度,去除数据中的噪声和一些不那么重要的特征
  • 主成分分析可以找出原始数据中变化最大(方差最大,具有最多信息)的方向
  • 主成分分析选择方差最大(即包含最多信息)的方向作为主成分的方向
  • 经过主成分分析后的数据在任何维度上都是线性无关的

okay!!! 现在你已经基本了解主成分分析在干什么了!very nice!!!

嗯,不过,理解它在干什么只能说是第一步,或者说是入门级别的。主成分分析真正的精髓在于它的数学推导,这一部分我将放在下篇中进行详细阐述!!(真的非常有意思!!

下篇

aaaa 下篇还在更新!!很快就能看到啦!

那这一篇就到这里啦~我们下篇再见!

这篇文章对主成分分析做了,希望对你有所帮助!⭐
欢迎三连!!一起加油!🎇
——Geeker_LStar


http://www.niftyadmin.cn/n/5641516.html

相关文章

企业分享 - 益丰大药房监控升级之路

益丰大药房是全国大型药品零售连锁企业&#xff08;中国沪市主板上市连锁药房&#xff09;&#xff0c;专注医药零售行业23载&#xff0c; 市值稳居国内上市连锁药店前列/中国上市公司500强。 益丰有体量庞大的研发运维团队&#xff0c;有体量庞大的 IT 设施和服务&#xff0c;…

Qt人脸识别与分析系统

项目源码地址https://github.com/fufufu11/QT5-FacialDetection 项目概述 本项目是一款基于Qt5框架构建的人脸检测应用程序&#xff0c;支持多摄像头选择和用户友好的图形界面。系统集成了百度的人脸检测API&#xff0c;能够通过HTTPS协议POST方法安全地发送请求&#xff0c;并…

科技赋能,产业园区怎么凭借数字化管理提升核心竞争力?

在当今科技飞速发展的时代&#xff0c;产业园区数字化管理正逐渐成为提升园区竞争力、实现可持续发展的关键因素。那么&#xff0c;什么是产业园区数字化管理呢&#xff1f; 从资源管理角度来看&#xff0c;通过数字化管理可以精确掌握园区内的土地资源、空间资源、能源资源等的…

全新界面,原生Mac和Linux支持的WinBox 4 发布了!

简介 WinBox 4 终于来了&#xff01;&#xff01;​ ​ 适用于 Windows、macOS 和 Linux的原生程序。&#xff08;不需要开wine之类的软件了&#xff09; 更现代化的软件界面&#xff0c;终于不是上个世纪的风格了。 支持深色模式&#xff0c;不能亮瞎狗眼了。 官方&#…

8月刷题笔记

刷题笔记—8月 LCP40.心算挑战(贪心、排序) class Solution { public:int maxmiumScore(vector<int>& cards, int cnt) {//24.8.1ranges::sort(cards, greater()); //从大到小排序int s reduce(cards.begin(), cards.begin()cnt, 0);if(s%2 0) return s;auto rep…

Android13 Hotseat客制化--去掉hotseat(热座)

需求&#xff1a;有些项目不要热座&#xff0c;要求去掉热座 以前的做法是把DeviceProfile里与hotseat有关的变量改为0之类的&#xff0c;改动比较大。为什么不通过简单的把mHotseat设置为GONE呢 因为在各种视图变化的时候&#xff0c;会把hotseat再次显示出来&#xff0c;因…

JMeter:如何定制Http请求取样器

一般使用JMeter发送HTTP请求时都会用到HTTP Request取样器&#xff0c;这种取样器大多数时候能够满足压力测试的需要。 图1 但也有一些场景&#xff0c;可能需要更加强大的取样器&#xff0c;或者需要定制一些功能&#xff0c;这时就需要自己手动编写取样器。幸好JMeter为我们提…

Python Excel 操作全面总结

Excel 是我们日常生活中经常使用的数据处理工具&#xff0c;而 Python 作为一种强大的编程语言&#xff0c;在处理 Excel 文件方面也有着广泛的应用。本文将全面总结 Python Excel 操作&#xff0c;包括如何使用 Python 来读取、写入、修改 Excel 文件&#xff0c;以及如何使用…