1. 降维
如下图所示,有一个含m个样本量的数据组,每个样本包含两个特征,我们可以找到一条直线z,将所有的点投影到该条直线上,那么每个样本的两个特征
x
1
x_1
x1和
x
2
x_2
x2就被压缩成一个特征
z
1
z_1
z1,数据集由{
(
x
1
(
1
)
,
x
2
(
1
)
)
,
…
…
(
x
1
(
m
)
,
x
2
(
m
)
)
(x^{(1)}_1,x^{(1)}_2),……(x^{(m)}_1,x^{(m)}_2)
(x1(1),x2(1)),……(x1(m),x2(m))}压缩为{
(
z
1
(
1
)
)
,
(
z
1
(
2
)
)
…
…
(
z
1
(
m
)
)
(z^{(1)}_1),(z^{(2)}_1)……(z^{(m)}_1)
(z1(1)),(z1(2))……(z1(m))}。
同时,我们也可以将三维数据转化为二维,即将三维空间中的每个点投影到一个二维平面上。数据集由{
(
x
1
(
1
)
,
x
2
(
1
)
,
x
3
(
1
)
)
,
(
x
1
(
2
)
,
x
2
(
2
)
,
x
3
(
2
)
)
…
…
(
x
1
(
m
)
,
x
2
(
m
)
,
x
3
(
m
)
)
(x^{(1)}_1,x^{(1)}_2,x^{(1)}_3),(x^{(2)}_1,x^{(2)}_2,x^{(2)}_3)……(x^{(m)}_1,x^{(m)}_2,x^{(m)}_3)
(x1(1),x2(1),x3(1)),(x1(2),x2(2),x3(2))……(x1(m),x2(m),x3(m))}压缩为{
(
z
1
(
1
)
,
z
2
(
1
)
)
,
(
z
1
(
2
)
,
z
2
(
2
)
)
…
…
(
z
1
(
m
)
,
z
1
(
m
)
)
(z^{(1)}_1,z^{(1)}_2),(z^{(2)}_1,z^{(2)}_2)……(z^{(m)}_1,z^{(m)}_1)
(z1(1),z2(1)),(z1(2),z2(2))……(z1(m),z1(m))}。
数据降维在可以使得数据更好的可视化的同时,也减小了数据的大小,使其占用内存更小,后续算法运行更快。
2. 主成分分析(Principal Component Analysis ,PCA)
2.1 什么是PCA
主成分分析是最常见的降维算法。在PCA算法中,我们就是要找到一个方向向量,即上一部分中数据投影的直线或平面。该低维向量
u
(
1
)
u^{(1)}
u(1)需要满足投射平均均方误差最小,投射误差是从特征向量向低维平面做垂线的长度。
如下图所示,如果降维过程是将3D-2D,则需要找到两个方向向量。若是nD-kD,则需找到k个方向向量:
u
(
1
)
,
u
(
2
)
…
…
u
(
k
)
u^{(1)},u^{(2)}……u^{(k)}
u(1),u(2)……u(k)。
PCA与线性回归是两种不同的算法,PCA最小化的目标是投射误差,不进行任何预测;而线性回归最小化目标是预测误差,其目的是为了进行预测。如下图所示,左边是线性回归误差(垂直于x1周轴),右边则是主要成分分析的误差(垂直于方向向量)。
2.2 PCA算法
假设我们要将PCA从n维减小到k维,其中原始数据为: x ( 1 ) , x ( 2 ) … … x ( m ) ( s h a p e = ( m , n ) ) x^{(1)},x^{(2)}……x^{(m)}(shape=(m,n)) x(1),x(2)……x(m)(shape=(m,n))。 x ( i ) x^{(i)} x(i)中包含n个特征值。
首先要进行均值归一化,计算每个特征的均值 u j u_j uj, x j = x j − u j x_j=x_j-u_j xj=xj−uj。如果不同的特征值处于不同的数量级,还需要将每个特征除以一个值,该值可以是特征的max-min,也可以是特征的标准偏差,以保证所有的特征在一个缩放范围内。
然后由
x
(
i
)
x^{(i)}
x(i)
(
n
,
1
)
_{(n,1)}
(n,1)计算协方差矩阵(covariance matrix) Sigma
(
n
,
n
)
_{(n,n)}
(n,n):
Σ
=
1
m
∑
i
=
1
n
(
x
(
i
)
)
(
x
(
i
)
)
T
\Sigma=\frac{1}{m}\sum_{i=1}^{n}{(x^{(i)})(x^{(i)})^T}
Σ=m1i=1∑n(x(i))(x(i))T
通过奇异值分解(singular value decomposition,SVD)来求解:[U,S,V]=SVD(sigma)。其中计算结果U
(
n
,
n
)
_{(n,n)}
(n,n)如下图,U 是一个具有与数据之间最小投射误差的方向向量构成的矩阵。
然后从U中选去前k个向量得到一个n*k的矩阵命为 U r e d u c e U_{reduce} Ureduce,则最后计算降维的结果 z ( i ) = U r e d u c e T × x ( i ) z^{(i)}=U^T_{reduce}\times x^{(i)} z(i)=UreduceT×x(i)结果维度 ( k , 1 ) (k,1) (k,1)。
下图为该过程的一个总结。
2.3 压缩重现
在数据降维后得到 z = U r e d u c e T ∗ x z=U^T_{reduce}*x z=UreduceT∗x,将他映射到原来的高维数据: x a p p r o x = U r e d u c e × z x_{approx}=U_{reduce} \times z xapprox=Ureduce×z
2.4 主成分数量选择
主成分分析的目的是使得投射的平均误差最小,因此主成分的数量k应满足下面的条件,即压缩后的数据应该维持原数据差异性的99%:
1
m
∑
i
=
1
m
∣
x
(
i
)
−
x
a
p
p
r
o
x
(
i
)
∣
2
1
m
∑
i
=
1
m
∣
x
(
i
)
∣
2
≤
0.01
\frac{\frac{1}{m}\sum_{i=1}^{m}{|x^{(i)}-x^{(i)}_{approx}|^2}} { \frac{1}{m}\sum_{i=1}^{m}{|x^{(i)}|^2} } \leq 0.01
m1∑i=1m∣x(i)∣2m1∑i=1m∣x(i)−xapprox(i)∣2≤0.01
如果这个比例小于1%,就意味着原本数据方差的99%都保留下来了,即上面的值越小越好。我们可以先令k=1,然后进行主要成分分析,获得
U
r
e
d
u
c
e
U_{reduce}
Ureduce和z,然后计算比例是否小于1%。如果不是的话再令k=2,如此类推,直到找到可以使得比例小于1%的最小k值。
另外,在我们使用SVD算法时[U,S,V]=SVD(sigma),会得到结果S,其中S为一个
(
n
×
n
)
(n \times n)
(n×n)对角矩阵:
S
=
[
S
11
⋯
0
⋮
⋱
⋮
0
⋯
S
n
n
]
S = \begin{bmatrix} S_{11} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & S_{nn} \end{bmatrix}
S=⎣⎢⎡S11⋮0⋯⋱⋯0⋮Snn⎦⎥⎤
且满足下面的关系:
1
m
∑
i
=
1
m
∣
x
(
i
)
−
x
a
p
p
r
o
x
(
i
)
∣
2
1
m
∑
i
=
1
m
∣
x
(
i
)
∣
2
=
1
−
∑
i
=
1
k
S
i
i
∑
i
=
1
n
S
i
i
≤
0.01
\frac{\frac{1}{m}\sum_{i=1}^{m}{|x^{(i)}-x^{(i)}_{approx}|^2}} { \frac{1}{m}\sum_{i=1}^{m}{|x^{(i)}|^2} } = 1- \frac{\sum_{i=1}^{k}S_{ii}}{\sum_{i=1}^{n}S_{ii}} \leq 0.01
m1∑i=1m∣x(i)∣2m1∑i=1m∣x(i)−xapprox(i)∣2=1−∑i=1nSii∑i=1kSii≤0.01
因此k值需要满足:
∑
i
=
1
k
S
i
i
∑
i
=
1
n
S
i
i
≥
0.99
\frac{\sum_{i=1}^{k}S_{ii}}{\sum_{i=1}^{n}S_{ii}} \geq 0.99
∑i=1nSii∑i=1kSii≥0.99。
2.5 一些建议
应该注意以下几点:
- 不要用PCA来减少过拟合
- 不要将PCA看作训练时的默认步骤,应该先尝试原有特征。
假使我们正在针对一张100×100像素的图片进行某个计算机视觉的机器学习,即总共
有10000个特征,则应该按照下面的方法:
- 得到训练数据
用PCA将10000特征进行降维- 使用逻辑回归进行训练
- 在测试集上测试