机器学习 第十章

目录

一、k近邻学习

二、低维嵌入

三、主成分分析

四、核化线性降维

五、流形学习

1.等度量映射

2.局部线性嵌入

六、度量学习

总结


一、k近邻学习

k近邻(kNN)学习是一种常用的监督学习方法,功作机制为给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个邻居的信息来进行预测。其预测结果在分类任务中采用投票法,在回归任务中使用平均法。

k近邻学习没有显示的训练过程,是懒惰学习著名的代表;在训练阶段对样本进行学习处理的方法叫做急切学习。k近邻分类器的一个示意图如下所示:

其中当k取值不同时,分类的结果会不同;当距离计算方式不同时,分类结果也会有不同。最近邻分类器的泛化错误率不超过贝叶斯最优分类器错误率的两倍。

二、低维嵌入

在高维情形下出现的数据样本稀疏、距离计算困难等问题,是所有机器学习方法面临的共同的困难,叫做维度灾难。

缓解维度灾难的一个方法是降维,也叫维数约简,即通过某种数学变换将原始高维属性空间转换为一个低维子空间,在这个子空间中样本密度得到提高,距离计算也更加的容易。能进行降维的原因在于很多时候,人们观测或收集到的数据样本虽然是高维的,但与学习任务密切相关的也许仅是某个低维分布,即高维空间中一个低维嵌入。

若果要求原始空间中样本之间的距离在低维空间中得以保持,那么就可以得到多维缩放(MDS)降维方法。

假定m个样本在原始空间的距离矩阵为D\in R^{m*m},其中第i行j列的元素dist_{ij}为样本x_ix_j的距离,目标是要获取样本在{d}'维空间的表示Z\in R^{​{d}'*m},{d}'\leq d,且任意两个样本在{d}'维空间中的欧氏距离等于原始空间中的距离,即\left \| z_i-z_j \right \|=dist_{ij}

B=Z^T Z\in R^{m*m},其中B为降维后样本的内积矩阵b_{ij}=z_i^Tz_j,那么可以得到:

dist_{ij}^2=||z_i||^2+||z_j||^2-2z_i^Tz_j=b_{ii}+b_{jj}-2b_{ij}

在令降维后的样本Z中心化,那么矩阵B的行和列之和都为0,可以得到:

\sum_{i=1}^{m}dist_{ij}^2=tr(B)+mb_{jj}

\sum_{j=1}^{m}dist_{ij}^2=tr(B)+mb_{ii}

\sum_{i=1}^{m}\sum_{i=j}^{m}dist_{ij}^2=2m\: tr(B)

联立上述式子可以得到

b_{ij}=-\frac{1}{2}(dist_{ij}^2-dist_{i\cdot }^2-dist_{\cdot j}^2+dist_{\cdot \cdot }^2)

由该式子通过降维前后保持不变的距离矩阵D求取内积矩阵B,在对矩阵B进行特征值分解就可以得到Z。其算法流程为:

 基于线性变换来进行降维的方法叫做线性降维方法,和MDS方法的不同之处在于对低维子空间的性质要求不同。对于降维效果的评估一般是比较降维前后学习器的性能。

三、主成分分析

主成分分析(PCA)是一种常见的降维方法。对于正交属性空间中的样本点,如果要用一个超平面多所有样本进行恰当的表达,那么这个超平面应该具有最近重构性:本点到超平面的距离足够近,即尽可能在超平面附近和最大可分性:样本点在超平面上的投影尽可能地分散开来,即投影后的坐标具有区分性。

基于最近重构性来推导,可以得到主成分分析的优化目标为:

\underset{W}{min} \; \; -tr(W^TXX^TW)\; \; \; s.t.\; W^TW=I

从最大可分性出发,可以得到优化目标为:

\underset{W}{max}\; \; \; tr(W^TXX^TW)\; \; \; s.t.\; \; W^TW=I

 从上述可以知道,最近重构性与最大可分性虽然从不同的出发点来定义优化问题中的目标函数,但最终这两种特性得到了完全相同的优化问题。接着可以使用拉格朗日乘子法得到XX^TW=\lambda W,因此只需对协方差矩阵进行特征值分解即可求解出W。PCA算法的流程如下:

