t-SNE(t-distributed Stochastic Neighbor Embedding)是一种非线性降维技术,广泛应用于数据可视化领域。本文将探讨不同困惑度(perplexity)参数对t-SNE结果的影响。困惑度是t-SNE算法中的一个重要参数,它影响着数据点之间的相似度计算,进而影响降维后数据的分布和聚类效果。
在t-SNE中,困惑度参数的取值范围通常在5到50之间。困惑度值较小时,算法更倾向于保持数据点之间的局部结构,但可能导致全局结构的丢失;而困惑度值较大时,算法更注重保持数据点之间的全局结构,但可能会模糊局部细节。因此,选择合适的困惑度值对于获得有意义的数据可视化结果至关重要。
为了直观展示困惑度参数的影响,使用两个经典的数据集:同心圆和S曲线。通过改变困惑度参数,观察t-SNE降维后数据点的分布和聚类效果。实验结果表明,随着困惑度值的增加,同心圆数据集的聚类效果逐渐变得清晰,但聚类的大小和距离会略有变化。而对于S曲线数据集,即使在较大的困惑度值下,t-SNE降维后的形状也会与原始的S曲线拓扑结构产生较大的偏差。
此外,还使用了一个2D均匀网格数据集来进一步验证困惑度参数的影响。实验结果表明,对于不同的困惑度值,t-SNE降维后的数据点分布和聚类效果存在明显差异。这些实验结果表明,困惑度参数对于t-SNE的聚类和可视化效果具有重要影响,选择合适的困惑度值对于获得有意义的数据可视化结果至关重要。
为了更深入地理解t-SNE算法及其参数的影响,可以参考这篇文章。它详细讨论了t-SNE算法的工作原理、参数选择以及如何通过交互式图表来探索不同参数对结果的影响。通过学习这篇文章,可以更好地理解t-SNE算法,并在实际应用中选择合适的参数以获得最佳的可视化效果。
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets
from matplotlib.ticker import NullFormatter
# 生成同心圆数据集
X, y = datasets.make_circles(n_samples=150, factor=0.5, noise=0.05, random_state=0)
red = y == 0
green = y == 1
# 设置画布和子图
fig, subplots = plt.subplots(3, 5, figsize=(15, 8))
perplexities = [5, 30, 50, 100]
# 对每个困惑度值进行t-SNE降维并绘制结果
for i, perplexity in enumerate(perplexities):
tsne = TSNE(n_components=2, init='random', random_state=0, perplexity=perplexity, max_iter=300)
Y = tsne.fit_transform(X)
print(f"circles, perplexity={perplexity} in {time.time() - t0:.2g} sec")
ax = subplots[0][i + 1]
ax.set_title(f"Perplexity={perplexity}")
ax.scatter(Y[red, 0], Y[red, 1], c="r")
ax.scatter(Y[green, 0], Y[green, 1], c="g")
ax.xaxis.set_major_formatter(NullFormatter())
ax.yaxis.set_major_formatter(NullFormatter())
plt.axis("tight")
plt.show()
以上代码展示了如何使用t-SNE对同心圆数据集进行降维,并根据不同的困惑度值绘制降维后的数据点分布。通过调整困惑度参数,可以观察到不同参数设置下t-SNE降维效果的变化。