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

1、PCA

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

关于向量 A , B A,B A,B的内积, A ⋅ B = a 1 b 1 + a 2 b 2 , . . . , a n b n A\cdot B=a_1b_1+a_2b_2,...,a_nb_n AB=a1b1+a2b2,...,anbn,考虑几何解释的话那就是 A ⋅ B = ∣ A ∣ ∣ B ∣ c o s α A\cdot B=|A||B|cos\alpha AB=ABcosα,如果 ∣ B ∣ = 1 |B|=1 B=1那么 A ⋅ B = ∣ A ∣ c o s α A\cdot B=|A|cos\alpha AB=Acosα就表示为向量 A A A B B B所在直线投影的矢量长度。知道这点很重要,在后面会用到,向量 x i x_i xi在基向量 w j T w_j^T wjT上的投影为 w j T x i w_j^Tx_i wjTxi,既然提到了基向量,那么下面说一下基的概念。

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

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

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

( 1 / 2 1 / 2 1 / 2 − 1 / 2 ) ( 3 4 ) = ( 7 / 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}{c} 3\\ 4\end{array} \right)=\left( \begin{array}{c} 7/\sqrt{2}\\ -1/\sqrt{2}\end{array} \right) (1/2 1/2 1/2 1/2 )(34)=(7/2 1/2 )

这种操作我们称作为基变换,写成定义的样子如下
基变换:数据与一个基做内积运算,结果作为第一个新的左边分量,然后与第二个基做内积运算,结果作为第二个新坐标的分量,依次类推,公式化如下
( p 1 p 2 ⋮ p d ′ ) ( 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 d ′ a 1 p d ′ a 2 … p d ′ a M ) \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) p1p2pd(a1,a2,...,aM)=p1a1p2a1pda1p1a2p2a2pda2p1aMp2aMpdaM

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

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

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

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

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

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

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

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

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

那么我们总结一下:

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

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

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

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

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

PCA算法流程

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

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

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

d ′ = a r g min ⁡ d ′ ∑ i = 1 d ′ λ i ∑ i = 1 d λ i ≥ t d'=arg\min\limits_{d'}\frac{\sum\limits_{i=1}^{d'}\lambda_i}{\sum\limits_{i=1}^{d}\lambda_i}\geq t d=argdmini=1dλii=1dλit

主成分分析(PCA)与奇异值分解(SVD)_第2张图片

2、SVD

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

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

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

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

其中 U U U中的列向量 u i u_i ui称为左奇异向量, V V V中的 v i v_i vi称为右奇异向量, Σ \Sigma Σ中的对角线上的值 σ i \sigma_i σi称为奇异值。

那么这几个参数怎么求呢?
方便起见,先求方阵 V V V中的向量 v i v_i vi,讲PCA的时候说了数据集组成的矩阵为 A A A,求 A A T u i = λ i u i AA^Tu_i=\lambda_iu_i AATui=λiui,这里的 u i u_i ui即为奇异值分解式子 U U U中的 u i u_i ui

再求方阵 V V V中的向量 v i v_i vi A T A v i = λ i v i A^TAv_i=\lambda_iv_i ATAvi=λivi,这里的 v i v_i vi即为奇异值分解式子 V V V中的 v i v_i vi

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

下面做个简单的证明:

A T = V Σ T U T = > A T A = V Σ T U T U Σ V T = V Σ T Σ V T = V Σ 2 V T A^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 AT=VΣTUT=>ATA=VΣTUTUΣVT=VΣTΣVT=VΣ2VT

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

所以分解可以这样做

  1. A A T u i = λ i u i AA^Tu_i=\lambda_iu_i AATui=λiui,这里的 u i u_i ui即为奇异值分解式子 U U U中的 u i u_i ui
  2. A T A v i = λ i v i A^TAv_i=\lambda_iv_i ATAvi=λivi,这里的 v i v_i vi即为奇异值分解式子 V V V中的 v i v_i vi,同时得到 σ i = λ i \sigma_i=\sqrt{\lambda_i} σi=λi

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

你可能感兴趣的:(机器学习,PCA,SVD,降维)