PCA原理详解
1 简介
在机器学习中我们都知道,有时候训练样本的特征太多也并非是好事,由于各特征之间存在一定的相关关系,从而增加了问题分析的复杂性。因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。将n维的特征映射到k维,再用k维特征进行模型的预测。
降维具有如下一些优点:
(1)使得数据集更易使用。
(2)降低算法的计算开销。
(3)去除噪声。
(4)使得结果容易理解。
降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。PCA(Principal Components Analysis),就是其中的最常用的降维方法之一。
2 详细原理
为了实现将n维的特征映射到k维,这全新的k维正交的特征就被称为主成分。PCA就是从原始n维空间中顺序地找出一组k维正交的坐标轴,原始空间总的所有点可以在新的空间中表示出来,其实就相当于空间向量的坐标变换。
具体步骤是:第1个新坐标轴选择原始数据中方差最大的方向,第2个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的方向,第3个轴是与第1,2个轴正交的平面中方差最大的方向。依次类推,通过这种方式可以得到n个坐标轴,但其中大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。
因此,如何得到这些包含最大差异性的主成分方向呢?
答案是这样的,首先计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。
在详细讲述之前,先要讲一些基本的数学知识。
2.1 特征值和特征向量
如果一个向量 v v v是矩阵 A A A的特征向量,则满足:
A v = λ v Av=λv Av=λv
其中, λ λ λ是特征值,向量 v v v是 λ λ λ对应的特征向量。不同特征值之间的特征向量是两两正交。两个矩阵相乘 A × B A \times B A×B的意义是对矩阵 A A A进行了拉升或旋转的操作,而这里表示 A A A在 v v v的方向上进行了拉升或压缩操作, λ λ λ反应了拉升或压缩的程度,特征值的方向是变化程度最大的方向。
对于矩阵 A A A,有一组特征向量 v v v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:
A = Q Σ Q − 1 A=Q\Sigma Q^{-1} A=QΣQ−1
其中, Q Q Q是矩阵 A A A的特征向量组成的矩阵,是 A A A的一个极大线性无关组, Σ \Sigma Σ则是一个对角阵,对角线上的元素就是特征值。
一般我们会把 Q Q Q的这n个特征向量标准化,即满足 ∣ ∣ v i ∣ ∣ 2 = 1 ||v_i||^2=1 ∣∣vi∣∣2=1, 或者说 v i T v i = 1 v^T_iv_i=1 viTvi=1,此时 Q Q Q的n个特征向量为标准正交基,满足 Q T Q = I Q^TQ=I QTQ=I,即 Q T = Q − 1 Q^T=Q^{−1} QT=Q−1, 也就是说 Q Q Q为酉矩阵。这样特征分解的表达式可以写成:
A = Q Σ Q T A=Q \Sigma Q^T A=QΣQT
注意到要进行特征分解,矩阵 A A A必须为方阵。那么如果 A A A不是方阵,即行和列不相同时,那还可以对矩阵进行分解吗?答案是可以,此时SVD登场了。
2.2 奇异值分解(SVD)
2.2.1 SVD定义
奇异值分解(Singular Value Decomposition,SVD)是能对任意矩阵进行分解。对于任意矩阵A总是存在一个奇异值分解:
A = U Σ V T A=U \Sigma V^T A=UΣVT
其中 U U U是一个 m × m m×m m×m的矩阵, Σ Σ Σ是一个 m × n m×n m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值, V V V是一个 n × n n×n n×n的矩阵。 U U U和 V V V都是酉矩阵,即满足 U T U = I , V T V = I U^TU=I,V^TV=I UTU=I,VTV=I。下图可以很形象的看出上面SVD的定义:
那么我们如何求出SVD分解后的 U , Σ , V U,Σ,V U,Σ,V这三个矩阵呢?
如果我们将 A A A的转置和 A A A做矩阵乘法,那么会得到 n × n n×n n×n的一个方阵 A T A A^TA ATA。既然 A T A A^TA ATA是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:
( A T A ) v i = λ i v i (A^TA)v_i= \lambda _iv_i (ATA)vi=λivi
这样我们就可以得到矩阵 A T A A^TA ATA的n个特征值和对应的n个特征向量 v v v了。将 A T A A^TA ATA的所有特征向量张成一个 n × n n×n n×n的矩阵 V V V, V V T = V T V = I VV^T=V^TV=I VVT=VTV=I,就是我们SVD公式里面的 V V V矩阵了。一般我们将 V V V中的每个特征向量叫做 A A A的右奇异向量。
如果我们将 A A A和 A A A的转置做矩阵乘法,那么会得到 m × m m×m m×m的一个方阵 A A T AA^T AAT。既然 A A T AA^T AAT是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:
( A A T ) u i = λ i u i (AA^T)u_i= \lambda _iu_i (AAT)ui=λiui
这样我们就可以得到矩阵 A A T AA^T AAT的m个特征值和对应的m个特征向量 u u u了。将 A A T AA^T AAT的所有特征向量张成一个 m × m m×m m×m的矩阵 U U U, U U T = U T U = I UU^T=U^TU=I UUT=UTU=I,就是我们SVD公式里面的 U U U矩阵了。一般我们将 U U U中的每个特征向量叫做A的左奇异向量。
U U U和 V V V我们都求出来了,现在就剩下奇异值矩阵 Σ Σ Σ没有求出了。由于 Σ Σ Σ除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值 σ i σ_i σi就可以了。
A = U Σ V T ⇒ A V = U Σ V T V ⇒ A V = U Σ A=UΣV^T⇒AV=UΣV^TV⇒AV=UΣ A=UΣVT⇒AV=UΣVTV⇒AV=UΣ ⇒ A ( v 1 , v 2 , . . . , v i ) = ( u 1 , u 2 , . . . , u i ) ( σ 1 0 ⋯ 0 0 σ 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ σ i ) ⇒A(v_1, v_2,..., v_i )=(u_1, u_2,..., u_i )\left( \begin{matrix} σ_1 & 0 & \cdots & 0\\ 0 & σ_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & σ_i \end{matrix} \right) ⇒A(v1,v2,...,vi)=