机器学习笔记——主成分分析
第一章 机器学习简介
第二章 感知机
第三章 支持向量机
第四章 朴素贝叶斯分类器
第五章 Logistic回归
第六章 线性回归和岭回归
第七章 多层感知机与反向传播【Python实例】
第八章 主成分分析【PCA降维】
第九章 隐马尔可夫模型
第十章 奇异值分解
降维是一种对高维度特征数据预处理方法,将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本,因此,降维成为应用非常广泛的数据预处理方法。
降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。本节介绍主成分分析方法。
一、PCA降维原理
PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好,因此我们认为,最好的 k k k维特征是将 n n n维样本点转换为 k k k维后,每一维上的样本方差都很大,并且每一维的数据不相关。
1 方差
我们希望数据在投影后的投影值尽可能分散, 而这种分散程度, 可以用数学上的方差来表述。此处, 一维数据的方差可以看做是每个元素与数据均值的差的平方和的均值, 即:
Var
(
x
)
=
1
m
−
1
∑
i
=
1
m
(
x
i
−
μ
)
2
.
\operatorname{Var}(x)=\frac{1}{m-1} \sum_{i=1}^{m}\left(x_{i}-\mu\right)^{2}.
Var(x)=m−11i=1∑m(xi−μ)2.若先将数据归一化(均值为0) , 因此方差可以直接用每个元素的平方和除以m-1(无偏估计,不熟悉的可以翻一翻概率论相关的书籍)表示:
Var
(
x
)
=
1
m
−
1
∑
i
=
1
m
x
i
2
.
\operatorname{Var}(x)=\frac{1}{m-1} \sum_{i=1}^{m} x_{i}^{2}.
Var(x)=m−11i=1∑mxi2.
2 协方差
下面的二维数据, x 1 x_1 x1和 x 2 x_2 x2两个维度显然是相关的,如果我们进行一个变换,换到 y 1 y_1 y1和 y 2 y_2 y2方向:
- 显然 y 1 y_1 y1方向是数据方差最大的方向;
- 为了使得第二个变量与 y 1 y_1 y1不相关,那么 y 2 y_2 y2与 y 1 y_1 y1正交即可.
考虑三维问题, 与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择, 继而我们选择第二个投影方向。如果我们还是单纯只选择方差最大的方向, 很明显, 这个方向与第一个方向应该是“几乎重合在一起”, 显然这样的维度是没有用的, 因此, 应该有其他约束条件。
从直观上说, 让二维数据尽可能表示更多的原始信息, 我们是不希望它们之间存在(线性)相关性的, 因为相关性意味着二维数据不是完全独立,必然存在重复表示的信息。
数学上可以用数据之间的协方差表示其相关性, 由于已经让每一维数据均值为 0 , 则:
Cov
(
a
,
b
)
=
1
m
−
1
∑
i
=
1
m
a
i
b
i
\operatorname{Cov}(a, b)=\frac{1}{m-1} \sum_{i=1}^{m} a_{i} b_{i}
Cov(a,b)=m−11i=1∑maibi可以看到,在数据均值为 0 的情况下,二维数据的协方差简洁的表示为其内积除以
m
−
1
m-1
m−1 。
- 当协方差为 0 时, 表示两个字段完全独立;
- 为了让协方差为 0 , 我们选择第二个基时只能在与第一个基正交的方向上选择,因此最终选择的两个方向一定是正交的。
3 协方差矩阵对角化
至此, 我们得到了降维问题的优化目标:
将一组 N N N 维向量降为 K K K 维( K K K大于0, 小于 N N N ), 其目标是选择 K K K个单位(模为1)正交基, 使得原始数据变换到这组基上后,各字段两两间协方差为 0 , 而字段的方差则尽可能大(在正交的约束下,取最大的 K K K 个方差)。
假设我们有m个二维数据, 那么我们将它们按列组成矩阵
X
X
X :
X
=
(
a
1
a
2
⋯
a
m
b
1
b
2
⋯
b
m
)
X=\left(\begin{array}{llll} a_{1} & a_{2} & \cdots & a_{m} \\ b_{1} & b_{2} & \cdots & b_{m} \end{array}\right)
X=(a1b1a2b2⋯⋯ambm)然后我们用
X
X
X乘以
X
T
X^T
XT, 并乘上系数
1
m
−
1
\frac{1}{m-1}
m−11 :
1
m
−
1
X
X
T
=
(
1
m
−
1
∑
i
=
1
m
a
i
2
1
m
−
1
∑
i
=
1
m
a
i
b
i
1
m
−
1
∑
i
=
1
m
a
i
b
i
1
m
−
1
∑
i
=
1
m
b
i
2
)
\frac{1}{m-1} X X^{T}=\left(\begin{array}{cc} \frac{1}{m-1} \sum_{i=1}^{m} a_{i}^{2} & \frac{1}{m-1} \sum_{i=1}^{m} a_{i} b_{i} \\ \frac{1}{m-1} \sum_{i=1}^{m} a_{i} b_{i} & \frac{1}{m-1} \sum_{i=1}^{m} b_{i}^{2} \end{array}\right)
m−11XXT=(m−11∑i=1mai2m−11∑i=1maibim−11∑i=1maibim−11∑i=1mbi2)
协方差矩阵:
- 这个矩阵对角线上的两个元素分别是两个字段的方差.
- 而其它元素是 a a a 和 b b b 的两个维度的协方差.
- 两者被统一到了一个矩阵.
根据矩阵相乘的运算法则, 这个结论很容易被推广到一般情况:
- 设我们有 m m m 个 n n n 维数据记录, 将其按列排成 n n n 乘 m \mathrm{m} m 的矩阵 X ∈ R n × m \mathbf{X}\in\mathbb{R}^{n\times m} X∈Rn×m.
- 设 C = 1 m − 1 X X T C=\frac{1}{m-1} X X^{T} C=m−11XXT, 则 C \mathrm{C} C 是一个对称矩阵, 其对角线分别个各个字段的方差, 而第 i i i行 j \mathrm{j} j 列和 j \mathrm{j} j 行 i i i列元素相同,表示 i i i和 j j j两个字段的协方差.
得到协方差矩阵后,我们发现优化目标,等价于:
将协方差矩阵对角化,即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列,这样我们就达到了优化目的。
我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系,设:
- 原始数据矩阵 X ∈ R n × m X\in\mathbb{R}^{n\times m} X∈Rn×m对应的协方差矩阵为 C C C;
- 设 P ∈ R k × n P\in\mathbb{R}^{k\times n} P∈Rk×n是 k k k个基向量按行组成的矩阵,对原始数据进行变换的矩阵;
- Y = P X Y=PX Y=PX, Y ∈ R k × m Y\in\mathbb{R}^{k\times m} Y∈Rk×m为 X X X对 P P P做基变换后的数据;
- 设 Y Y Y的协方差矩阵为 D D D,我们希望变换后的数据协方差矩阵为对角的,非对角元为0.
我们推导一下
D
D
D与
C
C
C的关系:
D
=
1
m
−
1
Y
Y
T
=
1
m
−
1
(
P
X
)
(
P
X
)
T
=
1
m
−
1
P
X
X
T
P
T
=
P
(
1
m
−
1
X
X
T
)
P
T
=
P
C
P
T
\begin{aligned} D &=\frac{1}{m-1} Y Y^{T} \\ &=\frac{1}{m-1}(P X)(P X)^{T} \\ &=\frac{1}{m-1} P X X^{T} P^{T} \\ &=P\left(\frac{1}{m-1} X X^{T}\right) P^{T} \\ &=P C P^{T} \end{aligned}
D=m−11YYT=m−11(PX)(PX)T=m−11PXXTPT=P(m−11XXT)PT=PCPT现在事情很明白了! 我们希望
D
D
D是对角矩阵,我们要找的变换矩阵
P
P
P不是别的, 而是能让原始协方差
C
C
C矩阵对角化的
P
\mathrm{P}
P .换句话说, 优化目标变成了:
寻找一个矩阵 P \mathrm{P} P, 满足 P C P T P C P^{T} PCPT 是一个 对角矩阵, 并且对角元素按从大到小依次排列, 那么 P P P的前 K K K行就是要寻找的基, 用 P P P的前 K K K行组成的矩阵乘以 K K K就使得 K K K从 n n n维降到了 k k k维并满足上述优化条件。
4 特征值分解
现在所有焦点都聚焦在了协方差矩阵对角化问题上, 由上文知道, 协方差矩阵 C C C 是一个是对称矩阵,在线性代数上, 实对称矩阵有一系列非常好的性质:
- 实对称矩阵不同特征值对应的特征向量必然正交;
- 设特征向量 λ \lambda λ 重数为 r r r, 则必然存在 r r r 个线性无关的特征向量对应于 λ \lambda λ, 因此可以将这 r r r 个特征向量单位正交化
- 由上面两条可知, 一个
n
\mathrm{n}
n 行
n
\mathrm{n}
n 列的实对称矩阵一定可以找到
n
\mathrm{n}
n 个单位正交特征向量, 设这
n
\mathrm{n}
n 个特征向量为
e
1
,
e
2
,
⋯
,
e
n
e_{1}, e_{2}, \cdots, e_{n}
e1,e2,⋯,en, 我们将其按列组成矩阵:
P = ( e 1 e 2 ⋯ e n ) , P=\left(\begin{array}{llll} e_{1} & e_{2} & \cdots & e_{n} \end{array}\right), P=(e1e2⋯en),则协方差矩阵 C C C 可以被 P P P对角化:
P T C P = Λ = ( λ 1 λ 2 ⋱ λ n ) . P^{T} C P=\Lambda=\left(\begin{array}{llll} \lambda_{1} & & & \\ & \lambda_{2} & & \\ & & \ddots & \\ & & & \lambda_{n} \end{array}\right). PTCP=Λ= λ1λ2⋱λn .
二、 PCA算法
总结一下PCA的算法步骤:
我们用转换矩阵对
X
X
X进行变换即可得到降维的数据:
Y
=
P
X
Y= PX
Y=PX即为降维到
k
\mathrm{k}
k 维后的数据,
Y
∈
R
k
×
m
Y\in\mathbb{R}^{k\times m}
Y∈Rk×m.
1 主成分
由
Y
=
P
X
=
[
y
1
⋮
y
k
]
Y= PX = \left[\begin{array}{c} y^1 \\ \vdots \\ y^k \end{array}\right]
Y=PX=
y1⋮yk
其中
y
i
y^i
yi表示
Y
Y
Y的第
i
i
i行,也就是数据的第
i
i
i个变量,我们知道,变量
y
1
y^1
y1 是
X
X
X 的所有线性变换中方差最大的;
y
2
y^{2}
y2 是与
y
1
y^{1}
y1 不相关的
x
x
x 的所有线性变换中方差最大的。
定义(主成分)
我们称变换后的数据,方差最大的变量 y 1 y^1 y1为原始数据 X X X的第一主成分,同理可以定义第2主成分、第3主成分……
2 方差贡献率
第
k
k
k主成分
y
k
y^k
yk 的方差贡献率定义为
y
k
y^k
yk 的方差与所有方差之和的比,记作
η
k
\eta_k
ηk:
η
k
=
λ
k
∑
i
=
1
m
λ
i
,
\eta_k=\frac{\lambda_k}{\sum_{i=1}^m\lambda_i},
ηk=∑i=1mλiλk,
k
k
k 个主成分
y
1
,
y
2
,
⋯
,
y
k
y^1,y^2,\cdots,y^k
y1,y2,⋯,yk 的累计方差贡献率定义为
k
k
k 个方差之和与所有方差之和的比:
∑
i
=
1
k
η
i
=
∑
i
=
1
k
λ
i
∑
i
=
1
m
λ
i
.
\sum_{i=1}^k\eta_i=\frac{\sum_{i=1}^k\lambda_i}{\sum_{i=1}^m\lambda_i}.
i=1∑kηi=∑i=1mλi∑i=1kλi.通常取
k
k
k 使得累计方差贡献率达到规定的百分比以上,如 70%~80%以上。
3 数据重构
Y
Y
Y为降到
k
k
k维的数据,我们想要恢复到
n
n
n维,那么逆向求X就行
X
^
=
P
T
⋅
Y
.
\hat X= P^{T}\cdot Y.
X^=PT⋅Y.如果要恢复到最初始的,那么还要加上被减掉的均值:
X
^
r
a
w
=
X
^
+
μ
=
P
T
⋅
Y
+
μ
.
\hat X_{raw}=\hat X+\mu=P^{T}\cdot Y +\mu.
X^raw=X^+μ=PT⋅Y+μ.
4 优缺点
根据上面对PCA的数学原理的解释,我们可以了解到一些PCA的能力和限制:
- PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。
- 因此,PCA也存在一些限制,例如它可以很好的解除线性相关,但是对于高阶相关性就没有办法了.
- 对于存在高阶相关性的数据,可以考虑Kernel PCA,通过Kernel函数将非线性相关转为线性相关。
三、参考资料
- 李航. 机器学习方法. 清华大学出版社, 2022.