一、主成分分析(Principal Component Analysis,简称PCA)
1.1、基变换的矩阵表示
将基由(0,1)和(1,0)变为:
( 1 2 , 1 2 ) , ( − 1 2 , 1 2 ) \left(\frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}}\right),\left(-\frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}}\right) (21,21),(−21,21)
将(3,2)变换为新基上的坐标,就是用(3,2)与第一个基做内积运算,作为第一个新的坐标分量,然后用(3,2)与第二个基做内积运算,作为第二个新坐标的分量。实际上,我们可以用矩阵相乘的形式简洁的表示这个变换:
( 1 / 2 1 / 2 − 1 / 2 1 / 2 ) ( 3 2 ) = ( 5 / 2 − 1 / 2 ) \left(\begin{array}{cc} 1 / \sqrt{2} & 1 / \sqrt{2} \\ -1 / \sqrt{2} & 1 / \sqrt{2} \end{array}\right)\left(\begin{array}{l} 3 \\ 2 \end{array}\right)=\left(\begin{array}{c} 5 / \sqrt{2} \\ -1 / \sqrt{2} \end{array}\right) (1/2−1/21/21/2)(32)=(5/2−1/2)
其中矩阵的两行分别为两个基,乘以原向量,其结果刚好为新基的坐标。可以稍微推广一下,如果我们有m个二维向量,只要将二维向量按列排成一个两行m列矩阵,然后用“基矩阵”乘以这个矩阵,就得到了所有这些向量在新基下的值。例如(1,1),(2,2),(3,3),想变换到刚才那组基上,则可以这样表示:
(
1
/
2
1
/
2
−
1
/
2
1
/
2
)
(
1
2
3
1
2
3
)
=
(
2
/
2
4
/
2
6
/
2
0
0
0
)
\left(\begin{array}{cc} 1 / \sqrt{2} & 1 / \sqrt{2} \\ -1 / \sqrt{2} & 1 / \sqrt{2} \end{array}\right)\left(\begin{array}{ccc} 1 & 2 & 3 \\ 1 & 2 & 3 \end{array}\right)=\left(\begin{array}{ccc} 2 / \sqrt{2} & 4 / \sqrt{2} & 6 / \sqrt{2} \\ 0 & 0 & 0 \end{array}\right)
(1/2−1/21/21/2)(112233)=(2/204/206/20)
于是一组向量的基变换被干净的表示为矩阵的相乘。
一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为B中第m列变换后的结果。数学表示为:
( p 1 p 2 ⋮ p R ) ( a 1 a 2 ⋯ a M ) = ( p 1 a 1 p 1 a 2 ⋯ p 1 a M p 2 a 1 p 2 a 2 ⋯ p 2 a M ⋮ ⋮ ⋱ ⋮ p R a 1 p R a 2 ⋯ p R a M ) \left(\begin{array}{c} p_{1} \\ p_{2} \\ \vdots \\ p_{R} \end{array}\right)\left(\begin{array}{llll} a_{1} & a_{2} & \cdots & a_{M} \end{array}\right)=\left(\begin{array}{cccc} p_{1} a_{1} & p_{1} a_{2} & \cdots & p_{1} a_{M} \\ p_{2} a_{1} & p_{2} a_{2} & \cdots & p_{2} a_{M} \\ \vdots & \vdots & \ddots & \vdots \\ p_{R} a_{1} & p_{R} a_{2} & \cdots & p_{R} a_{M} \end{array}\right) ⎝⎜⎜⎜⎛p1p2⋮pR⎠⎟⎟⎟⎞(a1a2⋯aM)=⎝⎜⎜⎜⎛p1a1p2a1⋮pRa1p1a2p2a2⋮pRa2⋯⋯⋱⋯p1aMp2aM⋮pRaM⎠⎟⎟⎟⎞
其中 p i p_i pi是一个行向量,表示第 i i i个基, a j a_j aj是一个列向量,表示第 j j j个原始数据记录。
特别要注意的是,这里R可以小于M,而基向量维数R决定了变换后数据的维数。也就是说,我们可以将一M维数据变换到更低维度的空间中去,变换后的维度取决于基的数量,因此这种矩阵相乘的表示也可以表示降维变换。
最后,上述分析同时给矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。更抽象的说,一个矩阵可以表示一种线性变换。
1.2、协方差矩阵及优化目标
选择不同的基可以对同样一组数据给出不同的表示,而且如果基的数量少于向量本身的维数,则可以达到降维的效果。但是我们还没有回答一个最最关键的问题:如何选择基才是最优的。或者说,如果我们有一组N维向量,现在要将其降到K维(K小于N),那么我们应该如何选择K个基才能最大程度保留原有的信息?
数据矩阵X的协方差矩阵C可表示为:
C = 1 m X X ⊤ C=\frac{1}{m} X X^{\top} C=m1XX⊤
其中, m m m的大小为:样本数-1。
1.3、优化目标逐步递进:
-
我们得到了降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段内的方差则尽可能大(在正交的约束下,取最大的K个方差)。
-
要达到优化目标,等价于将协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列,这样我们就达到了优化目的。
-
优化目标变成了寻找一个矩阵P,满足 P C P T PCP^T PCPT是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。
1.4、PCA算法步骤
总结一下PCA的算法步骤:(设有m条n维数据)
- 1)将原始数据按列组成n行m列矩阵X
- 2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
- 3)求出协方差矩阵 C = 1 m X X ⊤ C=\frac{1}{m} XX^⊤ C=m1XX⊤
- 4)求出协方差矩阵的特征值及对应的特征向量
- 5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
- 6)Y=PX即为降维到k维后的数据
1.5、实对称矩阵的性质
- 1)实对称矩阵不同特征值对应的特征向量必然正交。
- 2)设特征向量λ重数为r,则必然存在r个线性无关的特征向量对应于λ,因此可以将这r个特征向量单位正交化。
1.6、总结
- 1)PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。
- 2)可以很好的解除线性相关,但是对于高阶相关性就没有办法了,对于存在高阶相关性的数据,可以考虑Kernel PCA,通过Kernel函数将非线性相关转为线性相关。
- 3)PCA假设数据各主特征是分布在正交方向上,如果在非正交方向上存在几个方差较大的方向,PCA的效果就大打折扣了。
- 4)PCA是一种无参数技术,也就是说面对同样的数据,如果不考虑清洗,谁来做结果都一样,没有主观参数的介入,所以PCA便于通用实现,但是本身无法个性化的优化。
- 5)对于特征较多的数据样本,计算协方差矩阵是很耗时的操作,因此,在实践中会对数据样本做奇异值分解来代替协方差矩阵的特征值分解。
- 6)降维对于维度较高的数据集是很有必要的,虽然部分数据被舍弃了,但是舍弃这部分信息之后能使样本的采样密度增加,这正是降维的重要动机,另一方面,当数据受到噪声影响时,最小的特征值所对应的特征向量往往与噪声有关,将他们舍弃能在一定程度上起到去噪的效果。
- 7)PCA投影:,一方面是投影后方差最大(点到原点);一方面是点到直线的距离平方和最小。
参考
- 【强烈推荐这个油管视频(详细版)】B站 【中字】主成分分析法(PCA)| 分步步骤解析 看完你就懂了!
- 【强烈推荐这个油管视频(概括版)】5分钟看懂PCA分析!!!PCA main ideas in only 5 minutes!!!
- 【对油管PCA复现视频】主成分分析(PCA)的原理和简单推导
- 【B站PCA、SVD讲解视频】PCA降维算法教程
- 【阿里大佬文字描述】PCA的数学原理
- 【超级牛逼的PCA动画演示】Principal Component Analysis
- 最通俗易懂的PCA主成分分析推导
- python实现PCA(主成分分析)降维
- 【项目实战】使用opencv基于PCA降维算法的人脸识别项目教程
- PCA原理
- 主成分分析(PCA)原理详解
- PCA(主成分分析)python实现