PCA(Principle Component Analysis 主成分分析)是深度学习中最常用的降维算法。本文将通过最基础的线性代数知识对PCA算法进行解释。
0. 为什么要进行降维&降维的目标&降维的原则
0.1 为什么要进行降维
在深度学习中,需要对大量的样本数据进行处理,而每个样本会包含很多特征(即维度),这样在进行各种运算和训练时无疑会消耗大量的内存和时间,所以我们希望适当的减少每个样本的维度,从而简化运算。
0.2 降维的目标
假设原始的数据集为
X
m
×
n
X_{m×n}
Xm×n,如下所示:
X
m
×
n
=
[
x
1
(
1
)
x
2
(
1
)
…
x
n
(
1
)
x
1
(
2
)
x
2
(
2
)
…
x
n
(
2
)
⋮
⋮
⋱
⋮
x
1
(
m
)
x
2
(
m
)
…
x
n
(
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维,则最终得到的降维后数据集为:
Y
m
×
k
=
[
y
1
(
1
)
y
2
(
1
)
…
y
k
(
1
)
y
1
(
2
)
y
2
(
2
)
…
y
k
(
2
)
⋮
⋮
⋱
⋮
y
1
(
m
)
y
2
(
m
)
…
y
k
(
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)⎦⎥⎥⎥⎥⎤
设 Y m × k = X m × n Q n × k Y_{m×k}=X_{m×n}Q_{n×k} Ym×k=Xm×nQn×k,我们只要求出Q,就可以把X降维成Y,因此我们的目标就是找出一个恰当的Q
0.3 降维的原则
我们要在降低维度时尽可能减少数据的损失,所以我们让不同维度之间尽可能接近,同一维度的不同数据尽可能分散。(不同维度之间越接近,就意味着去掉一些维度时损失较小;同一维度的不同数据越分散,就意味着在这一维度上的数据越容易被区分)
我们在协方差矩阵中来衡量这一接近、分散程度。
以m个3维数据为例:(注意:a,b,c 表示不同维度,每一行是一个样本,每一列是一个维度)
[ a 1 b 1 c 1 a 2 b 2 c 2 ⋮ ⋮ ⋮ a m b m c m ] \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⎦⎥⎥⎥⎤
其协方差为:
c o v = [ c o v ( a , a ) c o v ( a , b ) c o v ( a , c ) c o v ( b , a ) c o v ( b , b ) c o v ( b , c ) c o v ( c , a ) c o v ( c , b ) c o v ( 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的协方差矩阵
对于原始数据集
X
m
×
n
X_{m×n}
Xm×n,其协方差矩阵为:
C
x
n
×
n
=
1
m
X
T
X
Cx_{n×n}=\frac{1}{m}X^TX
Cxn×n=m1XTX(概率论里除以m-1的公式是无偏估计,但是这里数据总数已知,不涉及估计问题,只涉及离散程度的描述,因此除以m)
我们设最终数据集
Y
m
×
k
=
X
m
×
n
Q
n
×
k
Y_{m×k}=X_{m×n}Q_{n×k}
Ym×k=Xm×nQn×k,则其协方差矩阵满足:
C
y
k
×
k
=
1
m
Y
T
Y
=
1
m
Q
T
X
T
X
Q
=
Q
T
C
x
Q
Cy_{k×k}=\frac{1}{m}Y^TY\\\frac{}{}\\=\frac{1}{m}Q^TX^TXQ\\\frac{}{}\\=Q^TCxQ
Cyk×k=m1YTY=m1QTXTXQ=QTCxQ
2. 对角化
在降维之前,我们要处理数据集使其协方差矩阵成为对角阵,(即数据集要经过两步处理,X→Y’→Y),设
Y
m
×
n
′
=
X
m
×
n
Q
n
×
n
′
Y'_{m×n}=X_{m×n}Q'_{n×n}
Ym×n′=Xm×nQn×n′,则同理可得
Y
′
Y'
Y′的协方差矩阵为:
C
y
k
×
k
′
=
1
m
Y
′
T
Y
′
=
1
m
Q
′
T
X
T
X
Q
′
=
Q
′
T
C
x
Q
′
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′
对
C
x
Cx
Cx,有
C
x
=
P
Λ
P
T
Cx=P\Lambda P^{T}
Cx=PΛPT
设 C x Cx Cx特征值为: λ 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],有 C x = P Λ P − 1 Cx=P\Lambda P^{-1} Cx=PΛP−1
其中, Λ = d i a g [ λ 1 , λ 2 , … , λ n ] \Lambda=diag[\lambda_1, \lambda_2, \dots, \lambda_n] Λ=diag[λ1,λ2,…,λn],是一个由特征值构成的对角阵
由于协方差矩阵一定是对称阵,根据对称阵的性质,不同特征值对应的特征向量正交,即 P T P = I = P − 1 P P^TP=I=P^{-1}P PTP=I=P−1P,即 P T = P − 1 P^T=P^{-1} PT=P−1
故有 C x = P Λ P T Cx=P\Lambda P^T Cx=PΛPT
因此我们令
Q
′
=
P
Q'=P
Q′=P,则有:
C
y
′
=
Q
′
T
C
x
Q
′
=
P
T
P
Λ
P
T
P
=
Λ
=
d
i
a
g
[
λ
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 ′ = P Q'=P Q′=P。
3. 降维
假设降低成k维,由于之前已经将特征值从大到小排序,所以取前k个特征值
λ
\lambda
λ对应的特征向量
ξ
\xi
ξ构成
Q
Q
Q:
Q
=
[
ξ
1
,
ξ
2
,
…
,
ξ
k
]
Q=[\xi_1,\xi_2,\dots,\xi_k]
Q=[ξ1,ξ2,…,ξk]
这样得到最终数据集
Y
Y
Y的协方差矩阵:
C
y
=
Q
T
C
x
Q
=
d
i
a
g
[
λ
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
=
X
Q
Y=XQ
Y=XQ,实现了从
X
m
×
n
X_{m×n}
Xm×n到
Y
m
×
k
Y_{m×k}
Ym×k的降维。
4. 举例
若给定原始数据集为
X
=
[
1
−
1
3
2
0
−
2
0
4
1
1
]
X=\left[\begin{matrix} 1&-1&3&2&0\\ -2&0&4&1&1 \end{matrix}\right]
X=[1−2−10342101]
则其协方差矩阵为
C
x
=
1
2
X
T
X
=
[
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
]
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构成矩阵
P
P
P为:
P
=
[
ξ
1
ξ
2
ξ
3
ξ
4
ξ
5
]
=
[
−
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
]
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维是合理的,那么我们只需取最大的两个特征值对应的特征向量来构成
Q
Q
Q:
Q
=
[
ξ
1
ξ
2
]
=
[
−
0.18
−
0.82
−
0.11
0.33
0.90
0
0.36
−
0.41
0.14
0.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
=
X
Q
=
[
3.34
−
1.96
4.45
1.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.71
0.56
1.71
]
Y_{中心化}=\left[\begin{matrix} -0.56&-1.71\\ 0.56&1.71 \end{matrix}\right]
Y中心化=[−0.560.56−1.711.71]
在使用PCA时注意:
- 一定要弄清楚数据集的行、列,哪个是样本数,哪个是特征数(维度)
- 若数据集以行表示维度,列表示样本数(即与本文相反),那么协方差矩阵一定不能用自带的函数计算,其计算公式改为 C x = 1 m X X T Cx=\frac{1}{m}XX^T Cx=m1XXT, 其他的将相应的列操作变成行操作即可。不过与其如此,不如直接把原始数据集转置。