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

目录

10.1k近邻学习

10.2低维嵌入

10.3主成分分析

10.4核化线性降维

10.5流形学习

10.5.1等度量学习

10.5.2局部线性嵌入

10.6度量学习


10.1k近邻学习

K近邻学习是一种简单的监督学习算法,用于分类和回归任务。其基本步骤如下:

  1. 训练阶段:存储训练数据及其标签,没有显式的训练过程。

  2. 预测阶段

    • 对于每个待预测的数据点,计算它与所有训练数据点的距离。
    • 选择距离最近的K个邻居。
    • 对这些K个邻居的标签进行投票(分类)或计算均值(回归),得到最终的预测结果。

给定测试样本 x,若其最近邻样本为z 则最近邻分类器出错的概率就是x与z类别标记不同的概率,即:

10.2低维嵌入

在高维情形下出现的数据样本稀疏、 距离计算困难等问是所有机器学习方法共同面的严重障碍, 被称为" 维数灾难"。缓解维数灾难的一个重要途径是降维,"多维缩放" ( MDS) 是经典的降维方法 ,下面做个简单的介绍:

步骤如下:

  1. 计算距离矩阵:计算数据点之间的相似度或距离,通常使用欧氏距离或其他度量方式,得到一个距离矩阵。

  2. 中心化距离矩阵:通过对距离矩阵进行中心化,得到一个双中心化的矩阵,通常用来消除均值影响。计算方法涉及对距离矩阵进行矩阵变换。

  3. 特征分解:对中心化的距离矩阵进行特征值分解,得到特征值和特征向量。

  4. 选择维度:根据需要选择前k个最大的特征值及其对应的特征向量。k是目标低维空间的维度。

  5. 构建低维坐标:利用选择的特征向量和特征值构建低维坐标,得到数据点在低维空间的表示。

  6. 可视化与分析:将低维数据可视化,用于进一步分析数据的结构和模式。

下面是关于MDS算法的实验代码及分析结果:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import MDS
from sklearn.datasets import load_iris
from sklearn.metrics import pairwise_distances

# 加载示例数据
data = load_iris()
X = data.data
labels = data.target

# 计算距离矩阵
dist_matrix = pairwise_distances(X)

# 应用 MDS
mds = MDS(n_components=2, dissimilarity='precomputed', random_state=42)
X_mds = mds.fit_transform(dist_matrix)

# 结果可视化
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_mds[:, 0], X_mds[:, 1], c=labels, cmap='viridis', edgecolor='k', s=50)
plt.colorbar(scatter, label='Class Label')
plt.title('MDS Projection of Iris Dataset')
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.show()

# 输出分析结果
print("Explained stress:", mds.stress_)

分析:

  1. 降维可视化

    散点图展示了通过 MDS 降维得到的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助我们观察降维后的数据结构和类别分布。

  2. 解释的应力(Stress)

    mds.stress_ 输出了应力值,这是衡量低维空间距离与原始距离矩阵一致性的指标。较低的应力值表示更好的维度缩放效果。

距离矩阵 :通过 pairwise_distances 计算所有数据点对之间的距离。

MDS应用:将距离矩阵作为输入,降维到2维空间。

结果可视化:帮助直观理解数据在低维空间的分布情况。

该代码通过 MDS 将高维数据降维至二维,并可视化了不同类别的数据点,以便分析数据在低维空间中的关系和结构。

实验结果:

10.3主成分分析

主成分分析 (PCA)是最常用的一种降维方法,对于正交属性空间中的样本点,若存在这样的超平面,则具有这样的性质:
1.最近重构性:样本点到这个超平面的距离都足够近;
2.最大可分性.样本点在这个超平面上的投影能尽可能分开.
原样本点叫与基于投影重构的样本点向之间的距离为:


下面是关于PCA算法的实验代码及分析结果:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

