目录
10.1k近邻学习
K近邻学习是一种简单的监督学习算法,用于分类和回归任务。其基本步骤如下:
-
训练阶段:存储训练数据及其标签,没有显式的训练过程。
-
预测阶段:
- 对于每个待预测的数据点,计算它与所有训练数据点的距离。
- 选择距离最近的K个邻居。
- 对这些K个邻居的标签进行投票(分类)或计算均值(回归),得到最终的预测结果。
给定测试样本 x,若其最近邻样本为z 则最近邻分类器出错的概率就是x与z类别标记不同的概率,即:
10.2低维嵌入
在高维情形下出现的数据样本稀疏、 距离计算困难等问是所有机器学习方法共同面的严重障碍, 被称为" 维数灾难"。缓解维数灾难的一个重要途径是降维,"多维缩放" ( MDS) 是经典的降维方法 ,下面做个简单的介绍:
步骤如下:
-
计算距离矩阵:计算数据点之间的相似度或距离,通常使用欧氏距离或其他度量方式,得到一个距离矩阵。
-
中心化距离矩阵:通过对距离矩阵进行中心化,得到一个双中心化的矩阵,通常用来消除均值影响。计算方法涉及对距离矩阵进行矩阵变换。
-
特征分解:对中心化的距离矩阵进行特征值分解,得到特征值和特征向量。
-
选择维度:根据需要选择前k个最大的特征值及其对应的特征向量。k是目标低维空间的维度。
-
构建低维坐标:利用选择的特征向量和特征值构建低维坐标,得到数据点在低维空间的表示。
-
可视化与分析:将低维数据可视化,用于进一步分析数据的结构和模式。
下面是关于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_)
分析:
-
降维可视化:
散点图展示了通过 MDS 降维得到的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助我们观察降维后的数据结构和类别分布。
-
解释的应力(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_))
分析:
-
降维可视化:散点图展示了通过 PCA 降维到二维后的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助我们观察降维后的数据分布。
-
解释的方差比率:
pca.explained_variance_ratio_
输出了每个主成分所解释的方差比例,表明每个主成分对总方差的贡献程度。np.cumsum(pca.explained_variance_ratio_)
输出了累计解释方差的比例,用于了解前几个主成分能够解释的总方差比例。 -
数据标准化:在应用 PCA 之前,对数据进行标准化处理,以确保每个特征的均值为0,方差为1。这是因为 PCA 对特征的尺度敏感。
-
PCA应用:将数据降维到2维空间,以便可视化和分析。
-
结果可视化:帮助观察不同类别的数据在二维主成分空间中的分布情况。
-
解释的方差:提供了降维后主成分的解释能力,帮助评估降维的效果和选择适当的主成分数量。
该代码展示了如何使用 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)))
分析:
分析结果:
-
降维可视化:
散点图展示了通过 KPCA 降维到二维后的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助我们观察降维后的数据分布。
-
解释的方差比率(近似值):
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])
分析:
-
降维可视化:
散点图展示了通过 Isomap 降维到二维后的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助我们观察降维后的数据分布。
-
Isomap 嵌入的形状:
X_isomap.shape
显示了降维后的数据的形状,即(n_samples, n_components)
,在这里是(150, 2)
,表示有150个样本,降维到2个主成分。 -
降维后的数据样本:
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])
分析:
-
降维可视化:
散点图展示了通过 LLE 降维到二维后的结果。不同的颜色表示不同的鸢尾花品种(类别),帮助观察降维后的数据在低维空间中的分布情况。
-
LLE 嵌入的形状:
X_lle.shape
显示了降维后的数据的形状,即(n_samples, n_components)
,在这里是(150, 2)
,表示有150个样本,降维到2个主成分。 -
降维后的数据样本:
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。