当我们对数据进行聚类时,我们如何检查 TSNE 结果是否真实?

问题描述

我正在应用 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)

我有这个情节:

enter image description here

这个情节似乎过于完美和球状,这是我绘制的程序有问题 这个数据?在上面描述的代码中?

解决方法

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

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


话虽如此,关于你的具体情节:

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

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

,

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

,

我遵循的程序有问题吗?

是的。

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

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

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

您所做的实际上毫无意义,因为它丢失了所有先验信息 - 标签和空间。


总结:

  1. 如果您有标签,请使用标签
  2. 如果不这样做,请使用更复​​杂的聚类算法,从原始空间上的 KNN 开始,因为您可以看到投影空间上的 KNN 是不够的。