# 加载示例数据
data = load_iris()
X = data.data
y = data.target
feature_names = data.feature_names

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 应用 PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 结果可视化
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolor='k', s=50)
plt.colorbar(scatter, label='Class Label')
plt.title('PCA Projection of Iris Dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

# 输出分析结果
print("Explained variance ratio:", pca.explained_variance_ratio_)
print("Cumulative explained variance ratio:", np.cumsum(pca.explained_variance_ratio_))

分析:

  1. 降维可视化:散点图展示了通过 PCA 降维到二维后的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助我们观察降维后的数据分布。

  2. 解释的方差比率pca.explained_variance_ratio_ 输出了每个主成分所解释的方差比例,表明每个主成分对总方差的贡献程度。 np.cumsum(pca.explained_variance_ratio_) 输出了累计解释方差的比例,用于了解前几个主成分能够解释的总方差比例。

  3. 数据标准化:在应用 PCA 之前,对数据进行标准化处理,以确保每个特征的均值为0,方差为1。这是因为 PCA 对特征的尺度敏感。

  4. PCA应用:将数据降维到2维空间,以便可视化和分析。

  5. 结果可视化:帮助观察不同类别的数据在二维主成分空间中的分布情况。

  6. 解释的方差:提供了降维后主成分的解释能力,帮助评估降维的效果和选择适当的主成分数量。

该代码展示了如何使用 PCA 降维并可视化数据,从中可以分析数据在低维空间中的结构以及主成分对总方差的贡献。

实验结果:

10.4核化线性降维

线性阵维方法假设从 维空间到低维空间的函数映射是线性的,然而,在不少现实任务中,可能需要非线性映射才能找到恰当的低维嵌入。


下面我们以核主成分分析 (Kerne li zed PCA ,简 KPCA)实验代码及分析结果。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import KernelPCA
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

# 加载示例数据
data = load_iris()
X = data.data
y = data.target

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 应用 Kernel PCA
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=0.5)  # 使用径向基函数核
X_kpca = kpca.fit_transform(X_scaled)

# 结果可视化
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_kpca[:, 0], X_kpca[:, 1], c=y, cmap='viridis', edgecolor='k', s=50)
plt.colorbar(scatter, label='Class Label')
plt.title('Kernel PCA Projection of Iris Dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

# 输出分析结果
print("Explained variance ratio (approximation):", np.var(X_kpca, axis=0) / np.sum(np.var(X_kpca, axis=0)))

分析:

分析结果:

  1. 降维可视化

    散点图展示了通过 KPCA 降维到二维后的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助我们观察降维后的数据分布。

  2. 解释的方差比率(近似值)

    np.var(X_kpca, axis=0) / np.sum(np.var(X_kpca, axis=0)) 计算了降维后的各主成分的方差比率,尽管 KPCA 并不直接提供解释的方差比率,这种近似方法可用于评估主成分的相对重要性。

数据标准化:对数据进行标准化,以确保每个特征的均值为0,方差为1,这是进行 KPCA 的常见预处理步骤。

KPCA应用:使用径向基函数(RBF)核将数据映射到高维空间,然后进行降维到2维。

结果可视化:帮助观察不同类别的数据在二维主成分空间中的分布情况。

解释的方差(近似值):计算降维后每个主成分的方差比率,以了解它们在表示数据变异性方面的贡献。

通过 KPCA,我们可以捕捉到数据中的非线性结构,使得降维后的数据在低维空间中能够更好地分离不同的类别。

实验结果:

10.5流形学习

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

10.5.1等度量学习

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

比较经典的是Isomap算法:


下面是Isomap算法的实验代码和分析结果:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import Isomap
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

# 加载示例数据
data = load_iris()
X = data.data
y = data.target

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 应用 Isomap
isomap = Isomap(n_components=2, n_neighbors=5)  # 设置降维到2维,选择5个邻居
X_isomap = isomap.fit_transform(X_scaled)

# 结果可视化
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_isomap[:, 0], X_isomap[:, 1], c=y, cmap='viridis', edgecolor='k', s=50)
plt.colorbar(scatter, label='Class Label')
plt.title('Isomap Projection of Iris Dataset')
plt.xlabel('Component 1')
plt.ylabel('Component 2')
plt.show()

# 输出分析结果
print("Isomap embedding shape:", X_isomap.shape)
print("First few samples of Isomap-transformed data:\n", X_isomap[:5])

分析:

  1. 降维可视化

    散点图展示了通过 Isomap 降维到二维后的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助我们观察降维后的数据分布。

  2. Isomap 嵌入的形状

    X_isomap.shape 显示了降维后的数据的形状,即 (n_samples, n_components),在这里是 (150, 2),表示有150个样本,降维到2个主成分。

  3. 降维后的数据样本

    X_isomap[:5] 打印了前5个样本的降维结果,帮助检查 Isomap 算法的输出。