PCA仅需保留W与样本的均值向量即可通过简单的向量减法和矩阵-向量乘法将新样本投影至低维空间中。

四、核化线性降维

线性降维方法假设从高维空间到低维空间的函数映射是线性的,但是在现实任务中,可能需要非线性映射才能找到恰当的低维嵌入。本真低维空间指的是原本采样的低维空间。基于核技巧对线性降维方法进行核化,这是非线性降维常用的方法。

核主成分分析(KPCA)的思想为若核函数的形式已知,即我们知道如何将低维的坐标变换为高维坐标,这时我们只需先将数据映射到高维特征空间,再在高维空间中运用PCA即可。

首先需要获取进行KPCA降维的数据,这里是使用了PCA方法和KPCA方法进行对比,展现数据集的代码为:

# 从sklearn.datasets导入make_circles函数,用于生成二维空间中的分类数据
from sklearn.datasets import make_circles
# 从sklearn.model_selection导入train_test_split函数,用于划分训练集和测试集
from sklearn.model_selection import train_test_split

# 生成1000个样本的数据集,其中factor参数控制两个圆之间的距离,noise参数控制数据的噪声水平
X, y = make_circles(n_samples=1_000, factor=0.3, noise=0.05, random_state=0)
# 将数据集划分为训练集和测试集,stratify参数保证训练集和测试集中各类别的比例与原始数据集相同
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

# 导入matplotlib.pyplot库,用于绘制图形
import matplotlib.pyplot as plt

# 创建两个子图,分别用于展示训练集和测试集
_, (train_ax, test_ax) = plt.subplots(ncols=2, sharex=True, sharey=True, figsize=(8, 4))

# 绘制训练集数据点,使用颜色区分类别
train_ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train)
# 设置坐标轴标签和标题
train_ax.set_ylabel("Feature #1")
train_ax.set_xlabel("Feature #0")
train_ax.set_title("Training data")

# 绘制测试集数据点,同样使用颜色区分类别
test_ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test)
# 设置坐标轴标签和标题
test_ax.set_xlabel("Feature #0")
_ = test_ax.set_title("Testing data")

# 显示图形
plt.show()

其原始数据集为:

 接着就是进行降维操作了,这里的KPCA使用的是RBF内核:

# 导入绘图库
from matplotlib import pyplot as plt
# 导入生成圆形数据集的函数
from sklearn.datasets import make_circles
# 导入划分数据集的函数
from sklearn.model_selection import train_test_split

# 生成1000个样本的圆形数据集,factor参数控制两个圆之间的距离,noise参数控制数据的噪声水平
X, y = make_circles(n_samples=1_000, factor=0.3, noise=0.05, random_state=0)
# 划分数据集为训练集和测试集,stratify参数保证训练集和测试集中各类别的比例与原始数据集相同
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

# 导入PCA和KernelPCA类
from sklearn.decomposition import PCA, KernelPCA

# 创建一个PCA实例,保留所有主成分
pca = PCA(n_components=2)
# 创建一个KernelPCA实例,使用径向基函数(RBF)核,设置核函数的gamma参数,启用逆变换,设置正则化参数alpha
kernel_pca = KernelPCA(
    n_components=None, kernel="rbf", gamma=10, fit_inverse_transform=True, alpha=0.1
)

# 使用PCA对训练数据进行拟合并转换测试数据
X_test_pca = pca.fit(X_train).transform(X_test)
# 使用KernelPCA对训练数据进行拟合并转换测试数据
X_test_kernel_pca = kernel_pca.fit(X_train).transform(X_test)

# 创建一个包含三个子图的图形,用于展示原始数据、PCA投影数据和KernelPCA投影数据
fig, (orig_data_ax, pca_proj_ax, kernel_pca_proj_ax) = plt.subplots(
    ncols=3, figsize=(14, 4)
)

# 绘制原始测试数据
orig_data_ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test)
orig_data_ax.set_ylabel("Feature #1")
orig_data_ax.set_xlabel("Feature #0")
orig_data_ax.set_title("Testing data")

# 绘制PCA投影后的测试数据
pca_proj_ax.scatter(X_test_pca[:, 0], X_test_pca[:, 1], c=y_test)
pca_proj_ax.set_ylabel("Principal component #1")
pca_proj_ax.set_xlabel("Principal component #0")
pca_proj_ax.set_title("Projection of testing data\n using PCA")

