注:本博文为原创博文,如需转载请注明原创链接!!!
这篇博文主要讲述主成分分析的原理并用该方法来实现MNIST
数据集的降维。
一、引言
主成分分析是一种降维和主成分解释的方法。举一个比较容易理解的例子,如果将三维世界的可乐罐子踩一脚变成二维的,踩的过程就是降维。可以有很多种方法,比如将可乐罐子立起来从上向下踩,或者是将罐子平躺后再踩,甚至我们可以斜着踩或是选择不同的角度。那么如何踩这个可乐罐子可以保存更多的信息呢?显然不是竖着踩,而是平躺着踩下去才会保留可乐罐子的商标、颜色等一些重要信息。
正如上面这个例子,在实际的问题研究中,数据往往会涉及到很多的变量,将多变量的大量数据之间的规律研究得透彻这无疑是一件好事,但不可否认在一定程度上也加重了对数据进行分析和解释的任务量。一般情况,变量与变量之间是存在一定相关性的,提供的信息在一定情况下有所重叠。如果单独拿出个别的变量(指标)进行分析往往是孤立的,没有完全利用数据中的信息,会产生错误的结论。
由于各变量之间存在着一定的相关性,因此我们希望用较少的互不相关的新变量来反映原变量提供的绝大部分信息。主成分分析(Principal Component Analysis,简称PCA)是一种通过降维技术把多变量化为少数几个主成分的统计分析方法。
所谓降维就是对高维的数据特性进行预处理的一种方法,将高维数据中的一些重要的特征保留下来并去除一些不重要的噪声,从而提升了数据处理的速度。
二、理解主成分分析的误区
在详细介绍主成分分析的原理之前需要知道的误区:
- 主成分分析不是抽取数据中的某些特征而是在原有的特征中通过某种数学思想重建新的特征。
- 新特征的特点就是数量比原有特征要少但大概率涵盖了原有的大部分特征的信息。
- 主成分分析剔除了原有数据中的噪声和冗余信息,并不是舍弃原有数据中的特征信息。
- 主成分分析的目的就是最小化噪声,最大化提取有用的信息。
三、主成分分析的核心思想
- 所谓主成分分析就是将样本的 n n n维特征映射到 k k k维上,这 k k k维全新的正交特征称为数据的 k k k个主成分。
- 主成分分析把原有的数据变换到一个新的坐标系中,使得任何数据投影的最大化方差在第一个坐标(第一主成分)上,第二大方差在第二个坐标(第二主成分)上,以此类推,次数为原始数据中特征的数目。
- 对于条目2,第二个新坐标系(第二主成分)是与第一个坐标系(第一主成分)正交的空间中的方差最大化。对于二维数据,第二个坐标系则垂直于第一坐标系。
- 对于条目3,第三个坐标系(第三主成分)则分别与第一个和第二个坐标系正交且方差最大化。这就等价于线性代数中的施密特正交化的过程。
- 在整个过程中通常用方差占比来衡量每个主成分能够解释信息的比例,如果前 k k k个主成分几乎涵盖绝大部分的信息而后面的坐标系所含的方差几乎为 0 0 0,那么就可以保留数据的前 k k k个主成分,实现了降维的过程。
- 在降维中的方差最大化就是投影误差最小化,这两个过程是等价的。
- 找到方差最大化的过程就是主成分分析的本质。最大化数据的方差则数据降维后就越分散,能够表征的信息量则越多,特征的区分度就越明显。找到的新维度就是变异(方差)最大的新维度。
如下面两幅图所示:
![]() |
![]() |
---|
左右两幅图是同为 1000 1000 1000个二维数据样本的分布,显然左图中 A A A直线代表的方向是覆盖数据的最大方差位置,右图是将该数据集的投影到红线的方向,将会是方差最大化且投影误差最小化的坐标系方向,能够最大程度的涵盖数据的信息,是数据的第一主成分特征,下面的章节中会以代码的形式展示。
四、算法流程
- 将数据进行“去中心化”。
- 计算数据的协方差矩阵。
- 计算协方差矩阵的特征值和所对应的特征向量。
- 将特征值从大到小排序,保留前 k k k个特征值,即前 k k k个主成分。
- 将数据转换到上述的 k k k个特征向量构建的新空间中。
五、所需的数学公式
要理解主成分分析的整个数学原理则要先了解下述数学公式:
样本均值:
x ˉ = 1 n ∑ i = 1 n x i \bar{x}=\frac{1}{n}\sum_{i=1}^nx_i xˉ=n1i=1∑nxi
样本方差:
S 2 = 1 n − 1 ∑ i = 1 n ( x i − x ˉ ) 2 S^2=\frac{1}{n-1}\sum_{i=1}^n(x_i-\bar{x})^2 S2=n−11i=1∑n(xi−xˉ)2
样本 X X X和样本 Y Y Y的协方差:
Cov ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ] = 1 n − 1 ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) \begin{aligned} \text{Cov}(X,Y)&=E[(X-E[X])(Y-E[Y])]\\ &=\frac{1}{n-1}\sum_{i=1}^n(x_i-\bar{x})(y_i-\bar{y}) \end{aligned} Cov(X,Y)=E[(X−E[X])(Y−E[Y])]=n−11i=1∑n(xi−xˉ)(yi−yˉ)
方差是针对一维特征的不同样本的取值的运算,协方差是针对二维以上的特征的不同取值之间的运算。方差是协方差的特殊情况。
上述公式中的方差和协方差的除数是 n − 1 n-1 n−1代表的是无偏估计。
矩阵的特征值和特征向量:
A ⋅ v = λ ⋅ v \mathbf{A}\cdot{\mathbf{v}}=\lambda\cdot{\mathbf{v}} A⋅v=λ⋅v
其中, v v v是矩阵 A A A的特征向量, λ \lambda λ是矩阵 A A A的特征值,每个特征值所对应的特征向量相互正交。
对于矩阵特征值和特征向量公式的理解:一个矩阵点乘一个向量就相当于对该向量进行旋转或者拉伸等一系列线性变换。在我们求解矩阵的特征值和特征向量的时候就是要求解矩阵 A A A能够使得这些特征向量只发生伸缩变换,而变换的效果等价于特征向量与某个常量 λ \lambda λ相乘。
矩阵的特征值分解:
A = Q Σ Q − 1 A=Q\Sigma Q^{-1} A=QΣQ−1
Q Q Q是矩阵 A A A所对应的特征向量, Σ \Sigma Σ是矩阵 A A A的特征值组成的对角矩阵。
六、主成分分析的应用实例和原理
下面利用一个生活中的常见问题来讲解主成分分析的原理。
有A,B,C,D,E
五款汽车,其价格如下述表格所示:
车型 | 价格(十万) |
---|---|
A | 10 |
B | 3 |
C | 1 |
D | 7 |
E | 2 |
放在一维坐标系上的表示如下:
5 5 5款车的均值为:
x ˉ = 10 + 3 + 1 + 7 + 2 5 = 4.6 \bar{x}=\frac{10+3+1+7+2}{5}=4.6 xˉ=510+3+1+7+2=4.6
为方便后续方差的计算,首先将数据进行“去中心化”,即 x i − x ˉ x_i-\bar{x} xi−xˉ,“去中心化”后的数据显示为:
车型 | 价格(十万) |
---|---|
A | 5.4 |
B | -1.6 |
C | -3.6 |
D | 2.4 |
E | -2.6 |
“去中心化”后的点在坐标系的表示:
显然上述图片可以看做是以 0 0 0为中心的数据分布,这样做则更具有可观测性。通过上图可以清楚地看到 A A A和 D D D的售价比较高, C C C, E E E和 B B B的售价稍微低一些。
5 5 5款车的方差为:
S 2 = 1 4 ( 5 , 4 2 + ( − 1.6 ) 2 + ( − 3.6 ) 2 + 2. 4 2 + ( − 2.6 ) 2 ) = 14.3 S^2=\frac{1}{4}\bigg (5,4^2+(-1.6)^2+(-3.6)^2+2.4^2+(-2.6)^2 \bigg)=14.3 S2=41(5,42+(−1.6)2+(−3.6)2+2.42+(−2.6)2)=14.3
现在又添加了这 5 5 5款车的使用年限属性,如下表所示:
车型 | 价格(十万) | 使用年限(年) |
---|---|---|
A | 10 | 16 |
B | 3 | 9 |
C | 1 | 4 |
D | 7 | 12 |
E | 2 | 7 |
相应的坐标系表示为:
5 5 5款汽车的两个特征“去中心化”后的数据显示为:
车型 | 价格(十万) | 使用年限(年) |
---|---|---|
A | 5.4 | 6.4 |
B | -1.6 | -0.6 |
C | -3.6 | -5.6 |
D | 2.4 | 2.4 |
E | -2.6 | -2.6 |
相应的平面直角坐标系的表示如下:
现在需要从这 5 5 5款车的两个特征中解析出一个新的特征来实现对数据的降维。
下面穿插一些数学知识点:
高中时候都学习过向量的知识。在二维世界里可以用两个正交基来表示任一点,即任何一个点都是两个正交基 e 1 , e 2 \mathbf{e_1,e_2} e1,e2的线性组合:
A = ( x y ) = x e 1 + y e 2 A=\binom{x}{y}=x\mathbf{e_1}+y\mathbf{e_2} A=(yx)=xe1+ye2
下图所示的向量 e 1 , e 2 \mathbf{e_1,e_2} e1,e2是平面直角坐标系的两个标准正交基:
坐标系以 O O O为中心进行旋转则 x x x和 y y y的值也会发生变化。但是,无论坐标系旋转到何种角度, ∣ O A ∣ 2 = x 2 + y 2 \mathbf{|OA|}^2=x^2+y^2 ∣OA∣2=x2+y2是不变的。当 x x x轴旋转到与向量 O A \mathbf{OA} OA共线时,点 A A A则无需 e 2 \mathbf{e_2} e2向量的表示,降成一维的点,如下图所示:
此时,上图 A A A点可以表示成:
A = 3.82 e 1 + 0 e 2 A=3.82\mathbf{e_1}+0\mathbf{e_2} A=3.82e1+0e2
直接去掉向量 e 1 \mathbf{e_1} e1对点 A A A并不影响:
上图 A A A点可以表示成:
A = 3.82 e 2 A=3.82\mathbf{e_2} A=3.82e2
如果是两个点,情况就稍微复杂了点。有如下图所示的两个点 A = ( x 1 y 1 ) A=\binom{x_1}{y_1} A=(y1x1), C = ( x 2 y 2 ) C=\binom{x_2}{y_2} C=(y2x2):
则点 A A A和点 C C C的向量表示为:
w = x 1 e 1 + y 1 e 2 , v = x 2 e 1 + y 2 e 2 \mathbf{w}=x_1\mathbf{e_1}+y_1\mathbf{e_2},\mathbf{v}=x_2\mathbf{e_1}+y_2\mathbf{e_2} w=x1e1+y1e2,v=x2e1+y2e2
由上图可知,点 A A A和点 C C C在 x x x轴上投影的长度要多一写。为了降维,应该多分配给 x 1 , x 2 x_1,x_2 x1,x2,少分配给 y 1 , y 2 y_1,y_2