0

我申请 TSNE 进行降维。我有几个功能,我减少到 2 个功能。之后,我使用 Kmeans 对数据进行聚类。最后,我使用 seaborn 来绘制聚类结果。

要导入 TSNE,我使用:

from sklearn.manifold import TSNE

要申请 TSNE,我使用:

features_tsne_32= TSNE(2).fit_transform(standarized_data)

之后我使用 Kmeans:

kmeans = KMeans(n_clusters=6, **kmeans_kwargs)
kmeans.fit(features_tsne_32)
km_tsne_32 = kmeans.predict(features_tsne_32)

最后,我使用以下方法绘制了情节:

import seaborn as sns

#plot data with seaborn

facet = sns.lmplot(data=df, x='km_tsne_32_c1', y='km_tsne_32_c2', hue='km_tsne_32', 
                       fit_reg=False, legend=True, legend_out=True)

我有这个情节:

在此处输入图像描述

这个图似乎太完美和球形了,我绘制这些数据的过程有问题吗?在上面描述的代码中?

4

3 回答 3

1

您的问题并非特定于 t-SNE,而是任何无监督学习算法。你如何评价它的结果?

我想说,做到这一点的唯一正确方法是,如果您对数据有一些先验知识或专业知识。诸如标签、其他元数据,甚至用户反馈之类的东西。


话虽这么说,关于你的具体情节:

  1. 您从 tSNE 得到一个连续的“馅饼”而不是像“岛屿”或“意大利面条”这样的离散结构这一事实可能表明该投影没有很好地学习。通常 tSNE 应该创建相似数据点的半不同组。这种形状看起来像一个过度法律化的模型。(如具有高 KL 散度系数的 VAE)。
  2. k-Means 产生的分区正是人们所期望的:k-means 的聚类分配隐含地在特征空间上创建了一个 Voronoi 图,其中单元格是聚类的质心。良好的初始化会产生分布在特征空间中的初始质心。由于该空间是对称的,因此质心也可能是对称的。

所以 k-Means 很好,但你可能需要调整 t-SNE 的参数。

于 2021-05-24T15:07:04.817 回答
1

检查 t-SNE 算法的困惑度。当困惑度太小时,t-SNE 经常会产生圆盘状的斑点。此外,使用通常比 k-Means 更好的 DBSCAN 聚类算法进行测试。

于 2021-05-24T16:08:34.240 回答
0

我遵循的程序有问题吗?

是的。

使用 TSNE 将数据投影到另一个您无法真正控制的空间。
这样做应该使近点保持近,远点保持远。

然后在投影空间上使用 KNN来确定组。
这部分丢失了您之前拥有的任何分组信息[需要引用,需要事先查看数据是什么]!

根据一些先前的标记数据对组进行着色会更有意义,而不是根据 KNN
-OR-
在原始空间上使用 KNN 进行分组,然后根据该分组对投影空间进行着色。

你所做的实际上是没有意义的,因为它丢失了所有先前的信息——标签和空间。


总结:

  1. 如果您有标签,请使用它们
  2. 如果不这样做,请使用更复​​杂的聚类算法,从原始空间上的 KNN 开始,因为您可以看到投影空间上的 KNN 是不够的。
于 2021-05-24T14:53:16.550 回答