机器学习——第十章 降维与度量学习

目录

10.1 k近邻学习

10.2 低维嵌入

 10.3 主成分分析

10.4 核化线性降维

10.5 流形学习

10.5.1 等度量映射(Isomap)

10.5.2 局部线性嵌入(LLE)

10.6 度量学习 

代码:鸢尾花数据集PCA降维


10.1 k近邻学习

        \(k\)近邻学习是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。

        通常,在分类任务中可使用“投票法”,即选择这k个样本中出现最多的类别标记作为预测结果;在回归任务中可使用“平均法”,即将这k个样本的实值输出标记的平均值作为预测结果;还可基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。

        \(k\)近邻学习涉及到三个主要因素:\(k\)的大小,距离或相似度的度量,以及特征归一化。\(k\)的大小决定了近邻范围和投票权重,距离或相似度的度量决定了如何判断两个实例之间的接近程度,特征归一化决定了各个特征对距离或相似度计算的影响。这些因素都需要根据具体问题和数据集来选择合适的方法和参数。

10.2 低维嵌入

         \(k\)近邻学习是基于“密采样”假设——任意测试样本\(x\)附近任意小的δ距离范围内总能找到一个训练样本,即训练样本的采样密度足够大。然而,这个假设在现实中很难满足,假设δ = 0.001,就意味着至少要有1000个样本点平均分布在归一化后的属性取值范围内,才能保证任意测试样本在其附近的0.001距离范围内总能找到一个训练样本,而这只是属性维数为1的情况,如果属性维数更大不仅需要的样本数会变多,同时高维空间会给距离计算带来很大的困难。所以有时我们需要通过降维来缓解维数灾难,也就是通过某种数学变换将原始高维属性空间转变为一个低维“子空间”,在这个子空间中样本密度大幅提高,而距离计算也变得更为容易。 

        

        多维缩放方法,Multiple Dimensional Scaling(MDS),多维缩放的原理是:给定样本两两间距离/不相似度,如何获得样本的表示,使得样本间距离/不相似度和给定的一致。从降维角度,就是低维空间的样本间距离/不相似度要和高维空间样本间距离/不相似度基本一致。 

        假定m个样本在原始空间中任意两两样本之间的距离矩阵为\(D\in \mathbb{R}^{m\times m}\),我们的目标便是获得样本在低维空间中的表示\(Z\in \mathbb{R}^{{d}\times m'}\),且任意两个样本在低维空间中的欧式距离等于原始空间中的距离,即\(\|z_{i}-z_{j}\|=dist_{ij}\)。因此接下来我们要做的就是根据已有的距离矩阵D来求解出降维后的坐标矩阵Z。

        令\(\mathbf{B}=\mathbf{Z}^{\mathrm{T}}\mathbf{Z}\in\mathbb{R}^{m\times m}\),其中B 为降维后样本的内积矩阵, \(b_{ij}=z_{i}^{\mathrm{T}}z_{j}\) 有

\(\begin{gathered}
dist_{ij}^{2} =\|z_{i}\|^{2}+\|z_{j}\|^{2}-2z_{i}^{\mathrm{T}}z_{j} \\
=b_{ii}+b_{jj}-2b_{ij} . 
\end{gathered}\)

多维缩放的过程可以分为以下几个步骤:

  1. 计算高维空间中样本之间的距离矩阵D,其中\(D_{ij}\)表示第i个样本和第j个样本之间的距离,通常为欧氏距离。这一步是为了获得样本之间的相似度或不相似度的信息,作为降维的依据。
  2. 对距离矩阵D进行中心化处理,得到内积矩阵B,其中\(B_{ij}\)表示第i个样本和第j个样本之间的内积。中心化处理的公式为\(B=-\frac12HDH\),其中 H 是中心化矩阵\(H=I-\frac1n 11^T\),I是单位矩阵,1是全1向量。这一步是为了消除样本的均值影响,使得样本在低维空间中也是零均值的,方便后续的特征值分解。
  3. 对内积矩阵B进行特征值分解,得到\(B=V\Lambda V^T\),其中\(\Lambda\)是对角矩阵,对角线上是特征值;V是特征向量矩阵,每一列是一个特征向量。这一步是为了找到样本在低维空间中的最优表示,即最大化样本间的方差。
  4. 取前d个最大的特征值以及对应的特征向量,构成\(\Lambda_d\) 和\(V_d\),其中\(\Lambda_d\) 是d阶对角矩阵,\(V_d\)是\(n \times d\)矩阵。这一步是为了选择合适的降维目标维度d ,并保留最重要的特征向量。
  5. 计算降维后的数据矩阵\(Z = V_d \Lambda_d^{1/2}\),其中Z是\(n \times d\)矩阵,每一行是一个样本在低维空间中的坐标。这一步是为了得到样本在低维空间中的具体坐标,使得样本间距离或相似度不变。

 10.3 主成分分析

        主成分分析(PCA)是一种最常用的降维算法,它的主要思想是将n维特征映射到k维上,这k维是全新的正交特征,也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。

        PCA的数学定义是:一个正交化线性变换,把数据变换到一个新的坐标系统中,使得这一数据的任何投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。

  PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。

步骤如下:

  1. 组织数据集:假设有m个n维数据样本组成一个、\(m \times n\)矩阵X。
  2. 计算均值:对每一个特征求平均值,并将所有样本减去各自特征的平均值。
  3. 计算协方差矩阵:协方差矩阵是一个对称矩阵,它描述了不同特征之间的相关性。协方差矩阵可以通过样本矩阵乘以其转置除以样本数减一得到,即\(\frac{1}{m-1} \mathbf{W}\mathbf{W}^T\)。
  4. 求协方差矩阵的特征值和特征向量:协方差矩阵是一个实对称矩阵,它可以被正交对角化为\(Q\Sigma Q^{-1}\)的形式,其中Q是由特征向量组成的正交矩阵,\(\Sigma\)是由特征值组成的对角矩阵。
  5. 选择主成分:根据特征值从大到小排序,选择前k个最大的特征值所对应的特征向量组成一个矩阵P。
  6. 得到降维后的数据:将原始数据矩阵X乘以P得到降维后的数据矩阵Y。

最近重构性与最大可分性 

        主成分分析的目的是找到一个低维的超平面,使得原始数据在这个超平面上的投影能够尽可能地保留原始数据的信息。这个信息可以从两个方面来衡量:最近重构性和最大可分性。

  • 最近重构性:重构后的样本映射回原空间,与原样本的距离都足够的近。也就是说,PCA要求投影后的数据能够用最小的误差来近似原始数据。这个误差可以用样本点到投影超平面的距离来表示,因此,最近重构性可以转化为一个最小化距离平方和的优化问题。
  • 最大可分性:样本在这个超平面上的投影尽可能分开。也就是说,PCA要求投影后的数据能够有最大的方差,以反映原始数据的差异性。这个方差可以用投影后数据的协方差矩阵来表示,因此,最大可分性可以转化为一个最大化协方差矩阵迹的优化问题。

        假定数据样本进行了中心化,即\(\sum x_i=0\),再假定投影变换后得到的新坐标系为\(\{w_1,w_2,...,w_d\}\),若丢弃新坐标系中的部分坐标,即将维度降低到\(d^{\prime}<d\),则样本点\(x_i\)在低维坐标系中的投影是\(z_{i}=(z_{i1};z_{i2};...;z_{id^{\prime}})\),其中\(z_{ij} = w_j^T x_i\)是\(x_i\)在低维坐标系下第j维的坐标,如果基于\(z_i\)来重构\(x_i\),则会得到\overline{x}_i = \sum_{j=1}^{d'} z_{ij} w_j 。

        考虑整个训练集,原样本点\(x_i\)与基于投影重构的样本点\overline{x}_{i}之间的距离为

\(\begin{aligned}&\sum_{i=1}^m\left\|\sum_{j=1}^{d'}z_{ij}w_j-x_i\right\|_2^2=\sum_{i=1}^mz_i^Tz_i-2\sum_{i=1}^mz_i^T\mathbf{W}^Tx_i+const\propto-tr(\mathbf{W}^T(\sum_{i=1}^mx_ix_i^T)\mathbf{W})\end{aligned}\)

        根据最近重构性,上述式子需要最小化,则得到了如下的结果,也是主成分分析的优化目标 

\(\begin{aligned}&\min_\mathbf{W}-tr(\mathbf{W}^T\mathbf{X}\mathbf{X}^T\mathbf{W})\\&s.t.\mathbf{W}^T\mathbf{W}=\mathbf{I}\end{aligned}\)

        根据最大可分性,若所有样本点的投影尽可能分开,则应该使投影后样本点的方差最大化,如下图所示。于是可以对协方差矩阵\(\mathbf{X}\mathbf{X}^T\)进行特征值分解,将求得的特征值排序:\(\lambda_1\geqslant\lambda_2\geqslant...\geqslant\lambda_d\),再取前\({d^{\prime}}\)个特征值对应的特征向量构成\(\mathbf{W}^{*}=(w_{1},w_{2},...,w_{d^{\prime}})\),这就是主成分分析的解。 

10.4 核化线性降维

        现实任务中可能需要非线性映射来找到恰当的低维嵌入,如下图所示,样本点从二维空间中的矩形区域采样后以S形曲面嵌入到三维空间,若直接使用线性降维方法对三维空间观察到的样本点进行降维,则将失去原本的低维结构。为了对“原本采样的”低维空间与降维后的低维空间加以区别,我们称前者为“本真”低维空间,而非线性降维的一种常用方法,是基于核技巧对线性降维方法进行“核化”。 

        若核函数的形式已知,即我们知道如何将低维的坐标变换为高维坐标,这时我们只需先将数据映射到高维特征空间,再在高维空间中运用PCA即可。但是一般情况下,我们并不知道核函数具体的映射规则,例如:Sigmoid、高斯核等,我们只知道如何计算高维空间中的样本内积,这时就引出了KPCA的一个重要创新之处:即空间中的任一向量,都可以由该空间中的所有样本线性表示。证明过程也十分简单:

\(\left(\sum_{i=1}^mz_iz_i^\mathrm{T}\right)\mathbf{W}=\lambda\mathbf{W}\)

\(\begin{aligned}
\mathbf{W}& =\frac{1}{\lambda}\left(\sum_{i=1}^{m}\boldsymbol{z}_{i}\boldsymbol{z}_{i}^{\mathrm{T}}\right)\mathbf{W}=\sum_{i=1}^{m}\boldsymbol{z}_{i}\frac{\boldsymbol{z}_{i}^{\mathrm{T}}\mathbf{W}}{\lambda} \\
&=\sum_{i=1}^{m}z_{i}\alpha_{i} ,
\end{aligned}\)

10.5 流形学习

        流形学习(manifold learning)是一种非线性降维技术,它基于这样一个假设:高维空间中的数据实际上是由一个低维流形映射到高维空间上的。流形是高维空间中的几何结构,可以看作是低维空间中曲线或曲面在高维空间中的推广。流形学习的目的是找到一个合适的映射函数,将高维空间中的数据投影到低维流形上,从而保留数据的内在结构和特征。流形学习有很多应用,例如数据可视化,数据压缩,数据生成,特征提取等。流形学习的典型算法有局部线性嵌入(LLE),拉普拉斯特征映射(LE),局部保持投影(LPP),等距映射(ISOMAP)等。

10.5.1 等度量映射(Isomap)

        等度量映射的基本出发点是:高维空间中的直线距离具有误导性,因为有时高维空间中的直线距离在低维空间中是不可达的。因此利用流形在局部上与欧式空间同胚的性质,可以使用近邻距离来逼近测地线距离,即对于一个样本点,它与近邻内的样本点之间是可达的,且距离使用欧式距离计算,这样整个样本空间就形成了一张近邻图,高维空间中两个样本之间的距离就转为最短路径问题。可采用著名的Dijkstra算法或Floyd算法计算最短距离,得到高维空间中任意两点之间的距离后便可以使用MDS算法来其计算低维空间中的坐标。

Isomap算法流程如下图: 

 对于近邻图的构建,常用的有两种方法:

指定近邻点个数,像kNN一样选取k个最近的邻居;

指定邻域半径,距离小于该阈值的被认为是它的近邻点。

但两种方法均会出现下面的问题: 

邻域范围指定过大,则会造成“短路问题”,即本身距离很远却成了近邻,将距离近的那些样本扼杀在摇篮。
邻域范围指定过小,则会造成“断路问题”,即有些样本点无法可达了,整个世界村被划分为互不可达的小部落。

10.5.2 局部线性嵌入(LLE)

        不同于Isomap算法去保持邻域距离,LLE算法试图去保持邻域内的线性关系,假定样本xi的坐标可以通过它的邻域样本线性表出:

\(x_{i}=w_{ij}x_{j}+w_{ik}x_{k}+w_{il}x_{l}\)

LLE算法:

第一步根据近邻关系计算出所有样本的邻域重构系数w

(\begin{aligned}\min_{\boldsymbol{w}_{1},\boldsymbol{w}_{2},...,\boldsymbol{w}_{m}}&\sum_{i=1}^{m}\left\|\boldsymbol{x}_{i}-\sum_{j\in Q_{i}}w_{ij}\boldsymbol{x}_{j}\right\|_{2}^{2}\\\mathrm{s.t.}&\sum_{j\in\boldsymbol{Q}_{i}}w_{ij}=1,\end{aligned}\)

其中\(x_i\)和\(x_j\)均为己知,令\(C_{jk}=(\boldsymbol{x}_i-\boldsymbol{x}_j)^\mathrm{T}(\boldsymbol{x}_i-\boldsymbol{x}_k), w_{ij}\) ,\(w_{ij}\)有闭式解 

\(w_{ij}=\frac{\sum_{k\in Q_i}C_{jk}^{-1}}{\sum_{l,s\in Q_i}C_{ls}^{-1}}\)

接着根据邻域重构系数不变,去求解低维坐标

 \(\min_{z_1,z_2,...,z_m}\sum_{i=1}^m\left\|z_i-\sum_{j\in Q_i}w_{ij}z_j\right\|_2^2\)

 \(\text{令 }\mathbf{Z}=(\boldsymbol{z}_{1},\boldsymbol{z}_{2},\ldots,\boldsymbol{z}_{m})\in\mathbb{R}^{d^{\prime}\times m}, (\mathbf{W})_{ij}=w_{ij}\\\mathbf{M}=(\mathbf{I}-\mathbf{W})^{\mathrm{T}}(\mathbf{I}-\mathbf{W})\)

 这样利用矩阵M,优化问题可以重写为:

\(\begin{array}{c}\min_{\mathbf{Z}} \mathrm{tr}(\mathbf{ZMZ}^{\mathrm{T}})\\\\\mathrm{s.t.} \mathbf{ZZ}^{\mathrm{T}}=\mathbf{I} \end{array}\)

M 最小的d' 个特征值对应的特征向量组成的矩阵即为\(Z^T\)

LLE算法的具体流程如下图所示:

10.6 度量学习 

        度量学习是一种从数据中学习一种度量数据对象间距离的方法,它的目的是使得在学得的距离度量下,相似对象间的距离小,不相似对象间的距离大。度量学习可以用于数据分类,聚类,检索,可视化等任务。

        对两个d 维样本\(x_i\)和\(x_j\),它们之间的平方欧氏距离可写为

\(\mathrm{dist}_{\mathrm{ed}}^2(\boldsymbol{x}_i,\boldsymbol{x}_j)=||\boldsymbol{x}_i-\boldsymbol{x}_j||_2^2=dist_{ij,1}^2+dist_{ij,2}^2+\ldots+dist_{ij,d}^2\)

         若各个属性重要程度不一样即都有一个权重,则得到加权的平方欧式距离:

\(\begin{aligned}
\mathrm{dist}_{\mathrm{wed}}^{2}(x_{i},x_{j})& =||x_{i}-x_{j}||_{2}^{2}=w_{1}\cdot dist_{ij,1}^{2}+w_{2}\cdot dist_{ij,2}^{2}+\ldots+w_{d}\cdot dist_{ij,d}^{2} \\
&=(x_{i}-x_{j})^{\mathrm{T}}\mathbf{W}(x_{i}-x_{j})
\end{aligned}\)

        此时各个属性之间都是相互独立无关的,但现实中往往会存在属性之间有关联的情形,例如:身高和体重,一般人越高,体重也会重一些,他们之间存在较大的相关性。这样计算距离就不能分属性单独计算,于是就引入经典的马氏距离(Mahalanobis distance):

\(\mathrm{dist}_{\mathrm{mah}}^2(\boldsymbol{x}_i,\boldsymbol{x}_j)=(\boldsymbol{x}_i-\boldsymbol{x}_j)^\mathrm{T}\mathbf{M}(\boldsymbol{x}_i-\boldsymbol{x}_j)=\|\boldsymbol{x}_i-\boldsymbol{x}_j\|_\mathbf{M}^2\)

标准的马氏距离中M是协方差矩阵的逆,马氏距离是一种考虑属性之间相关性且尺度无关(即无须去量纲)的距离度量。 

  深度度量学习是一种结合了深度学习和度量学习的方法,它可以从原始数据中自动地学习高质量的特征表示,并利用激活函数来捕捉数据的非线性特征。深度度量学习主要由三个方面组成:样本挖掘,模型结构和损失函数。样本挖掘是指从数据集中选择合适的样本对或三元组来训练模型,使得模型能够从难分辨的样本中学习更多的信息。模型结构是指使用深度神经网络来提取数据的特征向量,常见的模型结构有孪生网络和三元组网络²。损失函数是指定义模型优化的目标函数,常见的损失函数有对比损失,三元组损失,N-pair损失等。

        降维是将原高维空间嵌入到一个合适的低维子空间中,接着在低维空间中进行学习任务;度量学习则是试图去学习出一个距离度量来等效降维的效果,两者都是为了解决维数灾难带来的诸多问题。

代码:鸢尾花数据集PCA降维

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import decomposition
from sklearn import datasets
 
# 设置随机种子以保证结果可重复
np.random.seed(5)
 
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
 
# 创建图形对象并设置其大小
fig = plt.figure(1, figsize=(4, 3))
plt.clf()
# 创建3D坐标轴对象并设置其位置和视角
ax = Axes3D(fig, rect=[0, 0, 0.95, 1], elev=48, azim=134)
 
plt.cla()
print(X)
# 使用KernelPCA和PCA进行降维
kernels = ['linear', 'poly', 'rbf', 'sigmoid']
pca1 = decomposition.KernelPCA(n_components=3, kernel='sigmoid')
pca2 = decomposition.PCA(n_components=3)
X = pca1.fit_transform(X)
print(X)
X = pca2.fit_transform(X)
print(X)
 
# 为每个类别添加标签
for name, label in [("Setosa", 0), ("Versicolour", 1), ("Virginica", 2)]:
    ax.text3D(
        X[y == label, 0].mean(),
        X[y == label, 1].mean() + 1.5,
        X[y == label, 2].mean(),
        name,
        horizontalalignment="center",
        bbox=dict(alpha=0.5, edgecolor="w", facecolor="w"),
    )
# 重新排列标签
y = np.choose(y, [1, 2, 0]).astype(float)
# 绘制散点图
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.nipy_spectral, edgecolor="k")
# 设置坐标轴标签
ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
 
# 显示图形
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值