【机器学习】【无监督学习】【降维】PCA
主成分分析——PCA(Principal Component Analysis)是一种常见的数据分析方式,常用于高维数据的降维,可用于提取数据的主要特征分量。
使用目的:简化具有许多特征的复杂数据集,减少噪声并增强模型性能。
使用需求:当数据集具有大量相关特征,使数据可视化和模型拟合变得复杂时,这是必不可少。PCA 将高度相关的特征汇总或转换为较少数量的不相关复合变量(composite variables),同时用较少的变量保留关键信息。
PCA 的数学推导可以从最大可分型和最近重构性两方面进行,前者的优化条件为划分后方差最大,后者的优化条件为点到划分平面距离最小。
逐步流程(Step-by-Step Process)
- 协方差矩阵:计算协方差矩阵以确定与标准化数据的相关性。
- 特征向量:特征向量将新的、不相关的复合变量定义为原始特征的线性组合(i.e. Factor loadings of each PC)。
- 特征值:表示每个对应 PC 解释的总方差的比例。
- 成分选择:根据解释的方差选择主成分的子集。
1. 向量表示与基变换
先来介绍些线性代数的基本知识。
1.1 点积(Dot product)
两个向量的 A 和 B 点积:
(
a
1
,
a
2
,
⋯
,
a
n
)
⋅
(
b
1
,
b
2
,
⋯
,
b
n
)
⊤
=
(
a
1
b
1
,
a
2
b
2
,
⋯
,
a
n
b
n
)
(a_1,a_2,\cdots,a_n)\cdot(b_1,b_2,\cdots,b_n)^{\top} = (a_1b_1,a_2b_2,\cdots,a_nb_n)
(a1,a2,⋯,an)⋅(b1,b2,⋯,bn)⊤=(a1b1,a2b2,⋯,anbn) 点积运算将两个向量映射为实数,其计算方式非常容易理解。
接下来我们从几何角度来分析,为了简单起见,我们假设 A 和 B 均为二维向量,则:
A
=
(
x
1
,
y
1
)
,
B
=
(
x
2
,
y
2
)
A
⋅
B
=
∣
A
∣
∣
B
∣
c
o
s
(
a
)
A=(x_1,y_1), ~~~~B=(x_2,y_2)~~~~A\cdot B = |A||B|cos(a)
A=(x1,y1), B=(x2,y2) A⋅B=∣A∣∣B∣cos(a) 其几何表示见下图:
看出 A 与 B 的点积等于 A 到 B 的投影长度乘以 B 的模。
如果假设 B 的模为 1,即让
∣
B
∣
=
1
|B|=1
∣B∣=1,那么:
A
⋅
B
=
∣
A
∣
c
o
s
(
a
)
A\cdot B = |A|cos(a)
A⋅B=∣A∣cos(a) 也就是说,A 与 B 的点积值等于 A 向 B 所在直线投影的标量大小。这就是点积的一种几何解释。
1.2 基(Basis)
在我们常说的坐标系中,向量 ( 3 , 2 ) (3,2) (3,2) 其实隐含地引入了一个定义:以 x 轴和 y 轴上正方向长度为 1 的向量为标准。向量 ( 3 , 2 ) (3,2) (3,2) 实际是说在 x 轴投影为 3 且在 y 轴的投影为 2。注意投影是一个标量,所以可以为负。
所以,对于向量 ( 3 , 2 ) (3,2) (3,2) 来说,如果我们想求它在 ( 1 , 0 ) , ( 0 , 1 ) (1,0),(0,1) (1,0),(0,1)这组基下的坐标的话,分别点积即可。当然,内积完了还是 (3, 2)。
所以,我们大致可以得到一个结论,我们要准确描述向量,首先要确定一组基,然后给出在基所在的各个直线上的投影值。为了方便求坐标,我们希望这组基向量模长为 1。因为向量的点积运算,当模长为 1 时,点积可以直接表示投影。然后还需要这组基是线性无关的,我们一般用正交基,非正交的基也是可以的,不过正交基有较好的性质。
1.3 基变换的矩阵表示(Change of basis with matrix)
对于向量 ( 3 , 2 ) (3,2) (3,2) 这个点来说,在 ( 1 2 , 1 2 ) (\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}}) (21,21)和 ( − 1 2 , 1 2 ) (-\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}}) (−21,21)这组基下的坐标是多少?
我们拿 ( 3 , 2 ) (3,2) (3,2) 分别与之点积得到 ( 5 2 , − 1 2 ) (\frac{5}{\sqrt{2}},-\frac{1}{\sqrt{2}}) (25,−21)这个新坐标。
我们可以用矩阵相乘的形式简洁的表示这个变换: ( 1 / 2 1 / 2 − 1 / 2 1 / 2 ) ( 3 2 ) = ( 5 / 2 − 1 / 2 ) \begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ -1/\sqrt{2} &1/\sqrt{2} \end{pmatrix} \begin{pmatrix}3 \\2 \end{pmatrix}= \begin{pmatrix} 5/\sqrt{2}\\ -1/\sqrt{2} \end{pmatrix} (1/2−1/21/21/2)(32)=(5/2−1/2)左边矩阵的两行分别为两个基,乘以原向量,其结果刚好为新基的坐标。
推广一下,如果我们有 m 个二维向量,只要将二维向量按列排成一个两行 m 列矩阵,然后用“基矩阵”乘以这个矩阵就可以得到了所有这些向量在新基下的值。
例如对于数据点 ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) (1,1),(2,2),(3,3) (1,1),(2,2),(3,3)来说,想变换到刚才那组基上,则可以这样表示: ( 1 / 2 1 / 2 − 1 / 2 1 / 2 ) ( 1 2 3 1 2 3 ) = ( 2 / 2 4 / 2 6 / 2 0 0 0 ) \begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2}\\ -1/\sqrt{2} &1/\sqrt{2} \end{pmatrix} \begin{pmatrix}1&2&3\\ 1&2&3 \end{pmatrix}= \begin{pmatrix} 2/\sqrt{2}&4/\sqrt{2}&6/\sqrt{2}\\ 0&0&0 \end{pmatrix} (1/2−1/21/21/2)(112233)=(2/204/206/20)我们可以把它写成通用的表示形式: ( p 1 p 2 ⋮ p R ) ( 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 R a 1 p R a 2 ⋯ p R a M ) \begin{pmatrix} p_1\\ p_2\\ \vdots\\ p_R \end{pmatrix}\begin{pmatrix} a_1&a_2&\cdots&a_M \end{pmatrix}= \begin{pmatrix} p_1a_1&p_1a_2 &\cdots& p_1a_M\\ p_2a_1&p_2a_2 &\cdots& p_2a_M\\ \vdots&\vdots&\ddots&\vdots\\ p_Ra_1&p_Ra_2 &\cdots& p_Ra_M \end{pmatrix} p1p2⋮pR (a1a2⋯aM)= p1a1p2a1⋮pRa1p1a2p2a2⋮pRa2⋯⋯⋱⋯p1aMp2aM⋮pRaM 其中 p i p_i pi是一个行向量,表示第 i i i 个基, a j a_j aj是一个列向量,表示第 j j j 个原始数据记录。实际上也就是做了一个向量矩阵化的操作。
上述分析给矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列向量 a j a_j aj变换到左边矩阵中以每一行行向量为基所表示的空间中去。也就是说一个矩阵可以表示一种线性变换。
2. 最大可分性
上面我们讨论了选择不同的基可以对同样一组数据给出不同的表示,如果基的数量少于向量本身的维数,则可以达到降维的效果。
但是我们还没回答一个最关键的问题:如何选择基才是最优的。或者说,如果我们有一组 N 维向量,现在要将其降到 K 维(K 小于 N),那么我们应该如何选择 K 个基才能最大程度保留原有的信息?
一种直观的看法是:希望投影后的投影值尽可能分散,因为如果重叠就会有样本消失。当然这个也可以从熵的角度进行理解,熵越大所含信息越多。
2.1 方差(Variance)
我们知道数值的分散程度,可以用数学上的方差来表述。一个变量的方差可以看做是每个元素与变量均值的差的平方和的均值,即: V a r ( a ) = 1 m ∑ i = 1 m ( a i − μ ) 2 Var(a)=\frac{1}{m}\sum^{m}_{i=1}(a_i-\mu)^2 Var(a)=m1i=1∑m(ai−μ)2为了方便处理,我们将每个变量的均值都化为 0 ,因此方差可以直接用每个元素的平方和除以元素个数表示: V a r ( a ) = 1 m ∑ i = 1 m a i 2 Var(a)=\frac{1}{m}\sum^{m}_{i=1}a_i^2 Var(a)=m1i=1∑mai2于是上面的问题被形式化表述为:寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
2.2 协方差(Covariance)
在一维空间中我们可以用方差来表示数据的分散程度。而对于高维数据,我们用协方差进行约束,协方差可以表示两个变量的相关性。为了让两个变量尽可能表示更多的原始信息,我们希望它们之间不存在线性相关性,因为相关性意味着两个变量不是完全独立,必然存在重复表示的信息。
协方差公式为: C o v ( a , b ) = 1 m − 1 ∑ i = 1 m ( a i − μ a ) ( b i − μ b ) Cov(a,b)=\frac{1}{m-1}\sum^{m}_{i=1}(a_i-\mu_a)(b_i-\mu_b) Cov(a,b)=m−11i=1∑m(ai−μa)(bi−μb)由于均值为 0,所以我们的协方差公式可以表示为: C o v ( a , b ) = 1 m − 1 ∑ i = 1 m a i b i ≈ 1 m ∑ i = 1 m a i b i Cov(a,b)=\frac{1}{m-1}\sum^{m}_{i=1}a_ib_i\approx\frac{1}{m}\sum^{m}_{i=1}a_ib_i Cov(a,b)=m−11i=1∑maibi≈m1i=1∑maibi当协方差为 0 时,表示两个变量线性不相关。为了让协方差为 0,我们选择第二个基时只能在与第一个基正交的方向上进行选择,因此最终选择的两个方向一定是正交的。
至此,我们得到了降维问题的优化目标:将一组 N 维向量降为 K 维,其目标是选择 K 个单位正交基,使得原始数据变换到这组基上后,各变量两两间协方差为 0,而变量方差则尽可能大(在正交的约束下,取最大的 K 个方差)。
2.3 协方差矩阵(Covariance matrix)
针对我们给出的优化目标,接下来我们将从数学的角度来给出优化目标。
我们看到,最终要达到的目的与变量的方差及变量间协方差有密切关系。因此我们希望能将两者统一表示,仔细观察发现,两者均可以表示为点积的形式,而点积又与矩阵相乘密切相关。于是我们有:
假设我们只有 a 和 b 两个变量,那么我们将它们按行组成矩阵 X: X = ( a 1 a 2 ⋯ a m b 1 b 2 ⋯ b m ) X=\begin{pmatrix} a_1&a_2 &\cdots&a_m\\ b_1&b_2 &\cdots&b_m\\ \end{pmatrix} X=(a1b1a2b2⋯⋯ambm)然后: 1 m X X ⊤ = ( 1 m ∑ i = 1 m a i 2 1 m ∑ i = 1 m a i b i 1 m ∑ i = 1 m a i b i 1 m ∑ i = 1 m b i 2 ) = ( C o v ( a , a ) C o v ( a , b ) C o v ( b , a ) C o v ( b , b ) ) \frac{1}{m}XX^{\top}=\begin{pmatrix} \frac{1}{m}\sum^m_{i=1}a_i^2&\frac{1}{m}\sum^m_{i=1}a_ib_i \\ \frac{1}{m}\sum^m_{i=1}a_ib_i&\frac{1}{m}\sum^m_{i=1}b_i^2 \\ \end{pmatrix}= \begin{pmatrix} Cov(a,a)&Cov(a,b) \\ Cov(b,a)&Cov(b,b) \\ \end{pmatrix} m1XX⊤=(m1∑i=1mai2m1∑i=1maibim1∑i=1maibim1∑i=1mbi2)=(Cov(a,a)Cov(b,a)Cov(a,b)Cov(b,b))我们可以看到这个矩阵对角线上的分别是两个变量的方差,而其它元素是 a 和 b 的协方差。两者被统一到了一个矩阵里。
我们很容易被推广到一般情况:
设我们有 m 个 n 维数据记录,将其排列成矩阵 X n , m X_{n,m} Xn,m,设 C = 1 m X X ⊤ C=\frac{1}{m}XX^{\top} C=m1XX⊤,则 C C C 是一个对称矩阵,其对角线分别对应各个变量的方差,而第 i i i 行 j j j 列和 j j j 行 i i i 列元素相同,表示 i i i 和 j j j 两个变量的协方差。
2.4 矩阵对角化(Matrix diagonalization)
根据我们的优化条件,我们需要将除对角线外的其它元素化为 0,并且在对角线上将元素按大小从上到下排列(变量方差尽可能大),这样我们就达到了优化目的。这样说可能还不是很明晰,我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系。
设原始数据矩阵 X X X 对应的协方差矩阵为 C C C,而 P P P 是一组基按行组成的矩阵,设 Y = P X Y=PX Y=PX,则 Y Y Y 为 X X X 对 P P P 做基变换后的数据。设 Y Y Y 的协方差矩阵为 D D D,我们推导一下 D D D 与 C C C 的关系: D = 1 m Y Y ⊤ = 1 m ( P X ) ( P X ) ⊤ = 1 m P X X ⊤ P ⊤ = P 1 m ( X X ⊤ ) P ⊤ = P C P ⊤ D=\frac{1}{m}YY^{\top}=\frac{1}{m}(PX)(PX)^{\top}=\frac{1}{m}PXX^{\top}P^{\top}=P\frac{1}{m}(XX^{\top})P^{\top}=PCP^{\top} D=m1YY⊤=m1(PX)(PX)⊤=m1PXX⊤P⊤=Pm1(XX⊤)P⊤=PCP⊤这样就看清楚我们要找的 P P P 是能让原始协方差矩阵对角化的 P P P。换句话说,优化目标变成了寻找一个矩阵 P P P,满足 P C P ⊤ PCP^{\top} PCP⊤是一个对角矩阵,并且对角元素按从大到小依次排列,那么 P P P 的前 K 行就是要寻找的基,用 P P P 的前 K 行组成的矩阵乘以 X X X 就使得 X X X 从 N 维降到了 K 维并满足上述优化条件。
至此,我们离 PCA 还有仅一步之遥,我们还需要完成对角化。
由上文知道,协方差矩阵 C 是一个是对称矩阵,在线性代数中实对称矩阵有一系列非常好的性质:
- 实对称矩阵不同特征值对应的特征向量必然正交。
- 设特征向量 λ \lambda λ 重数为 r,则必然存在 r 个线性无关的特征向量对应于 λ \lambda λ,因此可以将这 r 个特征向量单位正交化。
由上面两条可知,一个 n 行 n 列的实对称矩阵一定可以找到 n 个单位正交特征向量,设这 n 个特征向量为 e 1 , e 2 , ⋯ , e n e_1,e_2,\cdots,e_n e1,e2,⋯,en,我们将其按列组成矩阵: E = ( e 1 , e 2 , ⋯ , e n ) E=(e_1,e_2,\cdots,e_n) E=(e1,e2,⋯,en)。
则对协方差矩阵 C 有如下结论:
E
⊤
C
E
=
Λ
=
(
λ
1
λ
2
⋱
λ
n
)
E^{\top}CE=\Lambda=\begin{pmatrix} \lambda_1&&&&\\ &\lambda_2&&&\\ & & \ddots&&\\ & & &&\lambda_n\\ \end{pmatrix}
E⊤CE=Λ=
λ1λ2⋱λn
其中
Λ
\Lambda
Λ 为对角矩阵,其对角元素为各特征向量对应的特征值(可能有重复)。
到这里,我们发现我们已经找到了需要的矩阵 P P P: P = E ⊤ P=E^{\top} P=E⊤。
P P P 是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是 C C C 的一个特征向量。如果设 P 按照 Λ \Lambda Λ 中特征值的从大到小,将特征向量从上到下排列,则用 P P P 的前 K 行组成的矩阵乘以原始数据矩阵 X X X,就得到了我们需要的降维后的数据矩阵 Y Y Y。
2.5 拉格朗日乘子法(Lagrange multiplier)
在叙述求协方差矩阵对角化时,我们给出希望变化后的变量有:变量间协方差为 0 且变量的方差尽可能大。 然后我们通过实对称矩阵的性质给予了推导,此外我们还可以把它转换为最优化问题利用拉格朗日乘子法来给予推导。
我们知道样本点
x
i
x_i
xi 在基
w
w
w 下的坐标为:
(
x
i
,
w
)
=
x
i
⊤
w
(x_i,w)=x_i^{\top}w
(xi,w)=xi⊤w, 于是我们有方差:
D
(
x
)
=
1
m
∑
i
=
1
m
(
x
i
⊤
w
)
2
=
1
m
∑
i
=
1
m
(
x
i
⊤
w
)
⊤
(
x
i
⊤
w
)
=
1
m
∑
i
=
1
m
(
w
⊤
x
i
x
i
⊤
w
)
=
w
⊤
(
1
m
∑
i
=
1
m
x
i
x
i
⊤
)
w
D(x)=\frac{1}{m}\sum^m_{i=1}(x_i^{\top}w)^2=\frac{1}{m}\sum^m_{i=1}(x_i^{\top}w)^{\top}(x_i^{\top}w)=\frac{1}{m}\sum^m_{i=1}(w^{\top}x_ix_i^{\top}w)=w^{\top}(\frac{1}{m}\sum^m_{i=1}x_ix_i^{\top})w
D(x)=m1i=1∑m(xi⊤w)2=m1i=1∑m(xi⊤w)⊤(xi⊤w)=m1i=1∑m(w⊤xixi⊤w)=w⊤(m1i=1∑mxixi⊤)w我们看到
1
m
∑
i
=
1
m
x
i
x
i
⊤
\frac{1}{m}\sum^m_{i=1}x_ix_i^{\top}
m1∑i=1mxixi⊤ 就是原样本的协方差,我们令这个矩阵为
Λ
\Lambda
Λ,于是我们有:
{
m
a
x
{
w
⊤
Λ
w
}
s
.
t
.
w
⊤
w
=
1
,
\begin{equation} \left\{ \begin{array}{lr} max\{w^{\top}\Lambda w\}\\ \\ s.t.w^{\top}w=1, \\ \end{array} \right. \end{equation}
⎩
⎨
⎧max{w⊤Λw}s.t.w⊤w=1,然后构造拉格朗日函数:
L
(
w
)
=
w
⊤
Λ
w
+
λ
(
1
−
w
⊤
w
)
L(w)=w^{\top}\Lambda w+\lambda(1-w^{\top}w)
L(w)=w⊤Λw+λ(1−w⊤w)对
w
w
w 求导得:
Λ
w
=
λ
w
\Lambda w=\lambda w
Λw=λw此时我们的方差为:
D
(
x
)
=
w
⊤
Λ
w
=
λ
w
⊤
w
=
λ
D(x)=w^{\top}\Lambda w=\lambda w^{\top} w=\lambda
D(x)=w⊤Λw=λw⊤w=λ于是我们发现,x 投影后的方差就是协方差矩阵的特征值。我们要找到最大方差也就是协方差矩阵最大的特征值,最佳投影方向就是最大特征值所对应的特征向量,次佳就是第二大特征值对应的特征向量,以此类推。
至此我们完成了基于最大可分性的 PCA 数学证明
3. 最近重构性(最小化损失法)
以上的证明思路主要是基于最大可分性的思想,通过一条直线使得样本点投影到该直线上的方差最大。除此之外,我们还可以将其转换为线型回归问题,其目标是求解一个线性函数使得对应直线能够更好地拟合样本点集合。这就使得我们的优化目标从方差最大转化为平方误差最小,因为映射距离越短,丢失的信息也会越小。区别于最大可分性,这是从最近重构性的角度进行论证。
假设输入数据 x 是在 D 维空间中的点,那么,我们可以用 D 个正交的 D 维向量去完全的表示这个空间(这个空间中所有的向量都可以用这 D 个向量的线性组合得到)。在 D 维空间中,有无穷多种可能找这 D 个正交的 D 维向量,哪个组合是最合适的呢?
假设我们已经找到了这 D 个向量,可以得到:
x
n
=
∑
i
=
1
D
α
n
i
u
i
x_n=\sum^D_{i=1}\alpha_{ni}u_i
xn=i=1∑Dαniui我们可以用近似法来表示投影后的点:
x
~
n
=
∑
i
=
1
M
z
n
i
u
i
+
∑
i
=
M
+
1
D
b
i
u
i
\widetilde{x}_n=\sum^M_{i=1}z_{ni}u_i+\sum^D_{i=M+1}b_{i}u_i
x
n=i=1∑Mzniui+i=M+1∑Dbiui上式表示,得到的新的x是由前 M 个基的线性组合加上后 D - M 个基的线性组合,注意这里的 z 是对于每个 x 都不同的,而 b 对于每个 x 是相同的,这样我们就可以用 M 个数来表示空间中的一个点,也就是使得数据降维了。但是这样降维后的数据,必然会产生一些扭曲,我们用 J 描述这种扭曲,我们的目标是,使得 J 最小:
J
=
1
N
∑
n
=
1
N
∣
∣
x
n
−
x
~
n
∣
∣
2
J=\frac{1}{N}\sum^{N}_{n=1}||x_n-\widetilde{x}_n||^2
J=N1n=1∑N∣∣xn−x
n∣∣2上式的意思很直观,就是对于每一个点,将降维后的点与原始的点之间的距离的平方和加起来,求平均值,我们就要使得这个平均值最小。我们令:
∂
J
∂
z
n
i
=
0
⇒
z
n
j
=
x
n
⊤
u
j
\frac{\partial J}{\partial z_{ni}}=0\Rightarrow z_{nj}=x_n^{\top}u_j
∂zni∂J=0⇒znj=xn⊤uj
∂
J
∂
b
j
=
0
⇒
b
j
=
x
ˉ
⊤
u
j
\frac{\partial J}{\partial b_{j}}=0\Rightarrow b_{j}=\bar{x}^{\top}u_j
∂bj∂J=0⇒bj=xˉ⊤uj将上面得到的 z 与 b 带入降维的表达式:
x
n
−
x
~
n
=
∑
i
=
M
+
1
D
[
(
x
n
−
x
ˉ
)
u
i
]
u
i
x_n-\widetilde{x}_n=\sum^D_{i=M+1}[(x_n-\bar{x})u_i]u_i
xn−x
n=i=M+1∑D[(xn−xˉ)ui]ui将上式带入J的表达式得到:
J
=
1
N
∑
n
=
1
N
∑
i
=
M
+
1
D
(
x
n
⊤
u
i
−
x
ˉ
⊤
u
i
)
2
=
∑
i
=
M
+
1
D
u
i
⊤
S
u
i
J=\frac{1}{N}\sum^N_{n=1} \sum^D_{i=M+1}(x_n^{\top}u_i-\bar{x}^{\top}u_i)^2=\sum^D_{i=M+1}u_i^{\top}Su_i
J=N1n=1∑Ni=M+1∑D(xn⊤ui−xˉ⊤ui)2=i=M+1∑Dui⊤Sui 再用上拉格朗日乘子法(此处略),可以得到,取得我们想要的投影基的表达式为:
S
u
i
=
λ
i
u
i
Su_i=\lambda_iu_i
Sui=λiui这里又是一个特征值的表达式,我们想要的前 M 个向量其实就是这里最大的 M 个特征值所对应的特征向量。证明这个还可以看看,我们 J 可以化为:
J
=
∑
i
=
M
+
1
D
λ
i
J=\sum^D_{i=M+1}\lambda_i
J=i=M+1∑Dλi也就是当误差 J 是由最小的 D - M 个特征值组成的时候,J 取得最小值。
4. 性质(Properties)
- 缓解维度灾难:PCA 算法通过舍去一部分信息之后能使得样本的采样密度增大(因为维数降低了),这是缓解维度灾难的重要手段;
- 降噪:当数据受到噪声影响时,最小特征值对应的特征向量往往与噪声有关,将它们舍弃能在一定程度上起到降噪的效果;
- 过拟合:PCA 保留了主要信息,但这个主要信息只是针对训练集的,而且这个主要信息未必是重要信息。有可能舍弃了一些看似无用的信息,但是这些看似无用的信息恰好是重要信息,只是在训练集上没有很大的表现,所以 PCA 也可能加剧了过拟合;
- 特征独立:PCA 不仅将数据压缩到低维,它也使得降维之后的数据各特征相互独立;
- 基于方差:PCA 专注于最大化方差,假设方差较大的特征更具信息量。然而,这可能并不总是正确的,因为一些重要的变量可能比不太相关的变量表现出更低的方差。
- 可解释性问题:主成分 (PC) 是原始数据集特征的线性组合,这使得它们很难直接标记或解释。
- 线性假设:PCA 假设主成分是原始特征的线性组合。这意味着它可能无法有效处理本质上非线性或特征之间具有复杂交互的数据结构。
5. 细节
5.1 零均值化
当对训练集进行 PCA 降维时,也需要对验证集、测试集执行同样的降维。而对验证集、测试集执行零均值化操作时,均值必须从训练集计算而来,不能使用验证集或者测试集的中心向量。
其原因也很简单,因为我们的训练集时可观测到的数据,测试集不可观测所以不会知道其均值,而验证集再大部分情况下是在处理完数据后再从训练集中分离出来,一般不会单独处理。如果真的是单独处理了,不能独自求均值的原因是和测试集一样。
另外我们也需要保证一致性,我们拿训练集训练出来的模型用来预测测试集的前提假设就是两者是独立同分布的,如果不能保证一致性的话,会出现 Variance Shift 的问题。
5.2 与 SVD 的对比
这是两个不同的数学定义。我们先给结论:特征值和特征向量是针对方阵才有的,而对任意形状的矩阵都可以做奇异值分解。
PCA:方阵的特征值分解,对于一个方阵
A
A
A,总可以写成:
A
=
Q
Λ
Q
−
1
A=Q\Lambda Q^{-1}
A=QΛQ−1
其中,
Q
Q
Q 是这个矩阵
A
A
A 的特征向量组成的矩阵,
Λ
\Lambda
Λ 是一个对角矩阵,每一个对角线元素就是一个特征值,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。也就是说矩阵
A
A
A 的信息可以由其特征值和特征向量表示。
SVD:矩阵的奇异值分解其实就是对于矩阵
A
A
A 的协方差矩阵
A
⊤
A
A^{\top}A
A⊤A 和
A
A
⊤
AA^{\top}
AA⊤ 做特征值分解推导出来的:
A
m
,
n
=
U
m
,
m
Λ
m
,
n
V
n
,
n
⊤
≈
U
m
,
k
Λ
k
,
k
V
k
,
n
⊤
A_{m,n}=U_{m,m}\Lambda_{m,n}V_{n,n}^{\top}\approx U_{m,k}\Lambda_{k,k}V_{k,n}^{\top}
Am,n=Um,mΛm,nVn,n⊤≈Um,kΛk,kVk,n⊤其中:
U
,
V
U, V
U,V 都是正交矩阵,有
U
⊤
U
=
I
m
,
V
⊤
V
=
I
n
U^{\top}U=I_m,V^{\top}V=I_n
U⊤U=Im,V⊤V=In 。这里的约等于是因为
Λ
\Lambda
Λ 中有 n 个奇异值,但是由于排在后面的很多接近 0,所以我们可以仅保留比较大的 k 个奇异值。
A
⊤
A
=
(
U
Λ
V
⊤
)
⊤
(
U
Λ
V
⊤
)
=
V
Λ
⊤
U
⊤
U
Λ
V
⊤
=
V
Λ
2
V
⊤
A^{\top}A=(U\Lambda V^{\top})^{\top}(U\Lambda V^{\top})=V\Lambda^{\top}U^{\top}U\Lambda V^{\top}=V\Lambda ^2V^{\top}
A⊤A=(UΛV⊤)⊤(UΛV⊤)=VΛ⊤U⊤UΛV⊤=VΛ2V⊤
A
A
⊤
=
(
U
Λ
V
⊤
)
(
U
Λ
V
⊤
)
⊤
=
U
Λ
V
⊤
V
Λ
⊤
U
⊤
=
U
Λ
2
U
⊤
AA^{\top}=(U\Lambda V^{\top})(U\Lambda V^{\top})^{\top}=U\Lambda V^{\top}V\Lambda^{\top}U^{\top}=U\Lambda ^2U^{\top}
AA⊤=(UΛV⊤)(UΛV⊤)⊤=UΛV⊤VΛ⊤U⊤=UΛ2U⊤所以,
V
,
U
V ,U
V,U 两个矩阵分别是协方差矩阵
A
⊤
A
A^{\top}A
A⊤A 和
A
A
⊤
AA^{\top}
AA⊤的特征向量,中间的矩阵对角线的元素是
A
⊤
A
A^{\top}A
A⊤A 和
A
A
⊤
AA^{\top}
AA⊤的特征值。我们也很容易看出
A
A
A 的奇异值和
A
⊤
A
A^{\top}A
A⊤A 的特征值之间的关系。
PCA 需要对协方差矩阵 C = 1 m X X ⊤ C=\frac{1}{m}XX^{\top} C=m1XX⊤ 。进行特征值分解; SVD 也是对 A ⊤ A A^{\top}A A⊤A 进行特征值分解。如果取 A = X ⊤ / m A=X^{\top}/\sqrt{m} A=X⊤/m 则两者基本等价。所以 PCA 问题可以转换成 SVD 求解。
而实际上 Sklearn 的 PCA 就是用 SVD 进行求解的,原因有以下几点:
- 当样本维度很高时,协方差矩阵计算太慢;
- 方阵特征值分解计算效率不高;
- SVD 除了特征值分解这种求解方式外,还有更高效更准球的迭代求解方式,避免了 A ⊤ A A^{\top}A A⊤A 的计算;
- 其实 PCA 与 SVD 的右奇异向量的压缩效果相同。
5.3 碎石图(Scree Plots in PCA)
目的:碎石图显示每个主成分解释的总方差比例。
实际用途——确定成分:这有助于选择捕获数据集中总方差的显著比例所需的最小数量的主成分。
方差阈值:通常选择的成分可以解释总方差的 85% 到 95%。
6. 参考资料
[1] 张洋.[PCA 的数学原理].(2013-06-22)[2024-07-20].https://blog.codinglabs.org/articles/pca-tutorial.html
[2] LeftNotEasy.[机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)].(2011-01-10)[2024-07-23].https://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html