机器学习西瓜书笔记(十) 第十章降维与度量学习+代码

降维与度量学习

10.1 k近邻学习

k近邻(简称kNN)学习是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的K个训练样本,然后基于这k个"邻居"的信息来进行预测。通常,在分类任务中可使用"投票法",即选择这k个样本中出现最多的类别标记作为预测结果,在回归任务中可使用"平均法",即将这k个样本的实值输出标记的平均值作为预测结果;还可基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。

与前面介绍的学习方法相比,k近邻学习有一个明显的不同之处。 它似乎没有显式的训练过程!事实上,它是"懒惰学习"的著名代表,此类学习技术在训练阶段仅仅是把样本保存起来,训练时间开销为零,待收到测试样本后再进行处理;相应的,那些在训练阶段就对样本进行学习处理的方法,称为"急切学习"。

图10.1给出了K近邻分类器的一个示意图显然,k是一个重要参数,当K取不同值时,分类结果会有显著不同另一方面,若采用不匠的距离计算方式,则找出的"近邻"可能有显著差别,从而也会导致分类结果有显著不同。

暂且假设距离计算是 “恰当 " 的,即能够恰当地找出K个近邻,来对"最近邻分类器” (1NN,即k=1)在二分类问题上的性能做一个简单的讨论。
在这里插入图片描述

在这里插入图片描述

小结

K近邻学习是一种基于实例的学习方法,它通过测量不同特征值之间的距离来预测新数据点的分类。在这种方法中,算法会考虑数据集中与新数据点最近的K个训练样本,然后根据这些最近邻居的已知标签来决定新数据点的标签。通常,如果大多数邻居属于某个类别,新数据点就会被归为那个类别。这种方法简单直观,但计算效率和准确性可能会受到数据维度和规模的影响。

10.2 低纬嵌入

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

小结

低维嵌入是一种数据降维技术,它旨在将高维数据映射到低维空间中,同时尽量保留原始数据的重要结构和特征。通过这种方式,可以更有效地进行数据分析和可视化,因为低维空间通常更容易理解和处理。常见的低维嵌入方法包括主成分分析(PCA)、t-SNE和自编码器等,它们通过不同的数学策略来优化数据在低维空间中的表示,以便于后续的机器学习任务或直观展示。

10.3 主成成分分析

主成分分析(称PCA)是最常用的一种降维方法在介绍PCA之前,不妨先考虑这样一个问题:对于正交属性空间中的样本点如何用一个超平面(直线的高维推广)对所有样本进行恰当的表达?

容易想到若存在这样的超平面,那么它大概应具有这样的性质:

  • 最近重构性:样本点到这个超平面的距离都足够近;
  • 最大可分性:样本点在这个超平面上的投影能尽可能分开;

有趣的是,基于最近重构性和最大可分性,能分别得到主成分分析的两种等价推导。先从最近重构性来推导
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

小结

主成分分析(PCA)是一种统计方法,用于通过正交变换将一组可能相关的变量转换为一组线性不相关的变量,这些变量称为主成分。PCA的目标是减少数据的维度,同时尽可能保留原始数据的变异性。它通过找到数据中的主要方向,即方差最大的方向,来实现这一点。在这些主方向上,数据的变化最大,因此可以认为这些方向捕捉了数据中最重要的信息。通过选择前几个主成分,PCA可以有效地压缩数据,同时去除噪声和冗余,这在数据预处理、特征提取和可视化中非常有用。

10.4 核化线性降维

线性降维方法假设从高维空间到低维空间的函数映射是线性的,然而,在不少现实任务中,可能需要非线性映射才能找到恰当的低维嵌入,下图给出一个例子,样本点从二维空间中的矩形区域采样后以S形曲面嵌入到三维空间,若直接使用线性降维方法对三维空间观察到的样本点进行降维,则将丢失原本的低维结构。为了对"原本采样的"低维空间与降维后的低维空间加以区别,称前者为本真低维空间。
在这里插入图片描述

非线性降维的一种常用方法,是基于核技巧对线性降维方法进行"核化"。下面以核主成分分析(KPCA)例来进行演示。
在这里插入图片描述

小结

核化线性降维是一种数据降维技术,它通过将数据映射到高维特征空间来实现线性降维的效果。在高维空间中,原本在原始低维空间中线性不可分的数据可能变得线性可分。这种方法通常涉及到使用核函数,如高斯核或多项式核,来计算数据点在高维空间中的内积,而无需显式地执行映射。核化线性降维能够捕捉数据的非线性结构,使得在高维空间中应用线性方法变得可能,从而在降维的同时保留数据的关键特征,这对于复杂数据集的分析和可视化尤其有用。

10.5流形学习

流形学习是一类借鉴了拓扑流形概念的降维方法"流形"是在局部与欧氏空间同胚的空间,换言之,它在局部具有欧氏空间的性质能用欧氏距离来进行距离计算。这给降维方法带来了很大的启发:若低维流形嵌入到高维空间中,则数据样本在高维空间的分布虽然看上去非常复杂,但在局部上仍具有欧氏空间的性质,因此,可以容易地在局部建立降维映射关系,然后再设法将局部映射关系推广到全局。当维数被降至二维或三维时,能对数据进行可视化展示,因此流形学习也可被用于可视化。本节介绍两种著名的流形学习方法

