主成分分析(PCA)与奇异值分解(SVD)

1、PCA

主成分分析(PCA) 是降维中非常常用的一种手段,比如汽车有nn个属性(或者说特征,那么维度就是nn),而其中两个属性xi,xjx^i,x^j分别表示汽车每小时行驶多少公里和每小时行驶多少英里,实际上这两个特征可以认为是一样的或者说是线性相关的,那么可以合并成一个,此时数据的维度应该降为n1n-1。那么如何来自动识别和删除这一冗余呢,使用PCA。

关于向量A,BA,B的内积,AB=a1b1+a2b2,...,anbnA\cdot B=a_1b_1+a_2b_2,...,a_nb_n,考虑几何解释的话那就是AB=ABcosαA\cdot B=|A||B|cos\alpha,如果B=1|B|=1那么AB=AcosαA\cdot B=|A|cos\alpha就表示为向量AABB所在直线投影的矢量长度。知道这点很重要,在后面会用到,向量xix_i在基向量wjTw_j^T上的投影为wjTxiw_j^Tx_i,既然提到了基向量,那么下面说一下基的概念。

首先说一下基的概念,考虑向量a=(3,4)Ta=(3,4)^T,如下图所示,
主成分分析(PCA)与奇异值分解(SVD)
基的定义:给定一个空间向量VVVV的一组基BB是指VV里面的可线性生成VV的一个线性无关的子集,BB的元素称为基向量。需要注意的是基向量线性无关(任意两个基向量互相垂直,即内积为0此时是不是也叫做正交了呢)

那么可以很自然的想到向量a=(3,4)Ta=(3,4)^T可以使用基(0,1)T(0,1)^T(1,0)T(1,0)^T线性表示为a=4(0,1)T+3(1,0)Ta=4(0,1)^T+3(1,0)^T。那么基(0,1)T(0,1)^T(1,0)T(1,0)^T为二维空间的一组基,任意向量都可以有这个两个即线性表示。

如果我们使用另外一组基(12,12)T,(12,12)T(\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}})^T,(\frac{1}{\sqrt{2}},-\frac{1}{\sqrt{2}})^T来表示向量a=(3,4)Ta=(3,4)^T,那么就会得到不一样的新坐标。

(1/21/21/21/2)(34)=(7/21/2)\left( \begin{array}{cc} 1/\sqrt{2} & 1/\sqrt{2} \\ 1/\sqrt{2} &-1/\sqrt{2} \end{array} \right)\left( \begin{array}{c} 3\\ 4\end{array} \right)=\left( \begin{array}{c} 7/\sqrt{2}\\ -1/\sqrt{2}\end{array} \right)

这种操作我们称作为基变换,写成定义的样子如下
基变换:数据与一个基做内积运算,结果作为第一个新的左边分量,然后与第二个基做内积运算,结果作为第二个新坐标的分量,依次类推,公式化如下
(p1p2pd)(a1,a2,...,aM)=(p1a1p1a2p1aMp2a1p2a2p2aMpda1pda2pdaM)\left( \begin{array}{c} p_1\\ p_2\\\vdots\\p_{d'} \end{array} \right)(a_1,a_2,...,a_M)=\left( \begin{array}{cccc} p_1a_1 & p_1a_2&\ldots&p_1a_M \\ p_2a_1 & p_2a_2&\ldots&p_2a_M\\\vdots & \vdots&\ddots&\vdots\\p_{d'}a_1 & p_{d'}a_2&\ldots&p_{d'}a_M \end{array} \right)

