首页 > 解决方案 > K-means 排序标签

问题描述

假设我有矩阵A并且我在 MATLAB 中对它们执行 K-means 聚类。我得到以下

A=

 1    20     5
 1    30    10
 2    60    20
 5   100    45 

kmeans(A,4)产生以下标签:

 2
 4
 3
 1

现在我置换行A并得到矩阵B

B =

 2    60    20
 1    30    10
 5   100    45
 1    20     5

在应用kmeans标签之后B1 = [3 1 2 4],这似乎是随机分配。例如,矩阵A的第二行在集群中,4但与第二行B相同的矩阵的第二行在A集群中1

如何获取标签,kmeans例如,具有最高值的行总是得到相同的标签,3而具有最低值的行总是得到1

例如获取标签的最后一行A,因此也获取标签3的第三行。B3

标签: matlablabelcluster-analysisk-means

解决方案


每个标签都与集群的平均值相关联。要对标签进行排序,您可以按照给定轴(本例中的 x 轴)的出现顺序对均值进行排序。这是 Python 中的一个实现:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

np.random.seed(1)

def rearrange_labels(X, cluster_labels, sort_on_column=0):
    labels, ctrs = [], []
    for i in range(len(set(cluster_labels))):
        Xi = X[cluster_labels == i]
        ctr = np.mean(Xi, axis=0)
        labels.append(i)
        ctrs.append(ctr)

    ctrs = np.row_stack(ctrs)
    labels = np.array(labels).reshape(-1, 1)

    # sort on x column
    new_order = ctrs[:, sort_on_column].argsort()

    labels_new = labels[new_order]
    ctrs_new = ctrs[new_order]

    np.put(cluster_labels, labels, labels_new)
    return cluster_labels, ctrs_new


X, _ = make_blobs(n_samples=500, centers=10, n_features=2)

clf = KMeans(n_clusters=10)
cluster_labels = clf.fit_predict(X)

cluster_labels, ctrs = rearrange_labels(X=X, cluster_labels=cluster_labels)

fig, ax = plt.subplots()
for i, m in enumerate(ctrs):
    ax.annotate(
        xy=m[[0, 1]],
        s=i,
        bbox=dict(boxstyle="square", fc="w", ec="grey", alpha=0.9),
    )
ax.scatter(X[:, 0], X[:, 1], c=cluster_labels)

plt.show()

在此处输入图像描述


推荐阅读