10.5.1等度量映射

等度晕映射(简称Isomap)的基本出发点,是认为低维流形嵌入到高维空间之后,直接在高维空间中计算直线距离具有误导性,因为高维空间中的直线距离在低维嵌入流形上是不可达的如下图(a)所示,低维嵌入流形上两点间的距离是"测地线"距离:想象一只虫子从一点爬到另—点,如果它不能脱离曲面行走,那么下图(a)中的红色曲线是距离最短的路径,即S曲面上的测地线,测地线距离是两点之间的本真距离显然,直接在高维空间中计算直线距离是不恰当的。
在这里插入图片描述

那么,如何计算测地线距离呢?这时可利用流形在局部上与欧氏空间
同胚这个性质对每个点基于欧氏距离找出其近邻点然后就能建立一个近邻连接图,图中近邻点之间存在连接,而非近邻点之间不存在连接,于是,计算两点之间测地线距离的问题,就转变为计算近邻连接图上两点之间的最短路径问题。从上图(b)可看出,基于近邻距离逼近能获得低维流形上测地线距离很好的近似。

在近邻连接图上计算两点间的最短路径,可采用著名的Dijkstra算法或Floyd算法,在得到任意两点的距离之后,就可通过10.2节介绍的MDS方法来获得样本点在低维空间中的坐标。下图给出了Isomap算法描述。
在这里插入图片描述

需注意的是,Isomap仅是得到了训练样本在低维空间的坐标,对于新样本,如何将其映射到低维空间呢?这个问题的常用解决方案,是将训练样本的高维空间坐标作为输入、低维空间坐标作为输出,训练一个回归学习器来对新样本的低维空间坐标进行预测。这显然仅是一个权宜之计,但目前似乎并没有更好的办法。

对近邻图的构建通常有两种做法,一种是指定近邻点个数,例如欧氏距离最近的K个点为近邻点,这样得到的近邻图称为K近邻图;另一种是指定距离阙值E,距离小于d的点被认为是近邻点,这样得到的近邻图称为c近邻图两种方式均有不足,例如若近邻范围指定得较大,则距离很远的点可能被误认为近邻,这样就出现"短路"问题,近邻范围指定得较小,则图中有些区域可能与其他区域不存在连接,这样就出现"断路"问题。短路与断路都会给后续的最短路径计算造成误导

10.5.2局部线性嵌入

与Isomap试图保持近邻样本之间的距离不同,局部线性嵌入(简称LLE)试图保持邻域内样本之间的线性关系。
在这里插入图片描述

在这里插入图片描述

小结

流形学习是一种数据降维技术,它假设高维数据点实际上是低维流形上的点的映射,这些流形嵌入在高维空间中。流形学习的目标是发现并提取这些低维流形的结构,以便能够在低维空间中有效地表示和分析数据。通过保持数据点之间的局部邻域关系,流形学习方法能够揭示数据的内在几何结构,这对于理解数据的组织方式和进行有效的数据可视化非常有价值。常见的流形学习方法包括局部线性嵌入(LLE)、等距映射(Isomap)和t-分布随机邻域嵌入(t-SNE),它们各自采用不同的策略来近似和映射数据的流形结构。

10.6 度量学习

在机器学习中,对高维数据进行降维的主要目的是希望找到一个合适的低维空间,在此空间中进行学习能比原始空间性能更好。事实上,每个空间对应了在样本属性上定义的一个距离度量,而寻找合适的空间,实质上就是在寻找一个合适的距离度量。那么,为何不直接尝试"学习"出一个合适的距离度量呢?这就是度量学习(metriclearning)的基本动机。

欲对距离度量进行学习,必须有一个便于学习的距离度量表达形式。9.3节给出了很多种距离度鼠的表达式,但它们都是"固定的"、没有可调节的参数,因此不能通过对数据样本的学习来加以改善。为此,我们先来做一个推广。
在这里插入图片描述

式(33)中的W可通过学习确定,但我们还能再往前走一步:W的非对角元素均为零,这意味着坐标轴是正交的,即属性之间无关;但现实问题中往往不是这样,例如考虑西瓜的"重量"和"体积"这两个属性,它们显然是正相关的,其对应的坐标轴不再正交。为此将式(10.33)中的W替换为一个普通的半正定对称矩阵M,于是就得到了马氏距离:
在这里插入图片描述

对M进行学习当然要设置一个目标假定我们是希望提高近邻分类器的性能,则可将M直接嵌入到近邻分类器的评价指标中去,通过优化该性能指标相应地求得M.下面我们以近邻成分分析(NOA)为例进行讨论。

近邻分类器在进行判别时通常使用多数投票法,邻域中的每个样本投1票,邻域外的样本投0票。不妨将其替换为概率投票法。对于任意样本 x j x_j xj,它对 x i x_i xi分类结果影响的概率为
在这里插入图片描述