上式中,ai=(ai1,ai2,...,aid)Ta_i=(a_{i1},a_{i2},...,a_{id})^T原本是dd维的,最后得到的是d{d'}维的(不是说a成了pdp_{d'}维,而是样本从原来的(a1,a2,...,aM)(a_1,a_2,...,a_M)变成了上式中的新矩阵,对应的仍然是MM个样本即列向量,只是维度成了pdp_{d'}了)。

再回来看PCA,不是说PCA用来降维吗,将dd维度,降到dd^{'} 维。数据是(a1,a2,...,aM)(a_1,a_2,...,a_M),而我们要做的是求出dd^{'}个基向量pp,相乘(即基变换后)得到d×Md^{'}\times M维度的矩阵,即每个数据aia_i的维度变成了dd^{'}

任意pi,pjp_i,p_j是相互正交的,我们进行标准化,即pi=1|p_i|=1,那么得到的就是正交单位阵了。

补充:两个矩阵相乘的意义是将右边那个矩阵的每一列的列向量变换到左边矩阵的每一行向量为基所表示的空间中去。

下面考虑如何选择这些基向量

PCA的目标是尽量保留最多的原始信息(任意特征都尽可能表示更多的信息),一种直观的做法就是将样本投影到新空间中,使得在该空间中方差最大。

补充:很多地方都说是样本方差最大,个人认为应该指的是特征的方差最大,如果是样本的方差的话,投影变换后样本的方差实际是个矩阵,矩阵最大似乎没听过。

为了便于理解,多说两句:

(1)、特征的方差表示样本关于该特征的分散程度,所以要求数据在该特征上够分散,那么该特征的方差尽可能大。
(2)、两个特征的协方差表示这两个特征的相关程度,PCA既然是降维,线性相关的特征我们就不要了。也就是说我们选择的基向量需要两两正交(此时任意两个特征的协方差为0,即线性无关),通俗点说是因为一个基向量决定一个特征不是吗,比如上面的式子dd'个基向量不是决定了最后的dd'个特征。
(3)、如果仅仅选择方差最大的基,一旦选出来第一大方差所对应的基(变换后等于对应一个特征),那么第二个基实际上是非常接近于第一个基的那么就说明这两个特征的相关性较大了,但是为了让每个特征尽可能表示多的信息,所以希望任意两个基都是线性无关的。

那么我们总结一下:

寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
由于任意两个特征要求线性无关,即协方差为0,所以要求每个基都是相互正交的,基于此,我们再求方差第二大时所对应的基,以此类推下去。
由于协方差矩阵的对角元素为各个特征的方差(是去均值化了的方差,即xi=xi1mi=1mxix_i=x_i-\frac{1}{m}\sum\limits_{i=1}^{m}x_i),位置(i,j)ij(i,j),i\neq j则表示特征的协方差,根据上面所说的,要求协方差为0,即协方差矩阵中除了对角线元素外,其他位置的值要求均为0。

所以基组成的矩阵WTW^T是单位正交阵,记数据集XX,变换后的矩阵A=WTXA=W^TX的协方差矩阵AATAA^T的对角线以外的元素均为0,而对角线上的元素为各个特征的方差。

AAT=WTXXTWAA^T=W^TXX^TW,由于XXTXX^T是对称阵,所以肯定存在单位正交阵WW使得WTXXTW=ΛW^TXX^TW=\Lambda,其中Λ\Lambda除对角线上的元素外,其他位置元素的值均为0的方阵。这部分参考线代的书的矩阵对角化部分内容即可,实际上对角线上的值即为方差,也是XXTw=λwXX^Tw=\lambda w的特征值λ\lambda,对应的w为特征向量。这个操作被称作特征分解(后面会介绍,建议看一下线代的这部分内容,比什么博客都说的清楚)。

然后将对角线上的元素由大到小排列,取我们需要的前dd'个所对应的特征向量即可.这dd'个向量就是主成分

下面给出PCA算法流程和一个具体的例子

PCA算法流程

输入:样本集D={x1,x2,...,xm}D=\{x_1,x_2,...,x_m\}
输出:降维后的样本集DD'

第一步: 对所有样本集进行去中心化操作 xi=xi1mi=1mxix_i=x_i-\frac{1}{m}\sum\limits_{i=1}^{m}x_i
第二步:计算样本的协方差矩阵XXTXX^T
第三步:对协方差矩阵XXTXX^T进行特征值分解,得到特征值集合后并由大到小排序{λ1,λ2,...,λm}\{\lambda_1,\lambda_2,...,\lambda_m\}
第四步:取前KK大的特征值对应的特征向量WT=(w1,w2,...,wd)TW^T=(w_1,w_2,...,w_{d'})^T
第五步:对样本集DD进行降维转换,即新的样本zi=WTxiz_i=W^Tx_i

补充:有没有指定dd',而是换种方式,指定一个降维到的主成分比重阈值tt,则KK可以通过下式计算得到

d=argmindi=1dλii=1dλitd'=arg\min\limits_{d'}\frac{\sum\limits_{i=1}^{d'}\lambda_i}{\sum\limits_{i=1}^{d}\lambda_i}\geq t

主成分分析(PCA)与奇异值分解(SVD)

2、SVD

进行特征分解需要方阵,而进行奇异值分解则不需要了,下面给出奇异值分解的定义

对于任意实矩阵ARm×nA\in R^{m\times n},都可以分解为 以下形式:

A=UΣVT\qquad \qquad A=U\Sigma V^T

其中,UUmm阶方阵,是满足UTU=IU^TU=I的酉矩阵(正交矩阵往复数上的推广);VVnn阶方阵,是满足VTV=IV^TV=I的酉矩阵。Σ\Sigmam×nm\times n阶矩阵,除主对角线元素外,其他位置元素均为0,且主对角线元素值由大到小排列。

其中UU中的列向量uiu_i称为左奇异向量,VV中的viv_i称为右奇异向量,Σ\Sigma中的对角线上的值σi\sigma_i称为奇异值。

那么这几个参数怎么求呢?
方便起见,先求方阵VV中的向量viv_i,讲PCA的时候说了数据集组成的矩阵为AA,求AATui=λiuiAA^Tu_i=\lambda_iu_i,这里的uiu_i即为奇异值分解式子UU中的uiu_i

再求方阵VV中的向量viv_iATAvi=λiviA^TAv_i=\lambda_iv_i,这里的viv_i即为奇异值分解式子VV中的viv_i

最后求Σ\Sigma中对角线元素σi\sigma_iAV=UΣVTV=>AV=UΣ=>Avi=uiσi=>σi=Avi/uiAV=U\Sigma V^TV=>AV=U\Sigma=>Av_i=u_i\sigma_i=>\sigma_i=Av_i/u_i

下面做个简单的证明:

AT=VΣTUT=>ATA=VΣTUTUΣVT=VΣTΣVT=VΣ2VTA^T=V\Sigma^T U^T=>A^TA=V\Sigma^T U^TU\Sigma V^T=V\Sigma^T \Sigma V^T=V\Sigma^2 V^T

注意:ΣTΣ=Σ2\Sigma^T \Sigma=\Sigma^2nn阶方阵,对角线上的值,为ΣT\Sigma^T对角线位置的值的平方,将其看做Λ\LambdaATAA^TA为对称阵,将其看做CC,那么C=VΛVTC=V\Lambda V^T这不就是特征分解的公式吗,恰好说明了viv_i为特征向量,同时也发现了λi=σi2\lambda_i=\sigma_i^2

所以分解可以这样做

  1. AATui=λiuiAA^Tu_i=\lambda_iu_i,这里的uiu_i即为奇异值分解式子UU中的uiu_i
  2. ATAvi=λiviA^TAv_i=\lambda_iv_i,这里的viv_i即为奇异值分解式子VV中的viv_i,同时得到σi=λi\sigma_i=\sqrt{\lambda_i}

实际上,往往只保留前KK大的奇异值,用这钱KK大的元素就足够来描述这个矩阵了,有 A=Um×KΣK×KVK×nTA=U_{m\times K}\Sigma_{K\times K}V_{K\times n}^T。这个性质非常重要,常常用来做降维,去噪,推荐算法。