在本文中,将探讨两种流行的流形学习技术:T-distributed Stochastic Neighbor Embedding(简称t-SNE)和Locally Linear Embedding(简称LLE),并使用经典的Swiss Roll数据集来展示它们的效果。接着,将分析在数据集中添加空洞时这两种技术的表现。
首先,使用Python的matplotlib和sklearn库来生成Swiss Roll数据集。这个数据集是一个三维空间中的曲线,形状类似于瑞士卷。
import matplotlib.pyplot as plt
from sklearn import datasets, manifold
# 生成Swiss Roll数据集
n_samples = 1500
random_state = 0
sr_points, sr_color = datasets.make_swiss_roll(n_samples=n_samples, random_state=random_state)
# 可视化数据
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(sr_points[:,0], sr_points[:,1], sr_points[:,2], c=sr_color, s=50, alpha=0.8)
ax.set_title("Swiss Roll在原始空间")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)
通过上述代码,得到了Swiss Roll数据集,并在三维空间中对其进行了可视化。接下来,将使用LLE和t-SNE技术对数据进行降维处理,并比较它们的效果。
首先对Swiss Roll数据集应用LLE和t-SNE降维技术。LLE技术能够有效地将Swiss Roll展开,而t-SNE虽然能够保持数据的总体结构,但在表示原始数据的连续性方面表现不佳,有时会不必要地将数据点聚集在一起。
# 应用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)
# 可视化降维结果
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降维的Swiss Roll")
axs[1].scatter(sr_tsne[:,0], sr_tsne[:,1], c=sr_color)
_ = axs[1].set_title("t-SNE降维的Swiss Roll")
通过上述代码,得到了Swiss Roll数据集的LLE和t-SNE降维结果,并进行了可视化。可以看到,LLE技术在展开Swiss Roll时表现良好,而t-SNE虽然在保持数据总体结构方面表现不错,但在连续性方面存在一定的问题。
接下来,将在Swiss Roll数据集中添加一个空洞,并使用LLE和t-SNE技术对新的Swiss-Hole数据集进行降维处理。
# 生成Swiss-Hole数据集
sh_points, sh_color = datasets.make_swiss_roll(n_samples=n_samples, hole=True, random_state=random_state)
# 可视化Swiss-Hole数据
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(sh_points[:,0], sh_points[:,1], sh_points[:,2], c=sh_color, s=50, alpha=0.8)
ax.set_title("Swiss-Hole在原始空间")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)
通过上述代码,生成了Swiss-Hole数据集,并在三维空间中对其进行了可视化。接下来,将使用LLE和t-SNE技术对Swiss-Hole数据集进行降维处理,并比较它们的效果。
对Swiss-Hole数据集应用LLE和t-SNE降维技术。LLE技术能够有效地展开数据并保持空洞,而t-SNE虽然在保持数据总体结构方面表现不错,但同样存在将数据点不必要聚集的问题。
# 应用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)
# 可视化降维结果
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降维的Swiss-Hole")
axs[1].scatter(sh_tsne[:,0], sh_tsne[:,1], c=sh_color)
_ = axs[1].set_title("t-SNE降维的Swiss-Hole")
通过上述代码,得到了Swiss-Hole数据集的LLE和t-SNE降维结果,并进行了可视化。可以看到,LLE技术在展开Swiss-Hole时表现良好,并且能够保持空洞,而t-SNE虽然在保持数据总体结构方面表现不错,但在连续性方面存在一定的问题。
通过对比LLE和t-SNE在Swiss Roll和Swiss-Hole数据集上的表现,发现t-SNE在参数调整方面有很大的潜力,通过更精细的参数调整,可能会得到更好的结果。此外,观察到t-SNE在处理真实世界数据时通常比LLE表现得更好。