周志华《机器学习》西瓜书
第10章 降维与度量学习
一、k近邻学习
k近邻(k−Nearest Neighbor,KNN)学习是一种常用的监督学习方法。其基本思想是:给定测试样本,基于某种距离度量找到与其最靠近的k个训练样本,根据这k个邻居的信息来进行预测。其中,分类问题往往采用“投票法”;回归问题采用“平均法”。 其示意图如下:
KNN(分类/回归)算法过程:
- 计算测试样本和训练样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);
- 对上面所有的距离值进行排序;
- 选前 k 个最小距离的样本;
- 根据这 k 个样本的 (标签进行投票得到最后的分类类别;/实值输出标记的均值或加权均值作为预测结果;)
k−近邻分类器没有显式的训练过程,训练过程仅需要将样本保存起来,待收到测试样本后再进行处理,是典型的“懒惰训练”(lazy learning)。该方法的核心是确定k,当k=1,其又叫作“最近邻分类器”。相应地我们称那些一有训练数据立马开工的算法为“急切学习”。
条件:假设样本独立同分布,且对任意测试样本 x x x 附近任意小的正数 δ \delta δ 范围内总能找到一个训练样本,即训练样本的采样密度足够大,或称为密采样(dense sample)。我们能得出如下结论:最近邻分类器虽简单,但它的泛化错误率不超过贝叶斯最优分类器的错误率的两倍
二、低维嵌入
为什么需要降维?
样本的特征数也称为维数,当维数非常大时,也就是通常所说的“维数危机”。这具体表现在:在高维情形下,数据样本变得十分稀疏(因为此时要满足训练样本为“密采样”的总体样本数目是一个天文数字)。训练样本的稀疏使得其代表总体分布的能力大大减弱,从而削弱了学习器的泛化能力;同时当维数很高时,计算距离也变得不再容易,这也是为什么SVM使用核函数 “低维计算,高维表达” 的原因。
何为降维?
降维(维数约简,dimension reduction),即通过某种数学变换将原始高维空间转变到一个低维的子空间。这样在子空间中样本密度就会增大,距离计算也会比之前简单。
为什么能进行降维?
虽然我们得到的数据经常是高维的,但与学习任务密切相关的也许仅是某个低维分布(即高维空间中的一个低维嵌入)。
怎么评估降维效果
比较降维前后学习器的性能
多维缩放(Mutiple Dimensional Scaling,MDS)
主要要求
原始空间中的样本之间的距离在低维空间中得以保持
原理推导
已知:假定 m m m 个样本在原始空间的距离矩阵为 D ∈ R m × m \mathbf D \in \mathbb{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 的距离。
目标:获得样本在 d ′ d' d′ 维空间的表示 Z ∈ R d ′ × m , d ′ ⩽ d \mathbf Z \in \mathbb{R}^{d' \times m} ,d' \leqslant d Z∈Rd′×m,d′⩽d, 且任意两个样本在 d ′ d' d′ 维的空间中欧氏距离等于原始空间中的距离,即 ∣ ∣ z i − z j ∣ ∣ = d i s t i j ||z_i-z_j||=dist_{ij} ∣∣zi−zj∣∣=distij 。因此接下来我们要做的就是根据已有的距离矩阵D来求解出降维后的坐标矩阵Z。
求解:令B为降维后样本的内积矩阵,
B
=
Z
T
Z
∈
R
m
×
m
\mathbf B=\mathbf Z^{\mathrm T} \mathbf Z \in \mathbb R^{m \times m}
B=ZTZ∈Rm×m,其中
b
i
j
=
z
i
T
z
j
b_{i j}=z_{i}^{\mathrm T} z_{j}
bij=ziTzj,则:
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
\begin{align*} dist_{ij}^2&=\left\lVert z_i \right\rVert ^2 + \left\lVert z_j \right\rVert ^2 - 2z_i^{\mathrm T}z_j\\ &=b_{ii} + b_{jj} -2b_{ij} \end{align*}
distij2=∥zi∥2+∥zj∥2−2ziTzj=bii+bjj−2bij
数据中心化:是指变量减去它的均值。中心化(零均值化)后的数据均值为零
令降维后的样本 Z \mathbf Z Z 被中心化,即 ∑ i = 1 m z i = 0 \sum_{i=1}^{m}z_{i}=0 ∑i=1mzi=0。因此有矩阵 B \mathbf B B 的行与列之和均为0,即 ∑ i = 1 m b i j = ∑ j = 1 m b i j = 0 \sum_{i=1}^{m}b_{ij} = \sum_{j=1}^{m}b_{ij} = 0 ∑i=1mbij=∑j=1mbij=0。
因为 ∑ j = 1 m b i j = ∑ t = 1 d ′ ( z t i ⋅ ∑ k = 1 m z t k ) = 0 \sum_{j=1}^{m}b_{ij} = \sum_{t=1}^{d'}(z_{ti}\cdot\sum_{k=1}^{m}z_{tk})=0 ∑j=1mbij=∑t=1d′(zti⋅∑k=1mztk)=0; ∑ i = 1 m b i j = ∑ t = 1 d ′ ( z t j ⋅ ∑ k = 1 m z t k ) = 0 \sum_{i=1}^{m}b_{ij} = \sum_{t=1}^{d'}(z_{tj}\cdot\sum_{k=1}^{m}z_{tk})=0 ∑i=1mbij=∑t=1d′(ztj⋅∑k=1mztk)=0。
所以有:
∑
i
=
1
m
d
i
s
t
i
j
2
=
∑
i
=
1
m
∣
∣
z
i
2
∣
∣
+
∑
i
=
1
m
∣
∣
z
j
2
∣
∣
−
∑
i
=
1
m
2
z
i
T
z
j
=
∑
i
=
1
m
b
i
i
+
∑
i
=
1
m
b
j
j
−
∑
i
=
1
m
2
b
i
j
=
tr
(
B
)
+
m
b
j
j
\begin{align*} \sum_{i=1}^{m} d i s t_{i j}^{2}&=\sum_{i=1}^{m}||z_{i}^{2}||+\sum_{i=1}^{m}||z_{j}^{2}||-\sum_{i=1}^{m}2z_i^{\mathrm T}z_j\\ &=\sum_{i=1}^{m}b_{ii}+\sum_{i=1}^{m}b_{jj}-\sum_{i=1}^{m}2b_{ij}\\ &=\operatorname{tr}(B)+m b_{j j} \end{align*}
i=1∑mdistij2=i=1∑m∣∣zi2∣∣+i=1∑m∣∣zj2∣∣−i=1∑m2ziTzj=i=1∑mbii+i=1∑mbjj−i=1∑m2bij=tr(B)+mbjj同理得:
∑ j = 1 m d i s t i j 2 = tr ( B ) + m b i i \sum_{j=1}^{m} d i s t_{i j}^{2}=\operatorname{tr}(B)+m b_{i i} ∑j=1mdistij2=tr(B)+mbii
∑ i = 1 m ∑ j = 1 m d i s t i j 2 = 2 m tr ( B ) \sum_{i=1}^{m} \sum_{j=1}^{m} d i s t_{i j}^{2}=2 m \operatorname{tr}(B) ∑i=1m∑j=1mdistij2=2mtr(B)
其中矩阵B的迹: tr ( B ) = ∑ i = 1 n ∥ z i ∥ 2 \operatorname{tr}(B)=\sum_{i=1}^{n}\left\|z_{i}\right\|^{2} tr(B)=∑i=1n∥zi∥2。令:
dist
i
.
2
=
1
m
∑
j
=
1
m
dist
i
j
2
=
t
r
(
B
)
m
+
b
i
i
dist
.
j
2
=
1
m
∑
i
=
1
m
dist
i
j
2
=
t
r
(
B
)
m
+
b
j
j
dist
.
.
2
=
1
m
2
∑
i
=
1
m
∑
j
=
1
m
dist
i
j
2
=
2
t
r
(
B
)
m
\operatorname{dist}_{i .}^{2}=\frac{1}{m} \sum_{j=1}^{m} \operatorname{dist}_{i j}^{2} = \frac{tr(B)}{m}+b_{ii}\\ \operatorname{dist}_{. j}^{2}=\frac{1}{m} \sum_{i=1}^{m} \operatorname{dist}_{i j}^{2} = \frac{tr(B)}{m}+b_{jj} \\ \operatorname{dist}_{. .}^{2}=\frac{1}{m^{2}} \sum_{i=1}^{m} \sum_{j=1}^{m} \operatorname{dist}_{i j}^{2} = \frac{2tr(B)}{m}
disti.2=m1j=1∑mdistij2=mtr(B)+biidist.j2=m1i=1∑mdistij2=mtr(B)+bjjdist..2=m21i=1∑mj=1∑mdistij2=m2tr(B)
由上述6道式子整合得:
d i s t . . 2 + b j j + b i i = d i s t i . 2 + d i s t . j 2 dist_{..}^{2}+b_{jj}+b_{ii}=dist_{i.}^{2}+dist_{.j}^{2} dist..2+bjj+bii=disti.2+dist.j2
带入 d i s t i j 2 = b i i + b j j − 2 b i j dist_{ij}^{2}=b_{ii} + b_{jj} -2b_{ij} distij2=bii+bjj−2bij进一步化简得:
b i j = − 1 2 ( dist i j 2 − d i s t i . 2 − d i s t . j 2 + d i s t . . 2 ) b_{i j}=-\frac{1}{2}\left(\operatorname{dist}_{i j}^{2}-d i s t_{i .}^{2}-d i s t_{. j}^{2}+d i s t_{. .}^{2}\right) bij=−21(distij2−disti.2−dist.j2+dist..2)
由此即可通过降维前后保持不变的距离矩阵D求内积矩阵B。我们可以从 B = Z T Z ∈ R m × m \mathbf B=\mathbf Z^{\mathrm T} \mathbf Z\in \mathbb R^{m \times m} B=ZTZ∈Rm×m 推出 Z ∈ R d ′ × m , d ′ ⩽ d \mathbf Z \in \mathbb{R}^{d' \times m} ,d' \leqslant d Z∈Rd′×m,d′⩽d。
我们对B做特征值分解(对角化),
B
=
V
Λ
V
T
B = V\Lambda V^{T}
B=VΛVT,其中
Λ
=
diag
(
λ
1
,
λ
2
,
⋯
,
λ
d
)
\Lambda=\operatorname{diag}\left(\lambda_{1}, \lambda_{2}, \cdots, \lambda_{d}\right)
Λ=diag(λ1,λ2,⋯,λd)为特征值构成的对角矩阵,且
λ
1
⩾
λ
2
⩾
⋯
⩾
λ
d
\lambda_{1}\geqslant \lambda_{2}\geqslant \cdots\geqslant \lambda_{d}
λ1⩾λ2⩾⋯⩾λd,V为特征向量矩阵。假定其中有d*个非零特征值,他们构成对角矩阵
Λ
∗
=
diag
(
λ
1
,
λ
2
,
⋯
,
λ
d
∗
)
\Lambda_{*}=\operatorname{diag}\left(\lambda_{1}, \lambda_{2}, \cdots, \lambda_{d *}\right)
Λ∗=diag(λ1,λ2,⋯,λd∗),令
V
∗
V_{*}
V∗表示其相应的特征向量矩阵,则Z可表示为:
Z
=
Λ
∗
1
/
2
V
∗
T
∈
R
d
∗
×
m
Z=\Lambda _{*}^{1 / 2} V_{*}^{T} \in R^{d^{*} \times m}
Z=Λ∗1/2V∗T∈Rd∗×m在现实应用中为了有效降维,往往仅需降维后的距离与原始空间中的距离尽可能接近,不必严格相等。此时可取
d
′
≪
d
d' \ll d
d′≪d 个最大特征值构成对角矩阵
Λ
~
=
diag
(
λ
1
,
λ
2
,
⋯
,
λ
d
′
)
\tilde{\Lambda}=\operatorname{diag}\left(\lambda_{1}, \lambda_{2}, \cdots, \lambda_{d^{\prime}}\right)
Λ~=diag(λ1,λ2,⋯,λd′),令
V
~
\tilde{V}
V~表示相应的特征向量矩阵,则Z最终可表示为:
Z
=
Λ
~
1
/
2
V
~
T
∈
R
d
′
×
m
Z=\tilde{\Lambda}^{1 / 2} \tilde{V}^{T} \in R^{d^{\prime} \times m}
Z=Λ~1/2V~T∈Rd′×m
算法流程
线性降维方法——主成分分析(PCA)
获得低维子空间的办法:简单的对原始高维空间进行线性变换
W
T
W^T
WT:新坐标系
不同的线性降维方法是对低维子空间的性质有不同要求,即对W施加不同的约束
算法逻辑
- 经过线性变换,将数据从d维线性空间映射至 d‘ 维(d’ < d),并且期望在投影方向上信息量最大(最大可分性),同时将数据进行反向重构时代价最小(最近重构性)。
- 或者说:将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大(投影后类内方差最小,类间方差最大)
最大可分性:样本点在超平面(用该超平面对所有样本进行描述)上的投影尽可能分开;
最近重构性:样本点到超平面的距离都尽可能的近;
算法推导还看不太懂QAQ。
算法流程
低维空间维数
d
′
d'
d′:是一个超参数。它的选取可以有以下方式:
- 需用户事先指定
- 或通过在 d ′ d' d′ 值不同的低维空间对k近邻分类器(或其他开销较小的学习器)进行交叉验证来选取较好的 d ′ d' d′ 值。
- 对于PCA,还可从重构的角度设置一个重构阈值,例如
t
=
95
t=95%
t=95 ,然后选取使下式成立的最小的
d
′
d'
d′ 值。
∑ i = 1 d ′ λ i ∑ i = 1 d λ i ⩾ t \frac {\sum_{i=1}^{d'} \lambda_i} {\sum_{i=1}^{d} \lambda_i} \geqslant t ∑i=1dλi∑i=1d′λi⩾t低维空间与原始高维空间必有不同,因为对应于最小的d-d’个特征值的特征舍弃了,这是降维导致的结果。但舍弃这部分信息往往是必要的:一方面舍弃这部分信息之后能使样本的采样密度增大,这正是降维的重要动机;另一方面,当数据受噪声影响时最小的特征值所对应的特征向量往往与噪声有关,将它们舍弃能在定程度上起到去噪的效果
算法优缺
- 优点
- 通过PCA降维之后的各个主成分之间是正交的,可以消除原始数据之间相互影响的因素;
- 计算过程并不复杂,实现起来较简单容易;
- 在保留大部分主要信息的前提下,起到了降维效果;
- 在一定程度上起到去噪的作用;
- 缺点
- 主成分特征维度的含义具有模糊性,解释性差(新坐标基底所代表的含义未知);
- PCA降维的标准是选取令原数据在新坐标轴上方差最大的主成分。但方差小的特征就不一定不重要,这样的唯一标准有可能会损失一些重要信息;
- 只保留特定百分比的主成分,属于“有损压缩”,难免会损失一些信息;
核化线性降维——核主成分分析(Kernelized PCA)
前面提到的线性降维的假设是:从高维空间到低维空间的函数映射是线性的。然而,现实任务中大多数可能需要非线性映射才能找到恰当的低维嵌入。
非线性降维的一种方法是基于核技巧的对线性降维方法进行“核化”(kernelized)。以核主成分分析(Kernelized PCA)为例:
三、流形学习
借鉴了拓扑流形概念的降维方法。常用的流行学习方法有等度量映射和局部线性嵌入。
- 等度量映射(Isomap)试图在降维前后保持邻域内样本之间的距离
- 局部线性嵌入(LLE)则是保持邻域内样本之间的线性关系
什么是流形
流形:在局部具有欧氏空间的性质,能用欧氏距离来进行距离计算
为什么需要流形学习
流形学习是从高维采样数据中恢复低维流形结构,即找到高维空间中的低维流形,并求出相应的嵌入映射,以实现维数约简或者数据可视化。它是从观测到的现象中去寻找事物的本质,找到产生数据的内在规律。
等度量映射(Isometric Mapping,Isomap)
基本出发点
试图保持近邻样本间距离不变。
原因:低维流形嵌入到高维空间之后,直接在高维空间中计算直线距离具有误导性,因为高维空间中的直线距离在低维流形上是不可达的。
计算测地线距离
低维嵌入流形上两点间的距离是"测地线”距离:想象一只虫子从一点爬到另一点,如果它不能脱离曲面行走,那么下图(a)的红色曲线是距离最短的路径,即S曲面上的测地线,测地线距离是两点之间的本真距离,显然,直接在高维空间中计算直线距离是不恰当的。
利用流形在局部上与欧式空间同胚的性质,对每个点基于欧氏距离找出其近邻点,然后就能建立一个近邻连接图,图中近邻点之间存在连接,而非近邻点之间不存在连接,于是,计算两点之间测地线距离的问题,就转变为计算近邻连接图上两点之间的最短路径问题。而最短路径问题可以用Dijkstra(贪心思路)或者Floyd算法求最短路径。
降维
得到高维空间中任意两点之间的距离后便可以使用MDS算法来其计算低维空间中的坐标。
算法流程
近邻图的构建,常用的有两种方法:
- 指定近邻点个数 k k k ,比如欧氏距离最近的k个点为近邻点
- 指定距离阈值 ϵ \epsilon ϵ ,小于距离阈值的点认为是近邻点。
若邻域范围指定过大,则会造成“短路问题”,即本身距离很远却成了近邻。
若邻域范围指定过小,则会造成“断路问题”,即有些样本点无法可达。
算法优缺
- Isomap只是得到了训练样本在低维空间的坐标,现在来个新的样本点不能直接得到它的低维空间坐标。需要额外训练一个回归学习器进行预测。(输入:训练样本的高维样本点坐标;输出:得到的低维样本点坐标)
- k近邻图或ϵ近邻图都存在一定的问题:短路,断路。
局部线性嵌入(Locally Linear Embedding,LLE)
基本出发点
试图保持邻域内样本之间的线性关系
假定样本点
x
i
x_{i}
xi 的坐标能够通过它的邻域样本
x
j
,
x
k
,
x
l
x_{j},x_{k},x_{l}
xj,xk,xl进行线性组合而重构出来,即:
x
i
=
w
i
j
x
j
+
w
i
k
x
k
+
w
i
l
x
l
x_{i}=w_{ij}x_{j}+w_{ik}x_{k}+w_{il}x_{l}
xi=wijxj+wikxk+wilxl。LLE算法希望这种关系在低维空间中得到保持。
算法流程
- 初始化:输入样本集D,设置近邻参数k,低维空间维数d‘
- 找到每个点的k近邻
- 通过 W i = C i − 1 1 k 1 k T C i − 1 1 k W_{i}=\frac{C_{i}^{-1} 1_{k}}{ 1_{k} ^{T} C_{i}^{-1}1_{k}} Wi=1kTCi−11kCi−11k 求解W
- 进而得到M
- 对M进行特征值分解,取最小的前d’个特征值对应的特征向量构成 Z T Z^{T} ZT
度量学习
什么是度量
度量(metric),亦称距离函数,数学概念,是度量空间中满足特定条件的特殊函数,一般用d表示。度量空间也叫做距离空间,是一类特殊的拓扑空间。
为什么需要度量学习
在机器学习中,对高维数据进行降维的主要目的是希望找到一个合适的低维空间,在此空间中进行学习能比原始空间性能更好.事实上,每个空间对应了在样本属性上定义的一个距离度量,而寻找合适的空间,实质上就是在寻找一个合适的距离度量.那么,为何不直接尝试“学习”出一个合适的距离度量呢?这就是度量学习(metric learning)的基本动机.
带参数的距离度量——马氏距离
为什么要带参数的原因:带参数才可以学习,固定不能学习。
马氏距离可以看作是欧氏距离的一种修正,修正了欧式距离中各个维度尺度不一致且相关的问题(即每个维度的距离权重不同)。