我正在尝试使用以下代码绘制k均值分析的质心和聚类:

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()


不幸的是,质心没有集中在不同的簇上:

python-3.x - 重心不在群集的中心-LMLPHP

问题:有人知道这可能导致什么吗?我不知道怎么了。

谢谢!

最佳答案

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

在示例中,您将创建两个不同的歧管:

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。那应该显示您期望的结果。

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

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


读取数据集
应用TruncatedSVD一次转换整个数据集。
在转换后的数据集上使用k均值获得k个质心
获取质心并将其连接到数据集的末尾(就像它们是其他示例一样)
TSNE应用于整个数据集。
(可选)照常绘制第一个N-k点。
(可选)以其他颜色绘制最后的k个点(变换后的质心)。

关于python-3.x - 重心不在群集的中心,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49213930/

10-11 08:55