在 seaborn 或 matplotlib 中,如何在 k-means 和 TSNE 之后为簇着色?

How do I color clusters after k-means and TSNE in either seaborn or matplotlib?

我有一个看起来像这样的数据框:

transformed_centroids = model2.fit_transform(everything)
df = pd.DataFrame()
df["y"] = model.labels_
df["comp-1"] = transformed_centroids[-true_k:, 0]
df["comp-2"] = transformed_centroids[-true_k:, 1]

'y' 是我想要着色的 k-means 标签,“comp-1”和“comp-2”是 TSNE 模型的结果。当我尝试这样绘制时:

sns.scatterplot(transformed_centroids[:-true_k, 0], transformed_centroids[:-true_k, 1], marker='x')
sns.scatterplot(df['comp-1'], df['comp-2'], marker='o', hue=df['y'])
plt.show()

它给我这个错误:

ValueError:值的长度 (2) 与索引的长度 (35104) 不匹配(来自这一行:df["comp-1"] = transformed_centroids[-true_k:, 0 ])

即使我这样做也会发生这种情况:

sns.scatterplot(transformed_centroids[:-true_k, 0], transformed_centroids[:-true_k, 1], marker='x')
sns.scatterplot(df['comp-1'], df['comp-2'], marker='o', hue=df.y.astype('category').cat.codes)
plt.show()

我已经尝试了分散在随机教程和此处的其他几段代码,但我还没有找到解决方案。我觉得已经成功完成聚类但在颜色上失败了。

编辑:我意识到我使用了错误的情节点。更新代码和错误如下:

df["y"] = model.labels_
df["comp-1"] = transformed_centroids[:, 0]
df["comp-2"] = transformed_centroids[:, 1]

ValueError:值的长度 (35106) 与索引的长度 (35104) 不匹配

我不确定这两个丢弃的数据点被...丢弃了。

EDIT2:这是 TSNE 代码:

centroids = model.cluster_centers_
tweets_df2['labels'] = model.labels_
everything = np.concatenate((X.todense(), centroids))

tsne_init = 'pca'  # could also be 'random'
tsne_perplexity = 20.0
tsne_early_exaggeration = 4.0
tsne_learning_rate = 1000
model2 = TSNE(n_components=2, random_state=0, init=tsne_init, perplexity=tsne_perplexity,
              early_exaggeration=tsne_early_exaggeration, learning_rate=tsne_learning_rate)
transformed_centroids = model2.fit_transform(everything)
df = pd.DataFrame()

我从另一个堆栈溢出 post 中获取这段代码并将其与我的数据相匹配,所以我无法 100% 解释它,我只知道我需要使用 TSNE 来让我的数据点成为二维可绘制,因为数据是使用 TD-IDF

向量化的词

在@tdy 的帮助下,我意识到不久前尝试过的解决方案之一就是我需要的解决方案。我的主要问题是我的编辑 2,我没有绘制正确的数据集。我将 df 更改为:

df["y"] = model.labels_
df["comp-1"] = transformed_centroids[:-2, 0]
df["comp-2"] = transformed_centroids[:-2, 1]

当然,这和我的2-cluster代码是一样的:

df["y"] = model.labels_
df["comp-1"] = transformed_centroids[:true_k, 0]
df["comp-2"] = transformed_centroids[:true_k, 1]

其中 true_k 是代表我有多少 k-means 个集群的变量。我有这个解决方案,但更改了它,因为我认为摆脱 true_k 会解决我的 2 变量问题,但我从未恢复它。我只需要用正确的 transformed_centroids[] 切片来做到这一点,当它融化我的 CPU... :)

时,一切都应该在 7 分钟内顺利 运行