在这里插入图片描述

10.7 代码

PCA

Iris数据集代表了3种鸢尾花(Setosa、Versicour和Virginica),具有4个属性:萼片长度、萼片宽度、花瓣长度和花瓣宽度。

应用于此数据的主成分分析(PCA)确定了数据中方差最大的属性组合(主成分或特征空间中的方向)。在这里,我们绘制了2个第一主成分上的不同样本。

线性判别分析(LDA)试图识别类之间差异最大的属性。特别是,与PCA相比,LDA是一种使用已知类标签的监督方法。

import matplotlib.pyplot as plt

from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

iris = datasets.load_iris()

X = iris.data
y = iris.target
target_names = iris.target_names

pca = PCA(n_components=2)
X_r = pca.fit(X).transform(X)

lda = LinearDiscriminantAnalysis(n_components=2)
X_r2 = lda.fit(X, y).transform(X)

# Percentage of variance explained for each components
print(
    "explained variance ratio (first two components): %s"
    % str(pca.explained_variance_ratio_)
)

plt.figure()
colors = ["navy", "turquoise", "darkorange"]
lw = 2

for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(
        X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=0.8, lw=lw, label=target_name
    )
plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.title("PCA of IRIS dataset")

plt.figure()
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(
        X_r2[y == i, 0], X_r2[y == i, 1], alpha=0.8, color=color, label=target_name
    )
plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.title("LDA of IRIS dataset")

plt.show()

在这里插入图片描述

流形学习

from collections import OrderedDict
from functools import partial
from time import time

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import NullFormatter

from sklearn import manifold, datasets

# Next line to silence pyflakes. This import is needed.
Axes3D

n_points = 1000
X, color = datasets.make_s_curve(n_points, random_state=0)
n_neighbors = 10
n_components = 2

# Create figure
fig = plt.figure(figsize=(15, 8))
fig.suptitle("Manifold Learning with %i points, %i neighbors"
             % (1000, n_neighbors), fontsize=14)

# Add 3d scatter plot
ax = fig.add_subplot(251, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)
ax.view_init(4, -72)

# Set-up manifold methods
LLE = partial(manifold.LocallyLinearEmbedding,
              n_neighbors, n_components, eigen_solver='auto')

methods = OrderedDict()
methods['LLE'] = LLE(method='standard')
methods['LTSA'] = LLE(method='ltsa')
methods['Hessian LLE'] = LLE(method='hessian')
methods['Modified LLE'] = LLE(method='modified')
methods['Isomap'] = manifold.Isomap(n_neighbors, n_components)
methods['MDS'] = manifold.MDS(n_components, max_iter=100, n_init=1)
methods['SE'] = manifold.SpectralEmbedding(n_components=n_components,
                                           n_neighbors=n_neighbors)
methods['t-SNE'] = manifold.TSNE(n_components=n_components, init='pca',
                                 random_state=0)

# Plot results
for i, (label, method) in enumerate(methods.items()):
    t0 = time()
    Y = method.fit_transform(X)
    t1 = time()
    print("%s: %.2g sec" % (label, t1 - t0))
    ax = fig.add_subplot(2, 5, 2 + i + (i > 3))
    ax.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Spectral)
    ax.set_title("%s (%.2g sec)" % (label, t1 - t0))
    ax.xaxis.set_major_formatter(NullFormatter())
    ax.yaxis.set_major_formatter(NullFormatter())
    ax.axis('tight')

plt.show()

在这里插入图片描述

10.8 总结

本章是关于降维与度量学习的一个概述,涵盖了多种降维技术及其原理。以下是对每个部分的简要总结和澄清:

  • k近邻(kNN):一种基于实例的学习算法,通过查找测试样本最近的k个训练样本来进行预测。在分类中使用投票法,在回归中使用平均法或加权方法。

  • 低维嵌入:将高维数据映射到低维空间的技术,目的是保留数据的重要结构和特征,便于分析和可视化。

  • 主成分分析(PCA):通过正交变换将变量转换为一组线性不相关的变量,以减少数据维度同时保留数据变异性。

  • 核化线性降维:通过映射到高维特征空间来实现线性降维效果,使用核函数来处理非线性可分数据。

  • 流形学习:基于拓扑流形概念的降维方法,假设数据点是低维流形在高维空间的映射,旨在发现并提取低维流形的结构。

  • 等度量映射(Isomap):通过计算测地线距离来保持近邻样本间的距离,适用于低维流形嵌入到高维空间的情况。

  • 局部线性嵌入(LLE):保持邻域内样本间的线性关系,与Isomap不同,它关注的是局部线性结构。

  • 度量学习:直接学习一个合适的距离度量,以提高学习性能。通过优化性能指标来学习距离度量,如近邻成分分析(NOA)。

  • 代码:这部分提供了使用Python和scikit-learn库进行主成分分析(PCA)和线性判别分析(LDA)的示例代码,以及流形学习的示例代码,包括LLE、Isomap、t-SNE等方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我喝AD钙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值