瑞士卷与瑞士洞降维

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验在经典的瑞士卷数据集上比较了两种流行的非线性降维技术,局部线性嵌入(Locally Linear Embedding,LLE)和T分布随机邻域嵌入(t-SNE)。我们将探讨它们如何处理数据中添加的一个洞。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向Labby提问。课程结束后提供反馈,我们会及时为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/datasets -.-> lab-49313{{"瑞士卷与瑞士洞降维"}} ml/sklearn -.-> lab-49313{{"瑞士卷与瑞士洞降维"}} end

生成瑞士卷数据集

我们首先使用 sklearn.datasets 中的 make_swiss_roll() 函数生成瑞士卷数据集。此函数生成一个呈螺旋形状的三维数据集。

import matplotlib.pyplot as plt
from sklearn import manifold, datasets

sr_points, sr_color = datasets.make_swiss_roll(n_samples=1500, random_state=0)

可视化瑞士卷数据集

我们可以使用三维散点图来可视化生成的瑞士卷数据集,不同颜色代表不同的点。

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
fig.add_axes(ax)
ax.scatter(sr_points[:, 0], sr_points[:, 1], sr_points[:, 2], c=sr_color, s=50, alpha=0.8)
ax.set_title("Swiss Roll in Ambient Space")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)

计算瑞士卷数据集的局部线性嵌入(LLE)和t-SNE嵌入

我们分别使用 sklearn 中的 manifold.locally_linear_embedding()manifold.TSNE() 函数来计算瑞士卷数据集的局部线性嵌入(LLE)和t-SNE嵌入。

sr_lle, sr_err = manifold.locally_linear_embedding(sr_points, n_neighbors=12, n_components=2)

sr_tsne = manifold.TSNE(n_components=2, perplexity=40, random_state=0).fit_transform(sr_points)

可视化瑞士卷数据集的局部线性嵌入(LLE)和t-SNE嵌入

我们可以使用散点图来可视化瑞士卷数据集的局部线性嵌入(LLE)和t-SNE嵌入,不同颜色代表不同的点。

fig, axs = plt.subplots(figsize=(8, 8), nrows=2)
axs[0].scatter(sr_lle[:, 0], sr_lle[:, 1], c=sr_color)
axs[0].set_title("LLE Embedding of Swiss Roll")
axs[1].scatter(sr_tsne[:, 0], sr_tsne[:, 1], c=sr_color)
_ = axs[1].set_title("t-SNE Embedding of Swiss Roll")

生成瑞士洞数据集

我们通过在 make_swiss_roll() 函数中使用 hole=True 参数给瑞士卷数据集添加一个洞来生成瑞士洞数据集。

sh_points, sh_color = datasets.make_swiss_roll(n_samples=1500, hole=True, random_state=0)

可视化瑞士洞数据集

我们可以使用三维散点图来可视化生成的瑞士洞数据集,不同颜色代表不同的点。

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
fig.add_axes(ax)
ax.scatter(sh_points[:, 0], sh_points[:, 1], sh_points[:, 2], c=sh_color, s=50, alpha=0.8)
ax.set_title("Swiss-Hole in Ambient Space")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)

计算瑞士洞数据集的局部线性嵌入(LLE)和t-SNE嵌入

我们分别使用 sklearn 中的 manifold.locally_linear_embedding()manifold.TSNE() 函数来计算瑞士洞数据集的局部线性嵌入(LLE)和t-SNE嵌入。

sh_lle, sh_err = manifold.locally_linear_embedding(sh_points, n_neighbors=12, n_components=2)

sh_tsne = manifold.TSNE(n_components=2, perplexity=40, init="random", random_state=0).fit_transform(sh_points)

可视化瑞士洞数据集的局部线性嵌入(LLE)和t-SNE嵌入

我们可以使用散点图来可视化瑞士洞数据集的局部线性嵌入(LLE)和t-SNE嵌入,其中不同颜色代表不同的点。

fig, axs = plt.subplots(figsize=(8, 8), nrows=2)
axs[0].scatter(sh_lle[:, 0], sh_lle[:, 1], c=sh_color)
axs[0].set_title("LLE Embedding of Swiss-Hole")
axs[1].scatter(sh_tsne[:, 0], sh_tsne[:, 1], c=sh_color)
_ = axs[1].set_title("t-SNE Embedding of Swiss-Hole")

总结

本实验比较了经典瑞士卷数据集和瑞士洞数据集的局部线性嵌入(LLE)和t-SNE嵌入。我们使用散点图可视化了数据集及其嵌入。我们观察到,LLE能够有效地展开瑞士卷和瑞士洞数据集,而t-SNE保留了数据的总体结构,但倾向于将部分点聚集在一起。