数据标准化:对数据进行标准化,以确保每个特征的均值为0,方差为1,这样可以避免由于特征尺度不同对降维结果造成的影响。

Isomap应用:将数据从高维空间映射到低维空间,选择了5个邻居来构建邻接图。Isomap 是一种非线性降维技术,可以揭示数据的流形结构。

结果可视化:通过散点图观察降维后的数据分布情况,了解不同类别在低维空间中的分布。

输出信息:提供降维后的数据形状和部分样本的值,以便分析和验证结果。

Isomap 通过保持数据在高维空间中的局部距离关系,使得降维后的数据在低维空间中仍能较好地保留数据的几何结构,从而对数据进行有效的降维和可视化。

实验结果:

10.5.2局部线性嵌入

局部线性嵌入图保持邻域内样本之间的线性关系。比较经典的运用是LLE算法

下面是LLE算法的实验代码及分析结果:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import LocallyLinearEmbedding
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

# 加载示例数据
data = load_iris()
X = data.data
y = data.target

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 应用 LLE
lle = LocallyLinearEmbedding(n_components=2, n_neighbors=5)  # 设置降维到2维,选择5个邻居
X_lle = lle.fit_transform(X_scaled)

# 结果可视化
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_lle[:, 0], X_lle[:, 1], c=y, cmap='viridis', edgecolor='k', s=50)
plt.colorbar(scatter, label='Class Label')
plt.title('LLE Projection of Iris Dataset')
plt.xlabel('Component 1')
plt.ylabel('Component 2')
plt.show()

# 输出分析结果
print("LLE embedding shape:", X_lle.shape)
print("First few samples of LLE-transformed data:\n", X_lle[:5])

分析:

  1. 降维可视化

    散点图展示了通过 LLE 降维到二维后的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助观察降维后的数据在低维空间中的分布情况。

  2. LLE 嵌入的形状

    X_lle.shape 显示了降维后的数据的形状,即 (n_samples, n_components),在这里是 (150, 2),表示有150个样本,降维到2个主成分。

  3. 降维后的数据样本

    X_lle[:5] 打印了前5个样本的降维结果,帮助检查 LLE 算法的输出。

数据标准化:对数据进行标准化,使每个特征的均值为0,方差为1,这样可以避免由于特征尺度不同对降维结果造成的影响。

LLE应用:LLE 是一种非线性降维技术,通过保持每个点的局部邻域的线性结构来实现降维。选择5个邻居来构建局部结构。

结果可视化:通过散点图展示降维后的数据,观察不同类别在低维空间中的分布情况,评估 LLE 的效果。

输出信息:提供降维后的数据形状和部分样本的值,以便分析和验证结果。

LLE 算法通过保留数据的局部结构,能够揭示数据的流形结构,从而在低维空间中有效地表示原数据的复杂性。

实验结果:

10.6度量学习

对两个 d维样本,它们之间的平方欧氏距离可写为:


其中表示 Xi , Xj 在第k 维上的距离.

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

其中M亦称"度量矩阵",而度量学习则是对M进行学习。注意到为了保持距离非负且对称,M 必须是(半)正定对称矩阵,即必有正交基P使得M能写为

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

相关推荐
世人万千丶1 小时前
鸿蒙日志体系高级应用:HiLog分级输出/隐私脱敏/远程日志采集/线上问题精准溯源方案
学习·harmonyos·鸿蒙
奔跑中的小象1 小时前
统信UOS + 天数AI卡部署SGLang服务手册
人工智能·uos·sglang·天数智芯
DevSecOps选型指南1 小时前
中国版Mythos,为何是悬镜安全灵脉CodeAI?
人工智能·安全
Shockang2 小时前
LangGraph 状态机实战
人工智能
刹那芳华19922 小时前
循环神经网络的从零开始实现(RNN)
人工智能·rnn·深度学习
阿童木写作2 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
科技之门2 小时前
AI3D从建模到贴图、绑骨和动画的完整流程怎么做?V2Fun完整工作流指南
人工智能·3d·贴图
宇宙第一小趴菜2 小时前
二、机器学习的应用领域和发展史
人工智能·机器学习
前端开发江鸟2 小时前
我写过 MCP Server,却一直以为 MCP 只有 Tool
人工智能
天国梦2 小时前
自习室智能化升级避坑指南:天学网AI智习室方案实测与选型建议
大数据·人工智能