PCA(Principle Component Analysis 主成分分析)是深度学习中最常用的降维算法。本文将通过最基础的线性代数知识对PCA算法进行解释。
0. 为什么要进行降维&降维的目标&降维的原则
0.1 为什么要进行降维
在深度学习中,需要对大量的样本数据进行处理,而每个样本会包含很多特征(即维度),这样在进行各种运算和训练时无疑会消耗大量的内存和时间,所以我们希望适当的减少每个样本的维度,从而简化运算。
0.2 降维的目标
假设原始的数据集为Xm×nX_{m×n}Xm×n,如下所示:
Xm×n=[x1(1)x2(1)…xn(1)x1(2)x2(2)…xn(2)⋮⋮⋱⋮x1(m)x2(m)…xn(m)]X_{m×n}=\left[
\begin{matrix}
x_1^{(1)}&x_2^{(1)}&\dots & x_n^{(1)}\\
x_1^{(2)}&x_2^{(2)}&\dots & x_n^{(2)}\\
\vdots&\vdots&\ddots&\vdots\\
x_1^{(m)}& x_2^{(m)}&\dots & x_n^{(m)}
\end{matrix}
\right]Xm×n=⎣⎢⎢⎢⎢⎡x1(1)x1(2)⋮x1(m)x2(1)x2(2)⋮x2(m)……⋱…xn(1)xn(2)⋮xn(m)⎦⎥⎥⎥⎥⎤
表示有m个样本数据,每个样本数据有n个维度。即上述矩阵每一行是一个样本,共m个样本;每一列是一个维度,共n个维度。
我们的目标是不改变样本数量,减少样本维度,即减少上述矩阵的列数。
假设降成k维,则最终得到的降维后数据集为:
Ym×k=[y1(1)y2(1)…yk(1)y1(2)y2(2)…yk(2)⋮⋮⋱⋮y1(m)y2(m)…yk(m)]Y_{m×k}=\left[
\begin{matrix}
y_1^{(1)}&y_2^{(1)}&\dots & y_k^{(1)}\\
y_1^{(2)}&y_2^{(2)}&\dots & y_k^{(2)}\\
\vdots&\vdots&\ddots&\vdots\\
y_1^{(m)}&y_2^{(m)}&\dots & y_k^{(m)}
\end{matrix}
\right]Ym×k=⎣⎢⎢⎢⎢⎡y1(1)y1(2)⋮y1(m)y2(1)y2(2)⋮y2(m)……⋱…yk(1)yk(2)⋮yk(m)⎦⎥⎥⎥⎥⎤
设Ym×k=Xm×nQn×kY_{m×k}=X_{m×n}Q_{n×k}Ym×k=Xm×nQn×k,我们只要求出Q,就可以把X降维成Y,因此我们的目标就是找出一个恰当的Q
0.3 降维的原则
我们要在降低维度时尽可能减少数据的损失,所以我们让不同维度之间尽可能接近,同一维度的不同数据尽可能分散。(不同维度之间越接近,就意味着去掉一些维度时损失较小;同一维度的不同数据越分散,就意味着在这一维度上的数据越容易被区分)
我们在协方差矩阵中来衡量这一接近、分散程度。
以m个3维数据为例:(注意:a,b,c 表示不同维度,每一行是一个样本,每一列是一个维度)
[a1b1c1a2b2c2⋮⋮⋮ambmcm]\left[\begin{matrix} a_1&b_1&c_1\\ a_2&b_2&c_2\\ \vdots&\vdots&\vdots\\ a_m&b_m&c_m \end{matrix}\right]⎣⎢⎢⎢⎡a1a2⋮amb1b2⋮bmc1c2⋮cm⎦⎥⎥⎥⎤
其协方差为:
cov=[cov(a,a)cov(a,b)cov(a,c)cov(b,a)cov(b,b)cov(b,c)cov(c,a)cov(c,b)cov(c,c)]cov=\left[\begin{matrix} cov(a,a)&cov(a,b)&cov(a,c)\\ cov(b,a)&cov(b,b)&cov(b,c)\\ cov(c,a)&cov(c,b)&cov(c,c) \end{matrix}\right]cov=⎣⎡cov(a,a)cov(b,a)cov(c,a)cov(a,b)cov(b,b)cov(c,b)cov(a,c)cov(b,c)cov(c,c)⎦⎤
容易看出在协方差矩阵中,对角线元素表示的是每个维度上样本的方差,而非对角线元素表示的是不同维度之间样本的协方差。要使得“不同维度之间尽可能接近,同一维度数据尽可能分散”,就要让非对角线元素尽可能小,对角线元素尽可能大。
我们通过对数据的处理,使其协方差矩阵成为一个对角阵,那么非对角线元素为0,我们就可以放心的删去多余的维度;在删去时,我们删掉较小的对角线元素对应的列。
1. 计算X,Y的协方差矩阵
对于原始数据集Xm×nX_{m×n}Xm×n,其协方差矩阵为:
Cxn×n=1mXTXCx_{n×n}=\frac{1}{m}X^TXCxn×n=m1XTX(概率论里除以m-1的公式是无偏估计,但是这里数据总数已知,不涉及估计问题,只涉及离散程度的描述,因此除以m)
我们设最终数据集Ym×k=Xm×nQn×kY_{m×k}=X_{m×n}Q_{n×k}Ym×k=Xm×nQn×k,则其协方差矩阵满足:
Cyk×k=1mYTY=1mQTXTXQ=QTCxQCy_{k×k}=\frac{1}{m}Y^TY\\\frac{}{}\\=\frac{1}{m}Q^TX^TXQ\\\frac{}{}\\=Q^TCxQCyk×k=m1YTY=m1QTXTXQ=QTCxQ
2. 对角化
在降维之前,我们要处理数据集使其协方差矩阵成为对角阵,(即数据集要经过两步处理,X→Y’→Y),设Ym×n′=Xm×nQn×n′Y'_{m×n}=X_{m×n}Q'_{n×n}Ym×n′=Xm×nQn×n′,则同理可得Y′Y'Y′的协方差矩阵为:
Cyk×k′=1mY′TY′=1mQ′TXTXQ′=Q′TCxQ′Cy'_{k×k}=\frac{1}{m}Y'^TY'\\\frac{}{}\\=\frac{1}{m}Q'^TX^TXQ'\\\frac{}{}\\=Q'^TCxQ'Cyk×k′=m1Y′TY′=m1Q′TXTXQ′=Q′TCxQ′
对CxCxCx,有Cx=PΛPTCx=P\Lambda P^{T}Cx=PΛPT
设CxCxCx特征值为:λ1,λ2,…,λn\lambda_1, \lambda_2, \dots, \lambda_nλ1,λ2,…,λn(λ1≥λ2≥⋯≥λn\lambda_1 ≥\lambda_2≥\dots≥\lambda_nλ1≥λ2≥⋯≥λn)
对应特征向量为:ξ1,ξ2,…,ξn\xi_1, \xi_2, \dots, \xi_nξ1,ξ2,…,ξn
则令P=[ξ1,ξ2,…,ξn]P=[\xi_1,\xi_2,\dots, \xi_n]P=[ξ1,ξ2,…,ξn],有Cx=PΛP−1Cx=P\Lambda P^{-1}Cx=PΛP−1
其中,Λ=diag[λ1,λ2,…,λn]\Lambda=diag[\lambda_1, \lambda_2, \dots, \lambda_n]Λ=diag[λ1,λ2,…,λn],是一个由特征值构成的对角阵
由于协方差矩阵一定是对称阵,根据对称阵的性质,不同特征值对应的特征向量正交,即PTP=I=P−1PP^TP=I=P^{-1}PPTP=I=P−1P,即PT=P−1P^T=P^{-1}PT=P−1
故有Cx=PΛPTCx=P\Lambda P^TCx=PΛPT
因此我们令Q′=PQ'=PQ′=P,则有:
Cy′=Q′TCxQ′=PTPΛPTP=Λ=diag[λ1λ2…λn]Cy'=Q'^TCxQ'\\\frac{}{}\\=P^TP\Lambda P^TP\\\frac{}{}\\=\Lambda=diag[\lambda_1 \lambda_2 \dots \lambda_n]Cy′=Q′TCxQ′=PTPΛPTP=Λ=diag[λ1λ2…λn]
这样我们就将协方差矩阵转成了对角阵,实现这一变化的矩阵Q′=PQ'=PQ′=P。
3. 降维
假设降低成k维,由于之前已经将特征值从大到小排序,所以取前k个特征值λ\lambdaλ对应的特征向量ξ\xiξ构成QQQ:
Q=[ξ1,ξ2,…,ξk]Q=[\xi_1,\xi_2,\dots,\xi_k]Q=[ξ1,ξ2,…,ξk]
这样得到最终数据集YYY的协方差矩阵:
Cy=QTCxQ=diag[λ1…λk](λi是n维列向量)Cy=Q^TCxQ\\\frac{}{}\\=diag[\lambda_1 \dots \lambda_k] \\(\lambda_i是n维列向量)Cy=QTCxQ=diag[λ1…λk](λi是n维列向量)
则Y=XQY=XQY=XQ,实现了从Xm×nX_{m×n}Xm×n到Ym×kY_{m×k}Ym×k的降维。
4. 举例
若给定原始数据集为
X=[1−1320−20411]X=\left[\begin{matrix}
1&-1&3&2&0\\
-2&0&4&1&1
\end{matrix}\right]X=[1−2−10342101]
则其协方差矩阵为
Cx=12XTX=[2.5−0.5−2.50−1−0.50.5−1.5−10−2.5−1.512.5520−152.50.5−1020.50.5]Cx=\frac{1}{2}X^TX\\
=\left[\begin{matrix}
2.5&-0.5&-2.5&0&-1\\
-0.5&0.5&-1.5&-1&0\\
-2.5&-1.5&12.5&5&2\\
0&-1&5&2.5&0.5\\
-1&0&2&0.5&0.5
\end{matrix}\right]Cx=21XTX=⎣⎢⎢⎢⎢⎡2.5−0.5−2.50−1−0.50.5−1.5−10−2.5−1.512.5520−152.50.5−1020.50.5⎦⎥⎥⎥⎥⎤
其特征值为:λ1=15.5,λ2=3,λ3,4,5≈0\lambda_1=15.5,\lambda_2=3,\lambda_{3,4,5}≈0λ1=15.5,λ2=3,λ3,4,5≈0
对应特征向量ξ1\xi_1ξ1~ξ5\xi_5ξ5构成矩阵PPP为:
P=[ξ1ξ2ξ3ξ4ξ5]=[−0.18−0.82−0.290.380.27−0.110.330.110.90−0.230.900−0.410.15−0.050.36−0.410.820.04−0.180.140.240.250.130.92]P=[\begin{matrix}\xi_1&\xi_2&\xi_3&\xi_4&\xi_5]\end{matrix}\\\frac{}{}\\=\left[\begin{matrix}
-0.18&-0.82&-0.29&0.38&0.27\\
-0.11&0.33&0.11&0.90&-0.23\\
0.90& 0 &-0.41&0.15&-0.05\\
0.36 & -0.41 & 0.82 & 0.04& -0.18\\
0.14 & 0.24 & 0.25& 0.13 & 0.92
\end{matrix}\right]P=[ξ1ξ2ξ3ξ4ξ5]=⎣⎢⎢⎢⎢⎡−0.18−0.110.900.360.14−0.820.330−0.410.24−0.290.11−0.410.820.250.380.900.150.040.130.27−0.23−0.05−0.180.92⎦⎥⎥⎥⎥⎤
观察特征值,我们很容易发现后面三个非常小接近0,故而可以忽略,所以我们把原来的5维降低成2维是合理的,那么我们只需取最大的两个特征值对应的特征向量来构成QQQ:
Q=[ξ1ξ2]=[−0.18−0.82−0.110.330.9000.36−0.410.140.24]Q=[\begin{matrix}\xi_1&\xi_2]\end{matrix}\\\frac{}{}\\=\left[\begin{matrix}
-0.18&-0.82\\
-0.11&0.33\\
0.90& 0\\
0.36 & -0.41\\
0.14 & 0.24
\end{matrix}\right]Q=[ξ1ξ2]=⎣⎢⎢⎢⎢⎡−0.18−0.110.900.360.14−0.820.330−0.410.24⎦⎥⎥⎥⎥⎤
则得到降维后的数据集Y:Y:Y:
Y=XQ=[3.34−1.964.451.47]Y=XQ\\
=\left[\begin{matrix}
3.34&-1.96\\
4.45&1.47\\
\end{matrix}\right]Y=XQ=[3.344.45−1.961.47]
通常情况下,用PCA降维的同时还伴随着数据中心化,即使得所有数据点的中心归一到坐标原点。为与普遍的算法结果保持一致,我们对上述降维后的数据集进行中心化,即每一列减去该列的均值,得到:
Y中心化=[−0.56−1.710.561.71]Y_{中心化}=\left[\begin{matrix}
-0.56&-1.71\\
0.56&1.71
\end{matrix}\right]Y中心化=[−0.560.56−1.711.71]
在使用PCA时注意:
- 一定要弄清楚数据集的行、列,哪个是样本数,哪个是特征数(维度)
- 若数据集以行表示维度,列表示样本数(即与本文相反),那么协方差矩阵一定不能用自带的函数计算,其计算公式改为Cx=1mXXTCx=\frac{1}{m}XX^TCx=m1XXT, 其他的将相应的列操作变成行操作即可。不过与其如此,不如直接把原始数据集转置。