流形学习方法比较

流形学习是一种非线性降维技术,它基于数据集的维度往往人为地被高估这一理念。通过各种算法,可以将数据从高维空间映射到低维空间,同时尽量保持数据点之间的相对距离。本文将介绍几种流形学习方法,并在S曲线数据集上进行比较。

S曲线数据集的生成

首先,生成一个S曲线数据集。这个数据集包含了1500个样本点,每个点在三维空间中的位置由S曲线方程确定。还定义了一些辅助函数,用于后续的可视化展示。

import matplotlib.pyplot as plt import mpl_toolkits.mplot3d from matplotlib import ticker from sklearn import datasets, manifold n_samples = 1500 S_points, S_color = datasets.make_s_curve(n_samples, random_state=0)

通过定义的辅助函数,可以在三维空间中绘制原始的S曲线样本点。

流形学习算法的实现

流形学习算法的目标是在低维空间中找到一个数据的表示,使得这个表示中点之间的距离尽可能地反映原始高维空间中的距离。与线性降维方法不同,流形学习方法不寻求在低维空间中对数据进行各向同性的表示。

局部线性嵌入可以被看作是一系列局部主成分分析,这些分析在全球范围内进行比较,以找到最佳的非线性嵌入。使用不同的方法来实现LLE,包括标准方法、局部切空间对齐、Hessian特征映射和修改后的LLE。

n_neighbors = 12 n_components = 2 lle_standard = manifold.LocallyLinearEmbedding(method="standard", n_neighbors=n_neighbors, n_components=n_components) S_standard = lle_standard.fit_transform(S_points)

为每种LLE方法绘制了二维散点图,以展示降维效果。

等距映射是一种非线性降维方法,它通过保持点之间的测地线距离来寻找低维嵌入。

isomap = manifold.Isomap(n_neighbors=n_neighbors, n_components=n_components, p=1) S_isomap = isomap.fit_transform(S_points)

通过二维散点图,可以观察到等距映射在S曲线数据集上的效果。

多维尺度分析旨在找到一个低维数据表示,其中的距离能够很好地反映原始高维空间中的距离。

md_scaling = manifold.MDS(n_components=n_components, max_iter=50, n_init=4, random_state=0) S_scaling = md_scaling.fit_transform(S_points)

MDS的二维散点图展示了数据点在降维后的位置关系。

谱嵌入使用拉普拉斯特征映射,通过图拉普拉斯的谱分解来找到数据的低维表示。

spectral = manifold.SpectralEmbedding(n_components=n_components, n_neighbors=n_neighbors, random_state=42) S_spectral = spectral.fit_transform(S_points)

谱嵌入的二维散点图显示了S曲线数据集在降维后的结构。

t-SNE将数据点之间的相似性转换为联合概率,并尝试最小化低维嵌入和高维数据之间的Kullback-Leibler散度。由于t-SNE的成本函数不是凸的,不同的初始化可能导致不同的结果。

t_sne = manifold.TSNE(n_components=n_components, perplexity=30, init="random", max_iter=250, random_state=0) S_t_sne = t_sne.fit_transform(S_points)

t-SNE的二维散点图为提供了S曲线数据集在降维后的视觉表示。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485