流形学习算法应用示例

流形学习是一种非线性降维技术,它旨在在低维空间中保持数据点之间的相对距离。这种技术特别适用于那些在高维空间中线性不可分的数据集。在本页面中,将探讨如何使用不同的流形学习方法来处理S曲线数据集,并可视化其结果。

数据集准备

首先,需要生成S曲线数据集。S曲线是一个非线性结构,非常适合用来展示流形学习算法的效果。使用Python的matplotlib库来生成数据,并定义了一些辅助函数来帮助进行后续的可视化。

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D 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) def plot_3d(points, points_color, title): fig, ax = plt.subplots(figsize=(6, 6), facecolor="white", tight_layout=True, subplot_kw={"projection": "3d"}) fig.suptitle(title, size=16) col = ax.scatter(x, y, z, c=points_color, s=50, alpha=0.8) ax.view_init(azim=-60, elev=9) ax.xaxis.set_major_locator(ticker.MultipleLocator(1)) ax.yaxis.set_major_locator(ticker.MultipleLocator(1)) ax.zaxis.set_major_locator(ticker.MultipleLocator(1)) fig.colorbar(col, ax=ax, orientation="horizontal", shrink=0.6, aspect=60, pad=0.01) plt.show() def plot_2d(points, points_color, title): fig, ax = plt.subplots(figsize=(3, 3), facecolor="white", constrained_layout=True) fig.suptitle(title, size=16) add_2d_scatter(ax, points, points_color) plt.show() def add_2d_scatter(ax, points, points_color, title=None): x, y = points.T ax.scatter(x, y, c=points_color, s=50, alpha=0.8) ax.set_title(title) ax.xaxis.set_major_formatter(ticker.NullFormatter()) ax.yaxis.set_major_formatter(ticker.NullFormatter())

以上代码定义了三个函数:plot_3d用于绘制3D散点图,plot_2d用于绘制2D散点图,add_2d_scatter是plot_2d的一个辅助函数,用于添加散点图。首先使用plot_3d函数来查看原始的S曲线数据。

流形学习算法

流形学习算法基于这样一个观点:许多数据集的维度只是人为地高。这些算法试图找到一个低维表示,使得数据点之间的距离能够很好地反映原始高维空间中的距离。

局部线性嵌入可以被看作是一系列局部的主成分分析,它们在全球范围内进行比较,以找到最佳的非线性嵌入。定义了几种不同的LLE方法,并在S曲线数据集上应用它们。

n_neighbors = 12 n_components = 2 lle_standard = manifold.LocallyLinearEmbedding(method="standard", n_neighbors=n_neighbors, n_components=n_components, eigen_solver="auto", random_state=0) S_standard = lle_standard.fit_transform(S_points) lle_ltsa = manifold.LocallyLinearEmbedding(method="ltsa", n_neighbors=n_neighbors, n_components=n_components, eigen_solver="auto", random_state=0) S_ltsa = lle_ltsa.fit_transform(S_points) lle_hessian = manifold.LocallyLinearEmbedding(method="hessian", n_neighbors=n_neighbors, n_components=n_components, eigen_solver="auto", random_state=0) S_hessian = lle_hessian.fit_transform(S_points) lle_mod = manifold.LocallyLinearEmbedding(method="modified", n_neighbors=n_neighbors, n_components=n_components, eigen_solver="auto", random_state=0) S_mod = lle_mod.fit_transform(S_points) fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(7, 7), facecolor="white", constrained_layout=True) fig.suptitle("Locally Linear Embeddings", size=16) lle_methods = [ ("Standard locally linear embedding", S_standard), ("Local tangent space alignment", S_ltsa), ("Hessian eigenmap", S_hessian), ("Modified locally linear embedding", S_mod), ] for ax, method in zip(axs.flat, lle_methods): name, points = method add_2d_scatter(ax, points, S_color, name) plt.show()

上述代码展示了如何在S曲线数据集上应用四种不同的局部线性嵌入方法。使用plot_2d函数来可视化每种方法的结果。

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

isomap = manifold.Isomap(n_neighbors=n_neighbors, n_components=n_components, p=1) S_isomap = isomap.fit_transform(S_points) plot_2d(S_isomap, S_color, "Isomap Embedding")

等距映射的结果通过plot_2d函数进行了可视化。

多维缩放(MDS)旨在找到一个低维表示,使得数据点之间的距离能够很好地反映原始高维空间中的距离。

md_scaling = manifold.MDS(n_components=n_components, max_iter=50, n_init=4, random_state=0, normalized_stress=False) S_scaling = md_scaling.fit_transform(S_points) plot_2d(S_scaling, S_color, "Multidimensional scaling")

多维缩放的结果同样通过plot_2d函数进行了可视化。

谱嵌入是一种非线性降维方法,它使用图拉普拉斯的谱分解来找到数据的低维表示。

spectral = manifold.SpectralEmbedding(n_components=n_components, n_neighbors=n_neighbors, random_state=42) S_spectral = spectral.fit_transform(S_points) plot_2d(S_spectral, S_color, "Spectral Embedding")

谱嵌入的结果通过plot_2d函数进行了可视化。

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) plot_2d(S_t_sne, S_color, "T-distributed Stochastic Neighbor Embedding")

t-SNE的结果通过plot_2d函数进行了可视化。

脚本总运行时间

  • 手写数字上的流形学习:局部线性嵌入,等距映射...
  • 在切割的球面上的流形学习方法
  • 可视化股票市场结构
  • 瑞士卷和瑞士洞的降维
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485