当我们聚类数据时,我们如何检查 TSNE 结果是否真实?
How we can check if TSNE results are real when we cluster data?
我正在申请 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)
我有这个情节:
这个情节似乎过于完美和球状我按照情节进行的程序有问题
这个数据?在上面描述的代码中?
Is something wrong with the procedure I follow?
是的。
使用 TSNE 将数据投影到另一个 space,您无法真正控制它。
这样做应该使近点保持近点,远点保持远点。
然后您在投影 space 上使用 KNN 来确定组。
这部分丢失了您之前拥有的任何分组信息[需要引用,需要事先查看数据]!
根据一些先前标记的数据而不是根据 KNN
为组着色更有意义
-或-
在原始 space 上使用 KNN 进行分组,然后根据该分组为投影 space 着色。
你所做的实际上是毫无意义的,因为它丢失了所有先验信息——标签和空间。
总结:
- 如果您有标签,请使用它们。
- 如果不这样做,请使用更复杂的聚类算法,从原始 space 上的 KNN 开始,如您所见,投影 space 上的 KNN 是不够的。
您的问题并非特定于 t-SNE,而是针对任何无监督学习算法。您如何评价其结果?
我想说,唯一正确的方法是您对数据有一些先验知识或专业知识。诸如标签、其他元数据,甚至用户反馈之类的东西。
也就是说,关于你的具体情节:
- 您从 tSNE 得到的是连续的“饼图”而不是像“岛”或“意大利面条”这样的离散结构,这可能表明投影学习得不是很好。通常 tSNE 应该创建相似数据点的半不同组。这种形状看起来像一个过度法律化的模型。 (就像具有高 KL 散度系数的 VAE)。
- k-Means 产生了人们所期望的分区:k-means 的聚类分配隐式地在特征 space 上创建了一个 Voronoi 图,其中的单元格是聚类质心。良好的初始化会产生分布在特征 space 中的初始质心。由于 space 是对称的,因此质心也可能是对称的。
所以 k-Means 很好,但您可能需要调整 t-SNE 的参数。
检查t-SNE算法的perplexity。当困惑度太小时,t-SNE 通常会产生圆盘状斑点。此外,使用 DBSCAN 聚类算法进行测试,该算法通常比 k-Means 更好。
我正在申请 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)
我有这个情节:
这个情节似乎过于完美和球状我按照情节进行的程序有问题 这个数据?在上面描述的代码中?
Is something wrong with the procedure I follow?
是的。
使用 TSNE 将数据投影到另一个 space,您无法真正控制它。
这样做应该使近点保持近点,远点保持远点。
然后您在投影 space 上使用 KNN 来确定组。
这部分丢失了您之前拥有的任何分组信息[需要引用,需要事先查看数据]!
根据一些先前标记的数据而不是根据 KNN
为组着色更有意义
-或-
在原始 space 上使用 KNN 进行分组,然后根据该分组为投影 space 着色。
你所做的实际上是毫无意义的,因为它丢失了所有先验信息——标签和空间。
总结:
- 如果您有标签,请使用它们。
- 如果不这样做,请使用更复杂的聚类算法,从原始 space 上的 KNN 开始,如您所见,投影 space 上的 KNN 是不够的。
您的问题并非特定于 t-SNE,而是针对任何无监督学习算法。您如何评价其结果?
我想说,唯一正确的方法是您对数据有一些先验知识或专业知识。诸如标签、其他元数据,甚至用户反馈之类的东西。
也就是说,关于你的具体情节:
- 您从 tSNE 得到的是连续的“饼图”而不是像“岛”或“意大利面条”这样的离散结构,这可能表明投影学习得不是很好。通常 tSNE 应该创建相似数据点的半不同组。这种形状看起来像一个过度法律化的模型。 (就像具有高 KL 散度系数的 VAE)。
- k-Means 产生了人们所期望的分区:k-means 的聚类分配隐式地在特征 space 上创建了一个 Voronoi 图,其中的单元格是聚类质心。良好的初始化会产生分布在特征 space 中的初始质心。由于 space 是对称的,因此质心也可能是对称的。
所以 k-Means 很好,但您可能需要调整 t-SNE 的参数。
检查t-SNE算法的perplexity。当困惑度太小时,t-SNE 通常会产生圆盘状斑点。此外,使用 DBSCAN 聚类算法进行测试,该算法通常比 k-Means 更好。