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

目录

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类别标记不同的概率,即:                        P(e r r)=1-\sum_{c \in \mathcal{Y}} P(c \mid \boldsymbol{x}) P(c \mid \boldsymbol{z}) \text {. }        

10.2低维嵌入

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

步骤如下:

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

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

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

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

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

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

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

        

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.最大可分性.样本点在这个超平面上的投影能尽可能分开.
原样本点x_{i}叫与基于投影重构的样本点\hat{x_{i}}向之间的距离为:
        \begin{aligned} \sum_{i=1}^{m}\left\|\sum_{j=1}^{d^{\prime}} z_{i j} \boldsymbol{w}_{j}-\boldsymbol{x}_{i}\right\|_{2}^{2} & =\sum_{i=1}^{m} \boldsymbol{z}_{i}{ }^{\mathrm{T}} \boldsymbol{z}_{i}-2 \sum_{i=1}^{m} \boldsymbol{z}_{i}{ }^{\mathrm{T}} \mathbf{W}^{\mathrm{T}} \boldsymbol{x}_{i}+\text { const } \\ & \propto-\operatorname{tr}\left(\mathbf{W}^{\mathrm{T}}\left(\sum_{i=1}^{m} \boldsymbol{x}_{i} \boldsymbol{x}_{i}^{\mathrm{T}}\right) \mathbf{W}\right) . \end{aligned}
下面是关于PCA算法的实验代码及分析结果:
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)实验代码及分析结果。
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算法的实验代码和分析结果:
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算法的实验代码及分析结果:

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维样本x_{i}x_{j},它们之间的平方欧氏距离可写为:

\operatorname{dist}_{\text {ed }}^{2}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right\|_{2}^{2}=\text { dist }_{i j, 1}^{2}+\text { dist }_{i j, 2}^{2}+\ldots+\text { dist }_{i j, d}^{2}

        其中dist_{ij,k}表示 Xi , Xj 在第k  维上的距离.
\begin{aligned} \operatorname{dist}_{\text {wed }}^{2}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right) & =\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right\|_{2}^{2}=w_{1} \cdot d i s t_{i j, 1}^{2}+w_{2} \cdot d i s t_{i j, 2}^{2}+\ldots+w_{d} \cdot d i s t_{i j, d}^{2} \\ & =\left(\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right)^{\mathrm{T}} \mathbf{W}\left(\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right) \end{aligned}
        各个属性之间都是相互独立无关的,但现实中往往会存在属性之间有关联的情形,比如西瓜的重量和体积两个属性。因此可以将上式的W替换为一个普通的非正定对称矩阵M,可以得到马氏距离:
         \operatorname{dist}_{\text {mah }}^{2}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\left(\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right)^{\mathrm{T}} \mathbf{M}\left(\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right)=\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right\|_{\mathbf{M}}^{2},

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值