# 绘制KernelPCA投影后的测试数据
kernel_pca_proj_ax.scatter(X_test_kernel_pca[:, 0], X_test_kernel_pca[:, 1], c=y_test)
kernel_pca_proj_ax.set_ylabel("Principal component #1")
kernel_pca_proj_ax.set_xlabel("Principal component #0")
_ = kernel_pca_proj_ax.set_title("Projection of testing data\n using KernelPCA")

# 显示图形
plt.show()

结果为:

 

五、流形学习

流形学习是一类借鉴了拓扑流行概念的降维方法,流形是在局部与欧氏空间同胚的空间,即它在局部具有欧氏空间的性质,能用欧氏距离来进行距离计算。

1.等度量映射

等度量映射的出发点是认为低维流形嵌入到高维空间后,直接在高维空间中计算直线距离具有误导性,因为高维空间中的直线距离在低维嵌入流形上是不可达的。因此利用流形在局部上与欧式空间同胚的性质,可以使用近邻距离来逼近测地线距离,即对于一个样本点,它与近邻内的样本点之间是可达的,且距离使用欧式距离计算,这样整个样本空间就形成了一张近邻图,高维空间中两个样本之间的距离就转为最短路径问题。

可采用著名的Dijkstra算法Floyd算法计算最短距离,得到任意两点之间的距离后便可以使用MDS算法来其计算低维空间中的坐标。Isomap算法的流程如下所示:

Isomap仅得到了训练样本在低维空间的坐标,对于新样本是将训练样本的高维空间坐标作为输入、低维空间坐标作为输出,训练一个回归学习器来对新样本的低维空间坐标进行预测。

对近邻图的构建通常可以使用指定近邻点个数或者指定距离阈值\epsilon,距离小于阈值的点被认为是近邻点,得到的近邻图叫做\epsilon近邻图。

2.局部线性嵌入

局部线性嵌入(LEE)试图保持邻域内样本之间的线性关系,假定样本点x_i的坐标可以通过它的邻域样本x_jx_kx_l的坐标通过线性组合来表示,即x_i=w_{ij}x_j+w_{ik}x_k+w_{il}x_l,如下图:

 LEE先根据近邻关系计算出所有样本的邻域重构系数w:

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

 然后根据邻域重构系数不变,去求解低维坐标:

Z=(z_1,z_2,\cdots,z_m)\in \mathbb{R}^{​{d}'*m},(W)_{ij}=w_{ij}

                                        M=(I-W)^T(I-W)

最后可以将优化问题化简为如下的式子:

\underset{z}{min}\; \; tr(ZMZ^T)\; \; \; \; s.t.\; \; ZZ^T=I

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

六、度量学习

 在机器学习中,对高维数据进行降维的主要目的是希望找到一个合适的低维空间,在此空间中进行学习能比原始空间性能更好。度量学习的基本动机是直接学习出一个合适的距离度量。

首先要学习出距离度量必须先定义一个合适的距离度量形式。对两个d维样本x_ix_j,它们之间的平方欧式距离为:

dist_{ed}^{2}(x_{i},x_{j})=||x_{i}-x_{j}||_{2}^{2}=dist_{ij,1}^{2}+dist_{ij,2}^{2}+\cdots+dist_{ij,d}^{2}

若假定不同属性的重要性不同,那么可以引入属性权重w,得到如下的距离表达式:

dist_{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}+\cdots+w_{d}\cdot dist_{ij,d}^{2} =(x_{i}-x_{j})^{T}W(x_{i}-x_{j})

此时各个属性之间都是相互独立无关的,但现实中往往会存在属性之间有关联的情形,比如西瓜的重量和体积两个属性。因此可以将上式的W替换为一个普通的非正定对称矩阵M,可以得到马氏距离:

dist_{mah}^{2}(x_{i},x_{j})=(x_{i}-x_{j})^{T}M(x_{i}-x_{j})=||x_{i}-x_{j}||_{M}^{2}

 M叫做度量矩阵,度量学习就是对M进行学习。对M的学习需要设置一个目标。可以把错误率这样的监督学习的目标作为度量学习的优化目标,其次还可以使用相似性来进行度量。

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值