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

目录

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。

相关推荐
Charles Ray17 分钟前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
m0_6090004226 分钟前
向日葵好用吗?4款稳定的远程控制软件推荐。
运维·服务器·网络·人工智能·远程工作
我要吐泡泡了哦1 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1231 小时前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
开MINI的工科男1 小时前
深蓝学院-- 量产自动驾驶中的规划控制算法 小鹏
人工智能·机器学习·自动驾驶
AI大模型知识分享2 小时前
Prompt最佳实践|如何用参考文本让ChatGPT答案更精准?
人工智能·深度学习·机器学习·chatgpt·prompt·gpt-3
贾saisai3 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫3 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
张人玉4 小时前
人工智能——猴子摘香蕉问题
人工智能
草莓屁屁我不吃4 小时前
Siri因ChatGPT-4o升级:我们的个人信息还安全吗?
人工智能·安全·chatgpt·chatgpt-4o