“种一棵树最好的时间是十年前,其次是现在”
1 维数灾难
在KNN中,存在一个默认的重要假设,即认为任意测试样本 x x x 附近任意小的 δ \delta δ 距离范围内总能找到一个训练样本,这就要求训练样本的密度必须足够大。但在实际应用中,这个条件其实上很难满足,假设 δ \delta δ = 0.001,仅考虑单个属性,则需要有1000个样本点平均分布在归一化后的属性取值范围内,此时最近邻分类器的错误率不会超过贝叶斯最优分类器错误率的两倍。但若属性维数为20,则需要 1000 20 = 1 0 60 {1000}^{20} = 10^{60} 100020=1060个样本,这在现实中基本上是无法实现的。
事实上,在高维情形下出现的样本数据稀疏、距离计算困难等问题,是所有机器学习方法共同面临的严重障碍,被称为“维数灾难”。
2 降维
解决“维数灾难”的一个重要途径是“降维”,即通过某种数学变换将原始高维属性空间转变为一个低维“子空间”,在这个子空间中样本密度大幅提高,距离计算也变得更为容易。
降维有什么好处?一是提升计算效率,二是减少对样本量的依赖,避免在样本量有限的情况下进行过度训练造成的过拟合。
为什么能够进行降维?这是因为在很多时候,人们观测或者收集到的数据样本虽然是高维的,但与学习任务密切相关的也许只是某个低维分布,即高维空间中的一个低维嵌入。这就为降维的实现提供了理论上的可行性。
2.1 线性降维
一般来说,欲获得低维子空间,最简单的是对原始高维空间进行线性变换,给定d维空间中的m个样本 X ∈ R d × m X \in R^{d \times m} X∈Rd×m,变换之后得到 d ′ ≤ d d^{'} \leq d d′≤d维空间中的样本 Z = W T X Z = W^TX Z=WTX, W ∈ R d × d ′ W \in R^{d \times d^{'}} W∈Rd×d′为变换矩阵, Z ∈ R d ′ × m Z \in R^{d^{'} \times m} Z∈Rd′×m为样本在新空间中的表达。
变换矩阵W可以看作是 d ′ d^{'} d′个d维基向量, z i = W T x i z_i = W^Tx_i zi=WTxi是原始第 i i i个样本与这 d ′ d^{'} d′个基向量分别做内积得到的 d ′ d^{'} d′维属性向量。新空间中的属性是原空间中属性的线性组合。换言之, z i z_i zi是原始向量 x i x_i xi映射到新坐标系 { w 1 , w 2 , ⋯   , w d ′ } \{w_1,w_2,\cdots,w_{d^{'}}\} {w1,w2,⋯,wd′}后得到的新的坐标向量。若 w i w_i wi与 w j ( i ≠ j ) w_j(i \neq j) wj(i̸=j)正交,则新坐标系为正交坐标系,此时W为正交变换。
基于线性变化来进行降维的方法称之为线性降维方法,都符合 Z = W T X Z = W^TX Z=WTX的形式,不同之处是对低维子空间的性质有不同的要求,相当于对W施加了不同的约束。
对降维效果进行评估,通常是比较降维前后学习器的性能,若性能有所提升则认为降维起到了效果。若将维数降到了二维或三维,则可通过可视化技术来直观地判断降维效果。
2.1.1 多维缩放
多维缩放(Multiple Dimensional Scaling,MDS),要求原始空间中样本间的距离在低维空间得以保持。
假定原始 m m m 个 d d d 维样本的距离矩阵为 D ∈ R m × m D \in R^{m \times m} D∈Rm×m,其第 i i i 行第 j j j 列的元素 d i s t i j dist_{ij} distij 表示样本 x i x_i xi 和 x j x_j xj 之间的距离。我们的目的是获得 m m m 个样本在 d ′ d^{'} d′ 维空间中的表示 Z ∈ R d ′ × m , d ′ ≤ d Z \in R^{d^{'} \times m},d^{'} \leq d Z∈Rd′×m,d′≤d,且任意两个样本之间的距离与原始空间中的距离保持一致,即 ∣ ∣ z i − z j ∣ ∣ = d i s t i j ||z_i - z_j|| = dist_{ij} ∣∣zi−zj∣∣=distij。
降维后的样本
Z
Z
Z的内积矩阵为
B
=
Z
T
Z
∈
R
m
×
m
B = Z^TZ \in R^{m \times m}
B=ZTZ∈Rm×m,
b
i
j
=
z
i
T
z
j
b_{ij} = z_i^Tz_j
bij=ziTzj。因为
(1)
d
i
s
t
i
j
2
=
∣
∣
z
i
∣
∣
2
+
∣
∣
z
j
∣
∣
2
−
2
z
i
T
z
j
=
b
i
i
+
b
j
j
−
2
b
i
j
dist_{ij}^2 = ||z_i||^2 + ||z_j||^2 - 2z_i^Tz_j \\ = b_{ii} + b_{jj} - 2b_{ij} \tag{1}
distij2=∣∣zi∣∣2+∣∣zj∣∣2−2ziTzj=bii+bjj−2bij(1)
假设降维后的样本Z被中心化,即 ∑ i = 1 m z i = 0 \sum_{i=1}^{m}z_i = 0 ∑i=1mzi=0。那么 ∑ i = 1 m b i j = ∑ i = 1 m z i T z j = ( ∑ i = 1 m z i T ) z j = 0 , ∑ j = 1 m b i j = ∑ j = 1 m z i T z j = z i T ( ∑ i = 1 m z j ) = 0 \sum_{i=1}^{m}b_{ij} = \sum_{i=1}^{m}z_i^Tz_j=(\sum_{i=1}^mz_i^T)z_j = 0,\sum_{j=1}^mb_{ij} = \sum_{j=1}^mz_i^Tz_j =z_i^T (\sum_{i=1}^mz_j) = 0 ∑i=1mbij=∑i=1mziTzj=(∑i=1mziT)zj=0,∑j=1mbij=∑j=1mziTzj=ziT(∑i=1mzj)=0。
因此,
(2)
∑
i
=
1
m
d
i
s
t
i
j
2
=
∑
i
=
1
m
(
b
i
i
+
b
j
j
−
2
b
i
j
)
=
∑
i
=
1
m
b
i
i
+
∑
i
=
1
m
b
j
j
−
2
∑
i
=
1
m
b
i
j
=
t
r
(
B
)
+
m
b
j
j
\sum_{i=1}^mdist_{ij}^2 = \sum_{i=1}^{m}(b_{ii} + b_{jj} - 2b_{ij}) \\ = \sum_{i=1}^{m}b_{ii} +\sum_{i=1}^{m}b_{jj} - 2\sum_{i=1}^{m}b_{ij} \\ = tr(B) +mb_{jj} \tag{2}
i=1∑mdistij2=i=1∑m(bii+bjj−2bij)=i=1∑mbii+i=1∑mbjj−2i=1∑mbij=tr(B)+mbjj(2)
(3) ∑ j = 1 m d i s t i j 2 = ∑ j = 1 m ( b i i + b j j − 2 b i j ) = ∑ j = 1 m b i i + ∑ j = 1 m b j j − 2 ∑ j = 1 m b i j = m b i i + t r ( B ) \sum_{j=1}^mdist_{ij}^2 = \sum_{j=1}^{m}(b_{ii} + b_{jj} - 2b_{ij}) \\ = \sum_{j=1}^{m}b_{ii} +\sum_{j=1}^{m}b_{jj} - 2\sum_{j=1}^{m}b_{ij} \\ = mb_{ii} + tr(B) \tag{3} j=1∑mdistij2=j=1∑m(bii+bjj−2bij)=j=1∑mbii+j=1∑mbjj−2j=1∑mbij=mbii+tr(B)(3)
(4) ∑ i = 1 m ∑ j = 1 m d i s t i j 2 = ∑ i = 1 m ∑ j = 1 m ( b i i + b j j − 2 b i j ) = ∑ i = 1 m ∑ j = 1 m b i i + ∑ i = 1 m ∑ j = 1 m b j j − 2 ∑ i = 1 m ∑ j = 1 m b i j = 2 m t r ( B ) \sum_{i=1}^m\sum_{j=1}^mdist_{ij}^2 = \sum_{i=1}^m\sum_{j=1}^m(b_{ii} + b_{jj} - 2b_{ij}) \\ = \sum_{i=1}^m\sum_{j=1}^mb_{ii} + \sum_{i=1}^m\sum_{j=1}^mb_{jj} - 2\sum_{i=1}^m\sum_{j=1}^mb_{ij} \\ = 2m~tr(B) \tag{4} i=1∑mj=1∑mdistij2=i=1∑mj=1∑m(bii+bjj−2bij)=i=1∑mj=1∑mbii+i=1∑mj=1∑mbjj−2i=1∑mj=1∑mbij=2m tr(B)(4)
令
(5)
d
i
s
t
i
.
2
=
1
m
∑
j
=
1
m
d
i
s
t
i
j
2
dist_{i .}^2 = \frac{1}{m} \sum_{j=1}^{m}dist_{ij}^2 \tag{5}
disti.2=m1j=1∑mdistij2(5)
(6)
d
i
s
t
.
j
2
=
1
m
∑
i
=
1
m
d
i
s
t
i
j
2
dist_{.j}^2 = \frac{1}{m} \sum_{i=1}^{m}dist_{ij}^2 \tag{6}
dist.j2=m1i=1∑mdistij2(6)
(7)
d
i
s
t
.
.
2
=
1
m
2
∑
i
=
1
m
∑
j
=
1
m
d
i
s
t
i
j
2
dist_{..}^2 = \frac{1}{m^2} \sum_{i=1}^{m}\sum_{j=1}^{m}dist_{ij}^2\tag{7}
dist..2=m21i=1∑mj=1∑mdistij2(7)
由式子(1)~(7)可得:
(8)
b
i
j
=
−
1
2
(
d
i
s
t
i
j
2
−
d
i
s
t
i
.
2
−
d
i
s
t
.
j
2
+
d
i
s
t
.
.
2
)
b_{ij} = -\frac{1}{2}(dist_{ij}^2 - dist_{i.}^2 - dist_{.j}^2 + dist_{..}^2) \tag{8}
bij=−21(distij2−disti.2−dist.j2+dist..2)(8)
式子(8)的含义是因为降维前后距离矩阵保持不变,可以由原始距离矩阵D求得降维后的内积矩阵B。
对矩阵B进行特征值分解,
B
=
V
Λ
V
T
B = V \Lambda V^T
B=VΛVT,其中
Λ
=
d
i
a
g
(
λ
1
,
λ
2
,
⋯
 
,
λ
d
)
\Lambda = diag(\lambda_1,\lambda_2,\cdots,\lambda_d)
Λ=diag(λ1,λ2,⋯,λd)为特征值构成的对角矩阵,
λ
1
≥
λ
2
≥
⋯
≥
λ
d
\lambda_1\geq \lambda_2 \geq \cdots \geq \lambda_d
λ1≥λ2≥⋯≥λd,V为特征向量矩阵。假定其中有
d
∗
d^*
d∗个非零特征值,他们构成对角矩阵
Λ
∗
=
d
i
a
g
(
λ
1
,
λ
2
,
⋯
 
,
λ
d
∗
)
\Lambda_{*} = diag(\lambda_1,\lambda_2,\cdots,\lambda_{d^*})
Λ∗=diag(λ1,λ2,⋯,λd∗),令
V
∗
V_*
V∗表示相应的特征向量矩阵,则B可表达为:
B
=
V
∗
Λ
∗
V
∗
T
B = V_*\Lambda_{*}V_*^T
B=V∗Λ∗V∗T
由于
B
=
Z
T
Z
B = Z^TZ
B=ZTZ,则Z可表达为:
Z
=
Λ
∗
1
2
V
∗
T
∈
R
d
∗
×
m
Z = \Lambda_*^{\frac{1}{2}}V_*^T \in R^{d^* \times m}
Z=Λ∗21V∗T∈Rd∗×m
为了实现降维的目的,往往需要降维后的距离与原始空间中的距离尽可能相近,而不必完全相等。此时可取
d
′
<
<
d
d^{'} << d
d′<<d个最大特征值构成对角矩阵
Λ
′
=
d
i
a
g
(
λ
1
,
λ
2
,
⋯
 
,
λ
d
′
)
\Lambda^{'} = diag(\lambda_1,\lambda_2,\cdots,\lambda_{d^{'}})
Λ′=diag(λ1,λ2,⋯,λd′),令
V
′
V^{'}
V′表示相应的特征向量矩阵,则Z可表示为
(9)
Z
=
Λ
′
1
2
V
′
T
∈
R
d
′
×
m
Z = \Lambda^{'^{\frac{1}{2}}}V^{'^T} \in R^{d^{'} \times m} \tag{9}
Z=Λ′21V′T∈Rd′×m(9)
MDS算法具体过程为:
输入:
距离矩阵
D
∈
R
m
×
m
D \in R^{m \times m}
D∈Rm×m,其元素
d
i
s
t
i
j
dist_{ij}
distij为样本
x
i
x_i
xi和样本
x
j
x_j
xj之间的距离;
低维空间维数
d
′
d^{'}
d′;
过程:
1.根据公式(5)~(7)计算
d
i
s
t
i
.
2
,
d
i
s
t
.
j
2
,
d
i
s
t
.
.
2
dist_{i .}^2,dist_{.j}^2,dist_{..}^2
disti.2,dist.j2,dist..2;
2.根据公式(8)计算矩阵B;
3.对B进行特征值分解;
4.取
Λ
′
\Lambda^{'}
Λ′为B的
d
′
d^{'}
d′个最大的特征值组成的对角矩阵,
V
′
V^{'}
V′为对应的特征向量矩阵。
输出:
矩阵
V
′
T
Λ
′
1
2
∈
R
m
×
d
′
V^{'^~T}\Lambda^{'^{\frac{1}{2}}} \in R^{m \times d^{'}}
V′ TΛ′21∈Rm×d′,每一行对应原始每一行样本的低维坐标。
2.1.2 主成分分析
主成分分析(Principal Components analysis,PCA)是最常用的样本降维方法。
PCA的思想是将原始的n维特征映射到k维上( k < < n k << n k<<n),这k维是全新的正交特征,称之为主元。
2.1.2.1 PCA计算过程
- 对原始数据减均值;
- 计算减均值之后的数据的协方差矩阵;
- 计算协方差矩阵的特征值和对应的特征向量;
- 选取最大的k个特征向量组成对角矩阵,将对应的特征向量组成特征向量矩阵;
- 将原始样本投影到选取的特征向量上,得到降维后的样本。
举例:
原始数据集
D
∈
R
10
×
2
D \in R^{10 \times 2}
D∈R10×2,10个样本,每个样本2维特征。
D = [ 2.5 2.4 0.5 0.7 2.2 2.9 1.9 2.2 3.1 3.0 2.3 2.7 2 1.6 1 1.1 1.5 1.6 1.1 0.9 ] D =\left[ \begin{matrix} 2.5&2.4 \\0.5&0.7\\2.2&2.9\\1.9&2.2\\3.1&3.0\\2.3&2.7\\2&1.6\\1&1.1\\1.5&1.6\\1.1&0.9 \end{matrix} \right] D=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡2.50.52.21.93.12.3211.51.12.40.72.92.23.02.71.61.11.60.9⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
- 样本减均值
样本集D的均值为[1.81,1.91],样本集D减均值后为:
D ′ = [ 0.69 0.49 − 1.31 − 1.21 0.39 0.99 0.09 0.29 1.29 1.09 0.49 0.79 0.19 − 0.31 − 0.81 − 0.81 − 0.31 − 0.31 − 0.71 − 1.01 ] D^{'} = \left[ \begin{matrix} 0.69 & 0.49 \\-1.31 & -1.21 \\ 0.39 & 0.99 \\ 0.09 & 0.29 \\ 1.29 & 1.09 \\0.49 & 0.79 \\0.19 & -0.31 \\ -0.81 & -0.81 \\-0.31 & -0.31 \\-0.71 & -1.01 \end{matrix}\right] D′=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0.69−1.310.390.091.290.490.19−0.81−0.31−0.710.49−1.210.990.291.090.79−0.31−0.81−0.31−1.01⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤ - 计算协方差矩阵
协方差矩阵衡量的是不同维特征之间的相互关系,协方差矩阵大小为 R n × n R^{n \times n} Rn×n, n n n表示原始数据集中的特征维数。协方差矩阵的第i行第j列的元素 C o v i j Cov_{ij} Covij表示原始数据集中第i维特征与第j维特征之间的关联程度,取值为正则表示正相关,一个取值增大,另一个也随着增大;取值为负则表示负相关。取值的绝对值越大,表示关联程度越强。取值为0,表示两个特征相互独立。
若数据为三维,则其协方差矩阵为
C = ( c o v ( x , x ) c o v ( x , y ) c o v ( x , z ) c o v ( y , x ) c o v ( y , y ) c o v ( y , z ) c o v ( z , x ) c o v ( z , y ) c o v ( z , z ) ) C = \left( \begin{matrix} cov(x,x)&cov(x,y)&cov(x,z) \\ cov(y,x)&cov(y,y)&cov(y,z) \\cov(z,x)&cov(z,y)&cov(z,z)\end{matrix} \right) C=⎝⎛cov(x,x)cov(y,x)cov(z,x)cov(x,y)cov(y,y)cov(z,y)cov(x,z)cov(y,z)cov(z,z)⎠⎞
协方差矩阵一定为对角矩阵,且主对角线元素为各维特征的方差。
c o v ( x , x ) = v a r ( x ) = 1 m − 1 ( ( x − E ( x ) ) T ( x − E ( x ) ) ) = 1 m − 1 ∑ i = 1 m ( x i − x ‾ ) ( x i − x ‾ ) cov(x,x) =var(x) = \frac{1}{m-1}((x-E(x))^T(x - E(x)))\\= \frac{1}{m-1}\sum_{i=1}^{m}(x_i - \overline x)(x_i - \overline x) cov(x,x)=var(x)=m−11((x−E(x))T(x−E(x)))=m−11i=1∑m(xi−x)(xi−x)
c o v ( x , y ) = 1 m − 1 ( ( x − E ( x ) ) T ( y − E ( y ) ) ) = 1 m − 1 ∑ i = 1 m ( x i − x ‾ ) ( y i − y ‾ ) cov(x,y) = \frac{1}{m-1}((x-E(x))^T(y - E(y)))\\= \frac{1}{m-1}\sum_{i=1}^{m}(x_i - \overline x)(y_i - \overline y) cov(x,y)=m−11((x−E(x))T(y−E(y)))=m−11i=1∑m(xi−x)(yi−y)
m表示总的样本数量,之所以除(m-1)是因为一般使用的是无偏估计。
协方差矩阵也可以这样计算,对于矩阵 X ∈ R n × m X \in R^{n \times m} X∈Rn×m,m个样本,每个样本n维特征,其协方差矩阵为 C ∈ R n × n C \in R^{n \times n} C∈Rn×n, C = E [ ( X − E [ X ] ) ( X − E ( X ) ) T ] C = E[(X - E[X])(X - E(X))^T] C=E[(X−E[X])(X−E(X))T]。
对于数据集 D ′ D^{'} D′,其协方差矩阵为:
c o v = ( 0.616555556 0.615444444 0.615444444 0.716555556 ) cov = \left( \begin{matrix} 0.616555556 &0.615444444 \\0.615444444&0.716555556 \end{matrix}\right) cov=(0.6165555560.6154444440.6154444440.716555556) - 求取协方差矩阵的特征值和特征向量
设A为n阶矩阵,若存在常数λ及n维非零向量x,使得Ax=λx,则称λ是矩阵A的特征值,x是A属于特征值λ的特征向量。
因为Ax = λx,因此有(A-λE)x = 0,x为非零向量,则只有令|A-λE|=0,代入接触各λ值及对应的特征向量x。特征向量x一般为单位向量。
因此,上面协方差矩阵的特征值和特征向量为:
λ = ( 1.28402771 0.049083399 ) \lambda = \left( \begin{matrix} 1.28402771 \\ 0.049083399\end{matrix}\right) λ=(1.284027710.049083399)
v = ( − 0.677873399 − 0.735178656 − 0.735178656 0.677873399 ) v = \left( \begin{matrix} -0.677873399 & -0.735178656 \\ -0.735178656 & 0.677873399\end{matrix}\right) v=(−0.677873399−0.735178656−0.7351786560.677873399)
这里得到的两个特征向量相互正交,这是因为实对阵矩阵的特征向量一定相互正交。 - 取前 k k k个最大的特征值对应的特征向量组成变换矩阵,这里k只能取值为1。组成特征向量矩阵V时将各特征向量按列插入特征向量矩阵。
- 将样本点投影到选取的特征向量矩阵上。
减均值后的数据集 D ′ ∈ R m × n D^{'} \in R^{m \times n} D′∈Rm×n,特征向量矩阵 V ∈ R n × k V \in R^{n \times k} V∈Rn×k,因此投影后的结果为 D ′ V ∈ R m × k D^{'}V \in R^{m \times k} D′V∈Rm×k。即每一行为一个投影后的样本。
这里的投影结果为:
[ − 0.827970186 1.77758033 − 0.992197494 − 0.274210416 − 1.67580142 − 0.912949103 0.0991094375 1.14457216 0.438046137 1.22382056 ] \left[ \begin{matrix}-0.827970186 \\1.77758033 \\-0.992197494 \\-0.274210416 \\ -1.67580142 \\-0.912949103 \\0.0991094375 \\1.14457216\\0.438046137\\1.22382056 \end{matrix}\right] ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡−0.8279701861.77758033−0.992197494−0.274210416−1.67580142−0.9129491030.09910943751.144572160.4380461371.22382056⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
2.1.2.2 PCA理论基础
PCA可以从最大方差理论的角度进行解释。
信号处理中认为信号具有较大的方差,噪声具有较小的方差,信噪比就是信号与噪声的方差比,越大越好。
因此,最大方差理论认为将原始的样本投影到k维特征后,每一维的样本方差越大越好。
如下图所示,原始数据集经过归一化(减均值、除标准差)之后的分布情况为:
将样本点投影到两个特征向量上,得到的数据分布为:
根据最大方差理论,左边的特征向量为更好的投影方向。
如上图所示,样本 x ( i ) x^{(i)} x(i)在单位向量 u u u上的投影点距原点的距离为 ∣ x ( i ) ∣ cos ( θ ) = ∣ x ( i ) ∣ x ( i ) T u ∣ x ( i ) ∣ ∣ u ∣ = x ( i ) T u |x^{(i)}|\cos(\theta) = |x^{(i)}|\frac{{x^{(i)}}^Tu}{|x^{(i)}||u|}={x^{(i)}}^Tu ∣x(i)∣cos(θ)=∣x(i)∣∣x(i)∣∣u∣x(i)Tu=x(i)Tu。
由于原始经过减均值之后的样本点 x ( i ) x^{(i)} x(i)的均值为0,即 1 m ∑ i = 1 m x ( i ) = 0 \frac{1}{m}\sum_{i=1}^mx^{(i)} = 0 m1∑i=1mx(i)=0。因此经过投影之后,各样本点分布在以投影方向为坐标轴的坐标系中,那么样本点的坐标即为距离原点的距离。
投影后的样本点的均值为 1 m ∑ i = 1 m x ( i ) T u = ( 1 m ∑ i = 1 m x ( i ) ) T u = 0 \frac{1}{m}\sum_{i=1}^m{x^{(i)}}^Tu = ({\frac{1}{m}\sum_{i=1}^m{x^{(i)}}})^Tu = 0 m1∑i=1mx(i)Tu=(m1∑i=1mx(i))Tu=0。
那么投影后的样本点的方差为:
1
m
∑
i
=
1
m
(
x
(
i
)
T
u
)
2
=
1
m
∑
i
=
1
m
(
x
(
i
)
T
u
)
T
(
x
(
i
)
T
u
)
=
1
m
∑
i
=
1
m
(
u
T
x
(
i
)
)
(
x
(
i
)
T
u
)
=
u
T
(
1
m
∑
i
=
1
m
x
(
i
)
x
(
i
)
T
)
u
\frac{1}{m}\sum_{i=1}^m({x^{(i)}}^Tu)^2 = \frac{1}{m}\sum_{i=1}^m({x^{(i)}}^Tu)^T({x^{(i)}}^Tu) \\ = \frac{1}{m}\sum_{i=1}^m(u^Tx^{(i)})({x^{(i)}}^Tu) \\ = u^T (\frac{1}{m}\sum_{i=1}^mx^{(i)}{x^{(i)}}^T)u
m1i=1∑m(x(i)Tu)2=m1i=1∑m(x(i)Tu)T(x(i)Tu)=m1i=1∑m(uTx(i))(x(i)Tu)=uT(m1i=1∑mx(i)x(i)T)u
最后一个式子的中间部分即为经过减均值之后的原始数据集的协方差矩阵。只不过这里是除m,是有偏估计。
因为
u
u
u为单位向量,有
u
T
u
=
1
u^Tu = 1
uTu=1,因此,此时的目标变为:
m
a
x
u
T
Σ
u
s
.
t
.
∣
∣
u
∣
∣
2
=
1
max~~u^T\Sigma u \\ s.t. ||u||_2 = 1
max uTΣus.t.∣∣u∣∣2=1
使用拉格朗日乘子法,对u对导数,可得:
Σ
u
=
λ
u
\Sigma u = \lambda u
Σu=λu
因此,接下来就需要计算
Σ
\Sigma
Σ的特征值和特征向量,得到前k个最大的特征值及对应的特征向量,由于
Σ
\Sigma
Σ为实对称矩阵,因此k个特征向量一定相互正交,k个特征向量组成矩阵
V
∈
R
n
×
k
V \in R^{n \times k}
V∈Rn×k。
最后,计算降维后的样本为
Y
=
X
V
∈
R
m
×
k
Y= XV \in R^{m \times k}
Y=XV∈Rm×k,即
y
(
i
)
=
[
x
(
i
)
T
v
1
x
(
i
)
T
v
2
⋯
x
(
i
)
T
v
k
]
∈
R
k
y^{(i)} = \left[ \begin{matrix} {x^{(i)}}^Tv_1 \\ {x^{(i)}}^Tv_2 \\ \cdots \\ {x^{(i)}}^Tv_k\end{matrix} \right] \in R^k
y(i)=⎣⎢⎢⎢⎡x(i)Tv1x(i)Tv2⋯x(i)Tvk⎦⎥⎥⎥⎤∈Rk
上式中,
v
i
v_i
vi表示
Σ
\Sigma
Σ 的第
i
i
i 大特征值对应的特征向量,也叫做第
i
i
i 个主成分。
2.1.2.3 PCA小结
PCA中降维后的维数k是由用户指定的,或是通过对不同的k值得低维空间样本集应用低开销学习器(如k近邻分类器)进行交叉验证得到。对PCA,还可以从重构的角度设置一个重构阈值,利于
t
=
95
%
t = 95\%
t=95%,然后选取使下式成立的最小的k值:
∑
i
=
1
d
λ
i
∑
i
=
1
n
λ
i
≥
t
\frac{\sum_{i=1}^{d}\lambda_i}{\sum_{i=1}^{n}\lambda_i} \geq t
∑i=1nλi∑i=1dλi≥t
PCA仅需要特征向量矩阵进行矩阵和向量的乘法就可以将样本映射到k个正交的低维空间中,保留了最重要的k个主要成分,舍弃了原始样本中 n − k n - k n−k维的信息,实现了降维。但舍弃的这部分信息往往是必要的:一方面,舍弃这部分信息之后能使样本的采样密度增大,避免了维度灾难;另一方面,当数据受到噪声影响时,最小特征值所对应的特征向量往往与噪声有关,将它们舍弃能在一定程度上起到去噪的效果。
人脸识别中的eigenface是基于PCA进行的,核心思路是向人脸图像投影到k维子空间中,只保留其主要成分进行匹配,若两幅人脸图像的主要成分之间的距离较小,则完成匹配过程。
2.1.3 奇异值分解
2.1.3.1 特征值分解
只有方阵才可以进行特征值分解,但任何矩阵都可以进行奇异值分解。
特征值分解:
方阵
A
v
=
λ
v
Av = \lambda v
Av=λv,
λ
\lambda
λ为特征值,v为对应的特征向量。
一个矩阵乘以一个向量就是对这个向量进行线性变换,如
A
=
[
3
0
0
1
]
A = \left[ \begin{matrix} 3 & 0 \\ 0 & 1\end{matrix}\right]
A=[3001]
[
3
0
0
1
]
[
x
y
]
=
[
3
x
y
]
\left[ \begin{matrix} 3 & 0 \\ 0 & 1\end{matrix}\right]\left[ \begin{matrix} x \\y\end{matrix}\right] = \left[ \begin{matrix} 3 x \\y\end{matrix}\right]
[3001][xy]=[3xy]
B
=
[
1
1
0
1
]
B = \left[ \begin{matrix} 1 & 1 \\ 0 & 1\end{matrix}\right]
B=[1011]
[
1
1
0
1
]
[
x
y
]
=
[
x
+
y
y
]
\left[ \begin{matrix} 1 & 1 \\ 0 & 1\end{matrix}\right]\left[ \begin{matrix} x \\y\end{matrix}\right] = \left[ \begin{matrix} x+y \\y\end{matrix}\right]
[1011][xy]=[x+yy]
矩阵与一个向量乘积之后,是对向量进行了线性变换,但是这个线性变换一定存在几个主要的变换方向。如上面这幅图主要的变换方向接近于蓝色箭头方向。
特征值分解是将一个方阵分解为 A = V Σ V − 1 A = V \Sigma V^{-1} A=VΣV−1, Σ \Sigma Σ为对角矩阵,里面的由特征值从大到小排列组成。V为对应的特征向量矩阵,表示矩阵对一个向量进行左乘之后的主要的变换方向(由主要方向到次要方向进行排列)。
当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是之前说的:提取这个矩阵最重要的特征。特征值就表示各变换方向的强度大小。
2.1.3.2 奇异值分解
奇异值分解可用于任何矩阵。对矩阵
A
∈
R
m
×
n
A \in R^{m \times n}
A∈Rm×n,其分解过程可以表述为:
A
=
U
Σ
V
T
A = U \Sigma V^T
A=UΣVT
- U ∈ R m × m U \in R^{m \times m} U∈Rm×m,U为正交矩阵, U U T = I , U = U − 1 UU^T = I , U = U^{-1} UUT=I,U=U−1,U由 A A T AA^T AAT的特征向量组成;
- Σ ∈ R m × n \Sigma \in R^{m \times n} Σ∈Rm×n为对角矩阵,包含由大到小排列的奇异值;
- V ∈ R n × n V \in R^{n \times n} V∈Rn×n,U为正交矩阵, V V T = I , V = V − 1 VV^T = I , V = V^{-1} VVT=I,V=V−1,U由 A T A A^TA ATA的特征向量组成;
奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:
A
≈
U
m
×
r
Σ
r
×
r
V
r
×
n
T
A \approx U_{m \times r} \Sigma_{r \times r} V^T_{r \times n}
A≈Um×rΣr×rVr×nT
由于可以设置 r <<(m, n),那么近似为:
右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵:U、Σ、V就好了。
2.1.3.3 PCA 和 SVD 的关系
主成分分析在上一节里面也讲了一些,这里主要谈谈如何用SVD去解PCA的问题。PCA的问题其实是一个基的变换,使得变换后的数据有着最大的方差。方差的大小描述的是一个变量的信息量,我们在讲一个东西的稳定性的时候,往往说要减小方差,如果一个模型的方差很大,那就说明模型不稳定了。但是对于我们用于机器学习的数据(主要是训练数据),方差大才有意义,不然输入的数据都是同一个点,那方差就为0了,这样输入的多个数据就等同于一个数据了。以下面这张图为例子:
这个假设是一个摄像机采集一个物体运动得到的图片,上面的点表示物体运动的位置,假如我们想要用一条直线去拟合这些点,那我们会选择什么方向的线呢?当然是图上标有signal的那条线。如果我们把这些点单纯的投影到x轴或者y轴上,最后在x轴与y轴上得到的方差是相似的(因为这些点的趋势是在45度左右的方向,所以投影到x轴或者y轴上都是类似的),如果我们使用原来的xy坐标系去看这些点,容易看不出来这些点真正的方向是什么。但是如果我们进行坐标系的变化,横轴变成了signal的方向,纵轴变成了noise的方向,则就很容易发现什么方向的方差大,什么方向的方差小了。
一般来说,方差大的方向是信号的方向,方差小的方向是噪声的方向,我们在数据挖掘中或者数字信号处理中,往往要提高信号与噪声的比例,也就是信噪比。对上图来说,如果我们只保留signal方向的数据,也可以对原数据进行不错的近似了。
PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。
还是假设我们矩阵每一行表示一个样本,每一列表示一个feature,用矩阵的语言来表示,将一个m * n的矩阵A的进行坐标轴的变化,P就是一个变换的矩阵从一个N维的空间变换到另一个N维的空间,在空间中就会进行一些类似于旋转、拉伸的变化。
A
m
×
n
P
n
×
n
=
A
m
×
n
′
A_{m \times n} P_{n \times n} = A^{'}_{m \times n}
Am×nPn×n=Am×n′
而将一个m * n的矩阵A变换成一个m * r的矩阵,这样就会使得本来有n个feature的,变成了有r个feature了(r < n),这r个其实就是对n个feature的一种提炼,我们就把这个称为feature的压缩。用数学语言表示就是:
A
m
×
n
P
n
×
r
=
A
m
×
r
′
A_{m \times n} P_{n \times r} = A^{'}_{m \times r}
Am×nPn×r=Am×r′
但是这个怎么和SVD扯上关系呢?之前谈到,SVD得出的奇异向量也是从奇异值由大到小排列的,按PCA的观点来看,就是方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量…我们回忆一下之前得到的SVD式子:
A
≈
U
m
×
r
Σ
r
×
r
V
r
×
n
T
A \approx U_{m \times r} \Sigma_{r \times r} V^T_{r \times n}
A≈Um×rΣr×rVr×nT
在矩阵的两边同时乘上一个矩阵V,由于V是一个正交的矩阵,所以V转置乘以V得到单位阵I,所以可以化成后面的式子
A
m
×
n
V
r
×
n
≈
U
m
×
r
Σ
r
×
r
V
r
×
n
T
V
r
×
n
A_{m \times n}V_{r \times n} \approx U_{m \times r} \Sigma_{r \times r} V^T_{r \times n}V_{r \times n}
Am×nVr×n≈Um×rΣr×rVr×nTVr×n
A
m
×
n
V
r
×
n
≈
U
m
×
r
Σ
r
×
r
A_{m \times n}V_{r \times n} \approx U_{m \times r} \Sigma_{r \times r}
Am×nVr×n≈Um×rΣr×r
将后面的式子与A * P那个m * n的矩阵变换为m * r的矩阵的式子对照看看,在这里,其实V就是P,也就是一个变化的向量。这里是将一个m * n 的矩阵压缩到一个m * r的矩阵,也就是对列进行压缩,如果我们想对行进行压缩(在PCA的观点下,对行进行压缩可以理解为,将一些相似的sample合并在一起,或者将一些没有太大价值的sample去掉)怎么办呢?同样我们写出一个通用的行压缩例子:
P
r
×
m
A
m
×
n
=
A
r
×
n
′
P_{r \times m}A_{m \times n} = A^{'}_{r \times n}
Pr×mAm×n=Ar×n′
这样就从一个m行的矩阵压缩到一个r行的矩阵了,对SVD来说也是一样的,我们对SVD分解的式子两边乘以U的转置
U
T
U^T
UT:
U
m
×
r
T
A
m
×
n
≈
Σ
r
×
r
V
r
×
n
T
U^T_{m \times r}A_{m \times n} \approx \Sigma_{r \times r}V^T_{r \times n}
Um×rTAm×n≈Σr×rVr×nT
这样我们就得到了对行进行压缩的式子。
可以看出,其实PCA几乎可以说是对SVD的一个包装,如果我们实现了SVD,那也就实现了PCA了,而且更好的地方是,有了SVD,我们就可以得到两个方向的PCA。
- SVD可以获取两个方向(特征数和样本数)上的主成份(压缩),而PCA只能获取一个方向(特征数)上的主成份(压缩);
- 求解矩阵的最小二乘问题需要求伪逆,使用SVD可以很容易得到矩阵的伪逆 X − 1 = V Σ − 1 U T X^{-1} = V \Sigma^{-1} U^T X−1=VΣ−1UT;
- 通过SVD可以得到PCA相同的结果,但是SVD没有计算 X T X X^TX XTX这一步,通常比直接使用PCA更稳定。因为PCA需要计算 X T X X^TX XTX的值,对于某些矩阵,求协方差时很可能会丢失一些精度;
- SVD的速度比特征值分解要快很多,充分地利用了协方差矩阵的性质。
参考
周志华 《机器学习》
CS229
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
https://blog.youkuaiyun.com/Dark_Scope/article/details/53150883
若有错误,欢迎批评指正!