如今,数据挖掘和机器学习常面对高维数据( X ∈ R d X \in \R^{d} X∈Rd)。为了应对高维数据,数据预处理通常需要对数据做降维处理( Y = f ( X ) ∈ R p , p ≪ d Y = f(X) \in \R^{p}, p \ll d Y=f(X)∈Rp,p≪d)。在降低数据维度的同时,要尽可能的保留原有的数据信息。主成分分析便是一种常用的降维方法。它在降维的同时尽可能的保留原数据的方差信息。
假设我们有下图中的二维数据( X = [ x 1 , x 2 ] T X = [x_{1}, x_{2}]^{T} X=[x1,x2]T),我们想将其降维到一维,即用一个坐标轴 v v v来描述。如图所示,有无数个 v v v轴可以选择(图中仅表现3个),选择哪条轴可以最大程度地保留数据 X X X的信息呢?PCA选择数据在该方向上投影的范围最广的轴 v 3 v_{3} v3,即数据的投影在 v 3 v_{3} v3方向上的点最分散(方差最大)。数学表达即:
a r g max v v a r ( v T X ) arg \max \limits_{v} \hspace{0.2cm} var(v^{T}X) argvmaxvar(vTX)
此处,需要引入协方差的概念和一些推导公式。协方差 C o v ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ] Cov(X,Y) = E[(X-E[X])(Y-E[Y])] Cov(X,Y)=E[(X−E[X])(Y−E[Y])]是计算两个随机变量 X X X和 Y Y Y之间的相关性。两个随机变量越线性相关,其协方差越大;线性无关,其协方差为零。
假定我们有原始数据 X d × n X_{d \times n} Xd×n,其中 n n n是样本数量, d d d是数据维度。那么 X X X的协方差矩阵 S X S_{X} SX就是计算数据不同维度间的协方差,如下所示:
S X = [ C o v ( X 1 , : , X 1 , : ) … C o v ( X 1 , : , X d , : ) ⋮ ⋮ C o v ( X d , : , X 1 , : ) … C o v ( X d , : , X d , : ) ] S_{X} = \begin{bmatrix} Cov(X_{1,:},X_{1,:}) & \dots & Cov(X_{1,:},X_{d,:}) \\ \vdots & & \vdots \\ Cov(X_{d,:},X_{1,:}) & \dots & Cov(X_{d,:},X_{d,:}) \\ \end{bmatrix} SX=⎣⎢⎡Cov(X1,:,X1,:)⋮Cov(Xd,:,X1,:)……Cov(X1,:,Xd,:)⋮Cov(Xd,:,Xd,:)⎦⎥⎤
计算公式:
S X = 1 n ∑ i = 1 n ( X : , i − μ ) ( X : , i − μ ) T , w h e r e μ = 1 n ∑ i = 1 n X : , i S_{X} = \frac{1}{n} \sum_{i=1}^{n}(X_{:,i} - \mu)(X_{:,i} - \mu)^{T}, \hspace{1cm} where \hspace{0.2cm} \mu = \frac{1}{n} \sum_{i=1}^{n}X_{:,i} SX=n1i=1∑n(X:,i−μ)(X:,i−μ)T,whereμ=n1i=1∑nX:,i
下面我们证明 S X = 1 n X ˉ X ˉ T S_{X} = \frac{1}{n} \bar{X} \bar{X}^{T} SX=n1XˉXˉT,其中: X ˉ = [ X ˉ : , 1 … X ˉ : , n ] \bar{X} = \begin{bmatrix} \bar{X}_{:,1} & \dots & \bar{X}_{:,n} \end{bmatrix} Xˉ=[Xˉ:,1…Xˉ:,n], X ˉ : , i = X : , i − μ \bar{X}_{:,i} = X_{:,i} - \mu Xˉ:,i=X:,i−μ。1 n X ˉ X ˉ T = 1 n [ X : , 1 − μ … X : , 1 − μ ] [ X : , 1 − μ … X : , 1 − μ ] T = 1 n [ X : , 1 − μ … X : , 1 − μ ] [ ( X : , 1 − μ ) T ⋮ ( X : , 1 − μ ) T ] = 1 n [ X 1 , 1 − μ 1 … X 1 , n − μ 1 ⋮ ⋮ X d , 1 − μ d … X d , n − μ d ] [ X 1 , 1 − μ 1 … X d , 1 − μ d ⋮ ⋮ X 1 , n − μ 1 … X d , n − μ d ] = 1 n [ ∑ i = 1 n ( X 1 , i − μ 1 ) ( X 1 , i − μ 1 ) … ∑ i = 1 n ( X 1 , i − μ 1 ) ( X d , i − μ d ) ⋮ ⋮ ∑ i = 1 n ( X d , i − μ d ) ( X 1 , i − μ 1 ) … ∑ i = 1 n ( X d , i − μ d ) ( X d , i − μ d ) ] \begin{aligned} \frac{1}{n} \bar{X} \bar{X}^{T} &= \frac{1}{n} \begin{bmatrix} X_{:,1}-\mu & \dots & X_{:,1}-\mu \end{bmatrix} \begin{bmatrix} X_{:,1}-\mu & \dots & X_{:,1}-\mu \end{bmatrix}^{T} \\ &= \frac{1}{n} \begin{bmatrix} X_{:,1}-\mu & \dots & X_{:,1}-\mu \end{bmatrix} \begin{bmatrix} (X_{:,1}-\mu)^{T} \\ \vdots \\ (X_{:,1}-\mu)^T \end{bmatrix} \\ &= \frac{1}{n} \begin{bmatrix} X_{1,1}-\mu_{1} & \dots & X_{1,n}-\mu_{1} \\ \vdots & & \vdots \\ X_{d,1}-\mu_{d} & \dots & X_{d,n}-\mu_{d} \end{bmatrix} \begin{bmatrix} X_{1,1}-\mu_{1} & \dots & X_{d,1}-\mu_{d} \\ \vdots & & \vdots \\ X_{1,n}-\mu_{1} & \dots & X_{d,n}-\mu_{d} \end{bmatrix} \\ &= \frac{1}{n} \begin{bmatrix} \sum_{i=1}^{n} (X_{1,i}-\mu_{1})(X_{1,i}-\mu_{1}) & \dots & \sum_{i=1}^{n} (X_{1,i}-\mu_{1})(X_{d,i}-\mu_{d}) \\ \vdots & & \vdots \\ \sum_{i=1}^{n} (X_{d,i}-\mu_{d})(X_{1,i}-\mu_{1}) & \dots & \sum_{i=1}^{n} (X_{d,i}-\mu_{d})(X_{d,i}-\mu_{d}) \end{bmatrix} \end{aligned} n1XˉXˉT=n1[X:,1−μ…X:,1−μ][X:,1−μ…X:,1−μ]T=n1[X:,1−μ…X:,1−μ]⎣⎢⎡(X:,1−μ)T⋮(X:,1−μ)T⎦⎥⎤=n1⎣⎢⎡X1,1−μ1⋮Xd,1−μd……X1,n−μ1⋮Xd,n−μd⎦⎥⎤⎣⎢⎡X1,1−μ1⋮X1,n−μ1……Xd,1−μd⋮Xd,n−μd⎦⎥⎤=n1⎣⎢⎡∑i=1n(X1,i−μ1)(X1,i−μ1)⋮∑i=1n(Xd,i−μd)(X1,i−μ1)……∑i=1n(X1,i−μ1)(Xd,i−μd)⋮∑i=1n(Xd,i−μd)(Xd,i−μd)⎦⎥⎤
S X = 1 n ∑ i = 1 n ( X : , i − μ ) ( X : , i − μ ) T = 1 n ∑ i = 1 n [ X 1 ; i − μ 1 ⋮ X d ; i − μ d ] [ X 1 ; i − μ 1 … X d ; i − μ d ] = 1 n ∑ i = 1 n [ ( X 1 , i − μ 1 ) ( X 1 , i − μ 1 ) … ( X 1 , i − μ 1 ) ( X d , i − μ d ) ⋮ ⋮ ( X d , i − μ d ) ( X 1 , i − μ 1 ) … ( X d , i − μ d ) ( X d , i − μ d ) ] = 1 n [ ∑ i = 1 n ( X 1 , i − μ 1 ) ( X 1 , i − μ 1 ) … ∑ i = 1 n ( X 1 , i − μ 1 ) ( X d , i − μ d ) ⋮ ⋮ ∑ i = 1 n ( X d , i − μ d ) ( X 1 , i − μ 1 ) … ∑ i = 1 n ( X d , i − μ d ) ( X d , i − μ d ) ] = 1 n X ˉ X ˉ T \begin{aligned} S_{X} &= \frac{1}{n} \sum_{i=1}^{n}(X_{:,i} - \mu)(X_{:,i} - \mu)^{T} \\ &= \frac{1}{n} \sum_{i=1}^{n} \begin{bmatrix} X_{1;i}-\mu_{1} \\ \vdots \\ X_{d;i}-\mu_{d} \end{bmatrix} \begin{bmatrix} X_{1;i}-\mu_{1} & \dots & X_{d;i}-\mu_{d} \end{bmatrix} \\ &= \frac{1}{n} \sum_{i=1}^{n} \begin{bmatrix} (X_{1,i}-\mu_{1})(X_{1,i}-\mu_{1}) & \dots & (X_{1,i}-\mu_{1})(X_{d,i}-\mu_{d}) \\ \vdots & & \vdots \\ (X_{d,i}-\mu_{d})(X_{1,i}-\mu_{1}) & \dots & (X_{d,i}-\mu_{d})(X_{d,i}-\mu_{d}) \end{bmatrix} \\ &= \frac{1}{n} \begin{bmatrix} \sum_{i=1}^{n} (X_{1,i}-\mu_{1})(X_{1,i}-\mu_{1}) & \dots & \sum_{i=1}^{n} (X_{1,i}-\mu_{1})(X_{d,i}-\mu_{d}) \\ \vdots & & \vdots \\ \sum_{i=1}^{n} (X_{d,i}-\mu_{d})(X_{1,i}-\mu_{1}) & \dots & \sum_{i=1}^{n} (X_{d,i}-\mu_{d})(X_{d,i}-\mu_{d}) \end{bmatrix} \\ &= \frac{1}{n} \bar{X} \bar{X}^{T} \end{aligned} SX=n1i=1∑n(X:,i−μ)(X:,i−μ)T=n1i=1∑n⎣⎢⎡X1;i−μ1⋮Xd;i−μd⎦⎥⎤[X1;i−μ1…Xd;i−μd]=n1i=1∑n⎣⎢⎡(X1,i−μ1)(X1,i−μ1)⋮(Xd,i−μd)(X1,i−μ1)……(X1,i−μ1)(Xd,i−μd)⋮(Xd,i−μd)(Xd,i−μd)⎦⎥⎤=n1⎣⎢⎡∑i=1n(X1,i−μ1)(X1,i−μ1)⋮∑i=1n(Xd,i−μd)(X1,i−μ1)……∑i=1n(X1,i−μ1)(Xd,i−μd)⋮∑i=1n(Xd,i−μd)(Xd,i−μd)⎦⎥⎤=n1XˉXˉT
我们再回到目标函数 a r g max v v a r ( v T X ) arg \max \limits_{v} \hspace{0.2cm} var(v^{T}X) argvmaxvar(vTX):
v a r ( v T X ) = ∑ i = 1 n ( v T X : , i − 1 n ∑ i = 1 n v T X : , i ) 2 n = ∑ i = 1 n ( v T X : , i − 1 n ∑ i = 1 n v T X : , i ) ( v T X : , i − 1 n ∑ i = 1 n v T X : , i ) T n = ∑ i = 1 n v T ( X : , i − 1 n ∑ i = 1 n X : , i ) ( v T ( X : , i − 1 n ∑ i = 1 n X : , i ) ) T n = ∑ i = 1 n v T ( X : , i − 1 n ∑ i = 1 n X : , i ) ( X : , i − 1 n ∑ i = 1 n X : , i ) T v n = v T ∑ i = 1 n ( X : , i − 1 n ∑ i = 1 n X : , i ) ( X : , i − 1 n ∑ i = 1 n X : , i ) T n v = v T S X v \begin{aligned}var(v^{T}X) &= \frac{\sum_{i=1}^{n}(v^{T}X_{:,i} - \frac{1}{n}\sum_{i=1}^{n}v^{T}X_{:,i})^2}{n} \\&= \frac{\sum_{i=1}^{n}(v^{T}X_{:,i} - \frac{1}{n}\sum_{i=1}^{n}v^{T}X_{:,i})(v^{T}X_{:,i} - \frac{1}{n}\sum_{i=1}^{n}v^{T}X_{:,i})^{T}}{n} \\&= \frac{\sum_{i=1}^{n}v^{T}(X_{:,i} - \frac{1}{n}\sum_{i=1}^{n}X_{:,i})(v^{T}(X_{:,i} - \frac{1}{n}\sum_{i=1}^{n}X_{:,i}))^{T}}{n} \\&= \frac{\sum_{i=1}^{n}v^{T}(X_{:,i} - \frac{1}{n}\sum_{i=1}^{n}X_{:,i})(X_{:,i} - \frac{1}{n}\sum_{i=1}^{n}X_{:,i})^{T}v}{n} \\&= v^{T} \frac{\sum_{i=1}^{n}(X_{:,i} - \frac{1}{n}\sum_{i=1}^{n}X_{:,i})(X_{:,i} - \frac{1}{n}\sum_{i=1}^{n}X_{:,i})^{T}}{n} v \\& = v^{T} S_{X} v\end{aligned} var(vTX)=n∑i=1n(vTX:,i−n1∑i=1nvTX:,i)2=n∑i=1n(vTX:,i−n1∑i=1nvTX:,i)(vTX:,i−n1∑i=1nvTX:,i)T=n∑i=1nvT(X:,i−n1∑i=1nX:,i)(vT(X:,i−n1∑i=1nX:,i))T=n∑i=1nvT(X:,i−n1∑i=1nX:,i)(X:,i−n1∑i=1nX:,i)Tv=vTn∑i=1n(X:,i−n1∑i=1nX:,i)(X:,i−n1∑i=1nX:,i)Tv=vTSXv
即目标函数可转化为:
a r g max v v T S X v arg \max \limits_{v} \hspace{0.2cm} v^{T} S_{X} v argvmaxvTSXv
细心的你可能发现了,上式是一个开口朝上的函数,最大值无穷大。又如何能得到目标函数最大化时 v v v的取值呢?仔细观察上面的二维数据图示,我们发现,我们只关心数据在 v v v方向的投影,即 v v v的指向。 v v v向量的大小并不重要。因此,为目标函数增加约束条件(令 v v v为单位向量):
a r g max v v T S X v s . t . v T v = 1 arg \max \limits_{v} \hspace{0.2cm} v^{T} S_{X} v \hspace{1cm} s.t. \hspace{0.5cm} v^{T}v = 1 argvmaxvTSXvs.t.vTv=1
我们可以利用拉格朗日乘数来将上式有约束的优化问题转化为无约束的优化问题:
L ( v ) = − v T S X v + λ ( v T v − 1 ) L(v) = - v^{T}S_{X}v + \lambda (v^{T}v - 1) L(v)=−vTSXv+λ(vTv−1)
然后,再求 L L L对 v v v的导数(导数为零,求得 L L L的最小化时, v v v的取值):
∂ L ∂ v = − 2 S X v + 2 λ v = 0 → S X v = λ v \frac{\partial L}{\partial v} = -2S_{X}v + 2\lambda v = 0 \hspace{0.5cm} \rightarrow \hspace{0.5cm} S_{X}v = \lambda v ∂v∂L=−2SXv+2λv=0→SXv=λv
注意观察上式右边的式子,是不是和特征值/特征向量的定义很像?至此,我们发现对原始数据 X X X降维就是求 X X X的协方差矩阵的特征向量。至于 X X X的投影最大化时 v v v的取值就是特征值 λ \lambda λ取最大值时对应的特征向量( a r g max v v T S X v = a r g max v v T λ v = a r g max v λ v T v = a r g max v λ arg \max \limits_{v} \hspace{0.2cm} v^{T} S_{X} v = arg \max \limits_{v} \hspace{0.2cm} v^{T} \lambda v = arg \max \limits_{v} \hspace{0.2cm} \lambda v^{T} v = arg \max \limits_{v} \hspace{0.2cm} \lambda argvmaxvTSXv=argvmaxvTλv=argvmaxλvTv=argvmaxλ)。
S X S_{X} SX是 d × d d \times d d×d的矩阵,即最多有 d d d对特征值和特征向量。PCA中将 S X S_{X} SX的特征向量叫做主成分(principal component)。特征值第一大的特征向量叫第一主成分,特征值第二大的特征向量叫第二主成分,以此类推。PCA便是希望选择头 p p p个最大特征值对应的主成分,在 p p p维中描述 d d d维中的原始数据 X X X(通常 p ≪ d p \ll d p≪d)。可以采用以下计算公式来选择 p p p值的大小:
期 待 保 留 原 始 数 据 方 差 信 息 的 比 例 = ∑ i = 1 p λ i ∑ i = 1 d λ i 期待保留原始数据方差信息的比例 = \frac{\sum_{i=1}^{p} \lambda_{i}}{\sum_{i=1}^{d} \lambda_{i}} 期待保留原始数据方差信息的比例=∑i=1dλi∑i=1pλi
例如:我们期待保留原始数据 90 % 90\% 90%的方差信息, ∑ i = 1 p λ i ∑ i = 1 d λ i = 0.9 \frac{\sum_{i=1}^{p} \lambda_{i}}{\sum_{i=1}^{d} \lambda_{i}} = 0.9 ∑i=1dλi∑i=1pλi=0.9。 d d d和 λ i \lambda_{i} λi已知,可将 p p p值求解出。请再次观察二维数据 X X X的图示,会发现有两个数据点被标注为红色了。原因是,如果只选择一个主成分,即在一维中描述二维数据 X X X,这两个点会被投影到一维上的同一个点上。原始数据的部分信息丢失了。所以,数据降维不可避免地会导致数据信息的丢失,但是为了降低数据的复杂度,又不得不对数据进行降维处理。通常,小部分的信息丢失是可以忍受的。
以上内容是针对维度小于样本数的数据。但是,如今越来越多数据的维度特别高,但是数据量却很少。例如:基因数据、高精度图像等。对于数据 X d × n X_{d \times n} Xd×n,用PCA对其降维就需要先计算其协方差矩阵 S X = 1 n X ˉ X ˉ T S_{X} = \frac{1}{n} \bar{X}\bar{X}^T SX=n1XˉXˉT,然后再求解 S X S_{X} SX的特征值和特征向量。 X X X的维度是 d × n d \times n d×n, S X S_{X} SX的维度是 d × d d \times d d×d。对于 d = 100 , 000 d=100,000 d=100,000, n = 100 n=100 n=100的数据而言,对 S X S_{X} SX进行特征分解计算量非常大。有没有什么办法能减少计算量呢?
答案是肯定的,奇异值分解(SVD: Singular Value Decomposition)。对于任意矩阵 A m × n A_{m \times n} Am×n,我们可以对其做奇异值分解:
A = U Σ V T A = U \Sigma V^{T} A=UΣVT
其中, U U U是 A A T AA^{T} AAT的特征向量,其维度是 m × m m \times m m×m; Σ \Sigma Σ是对角矩阵,对角线上的值是 A A T AA^{T} AAT和 A T A A^{T}A ATA的特征值的平方( A A T AA^{T} AAT的特征值和 A T A A^{T}A ATA的特征值相同),呈降序排列,其维度是 m × n m \times n m×n; V V V是 A T A A^{T}A ATA的特征向量,其维度是 n × n n \times n n×n。
我们再整理一下我们的问题。对于维数远大于样本数的数据 X d × n X_{d \times n} Xd×n,我们想要通过其协方差矩阵的特征向量来对其降维。即想要得到 1 n X ˉ X ˉ T \frac{1}{n}\bar{X}\bar{X}^{T} n1XˉXˉT的特征向量,对应于SVD中的 U U U。我们对 X ˉ \bar{X} Xˉ奇异值分解公式左右均乘以 V V V,得到:
X ˉ V = U Σ V T V \bar{X}V = U \Sigma V^{T}V XˉV=UΣVTV
V V V是 A T A A^{T}A ATA的特征向量,即 V V V的每一列都是单位向量。那么, V T V = I n × n V^{T}V = I_{n \times n} VTV=In×n。所以,上式可以转化为:
X ˉ V = U Σ \bar{X}V = U \Sigma XˉV=UΣ
再在公式左右均乘以 Σ − 1 \Sigma^{-1} Σ−1。得到:
X ˉ V Σ − 1 = U \bar{X}V \Sigma^{-1} = U XˉVΣ−1=U
上式将对 U U U的求解可以转化为对 V V V和 Σ − 1 \Sigma^{-1} Σ−1的求解。其中, V V V是 X ˉ T X ˉ \bar{X}^{T}\bar{X} XˉTXˉ的特征向量, Σ \Sigma Σ对角线上是 X ˉ T X ˉ \bar{X}^{T}\bar{X} XˉTXˉ的特征值的平方(降序)。
至此,对于 X d × n X_{d \times n} Xd×n( d ≫ n d \gg n d≫n),对庞大的协方差矩阵 1 n X ˉ X ˉ T \frac{1}{n}\bar{X}\bar{X}^{T} n1XˉXˉT做特征分解,可以转化为对小矩阵 X ˉ T X ˉ \bar{X}^{T}\bar{X} XˉTXˉ的特征分解,以此降低计算量。
可以参考案例Start Face Recognition by PCA from scratch来理解PCA。