质心不以群集

时间:2018-03-10 20:52:49

标签: python-3.x machine-learning scikit-learn k-means

我试图使用以下代码绘制我的k-means分析的质心和聚类:

matrix_reduced = TruncatedSVD(n_components = num_k).fit_transform(matrix)

matrix_embedded = TSNE(n_components=2, perplexity=30,verbose=2, n_iter =500).fit_transform(matrix_reduced)

centroids = kmeans.cluster_centers_
centroids_embedded = TSNE(n_components=2).fit_transform(order_centroids)


fig = plt.figure(figsize=(10,10))
ax1 = fig.add_subplot(111)


ax1.scatter(matrix_embedded[:,0], matrix_embedded[:,1],marker='x',c = kmeans.labels_)
ax1.scatter(centroids_embedded[:,0], centroids_embedded[:,1],marker='o',c = 'red')

plt.show()

不幸的是,质心不是以不同的聚类为中心:

enter image description here

问题:有谁知道会导致这种情况的原因?我不知道出了什么问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

通常,在创建任何流形时,您需要提供要在其上表示的所有点(因为最终表示通常取决于数据中的所有点)。

在示例中,您正在创建两个不同的流形:

matrix_reduced = TruncatedSVD(n_components = num_k).fit_transform(matrix)

# first manifold
matrix_embedded = TSNE(n_components=2, perplexity=30,verbose=2, n_iter =500).fit_transform(matrix_reduced)

centroids = kmeans.cluster_centers_
# second manifold
centroids_embedded = TSNE(n_components=2).fit_transform(order_centroids)

这意味着创建的表示是独立的(这就是为什么你看不到它们居中的原因 - 实际上它们位于不同的空间)。

解决此问题的方法是将matrix_reducedorder_centroids简单地加入到单个数据集中,并仅应用TSNE 一次。这应该显示你期望的结果。

另外,请注意,如果您在原始矩阵(而不是matrix_reduced)上使用k-means,那么结果仍然不正确 - 您需要对质心和数据应用相同的转换k-means最初看到了。

总而言之(假设您希望在群集之前使用TruncatedSVD),它将按以下方式工作:

  1. 阅读数据集
  2. 应用TruncatedSVD将整个数据集转换为一个。
  3. 在转换后的数据集上使用k-means获取 k 中心
  4. 获取质心并在数据集的末尾连接它们(就像它们是其他示例一样)
  5. TSNE应用于整个数据集。
  6. (可选)像往常一样绘制第一个N k 点。
  7. (可选)以不同的颜色绘制最后的 k 点(转换的质心)。