K-均值排序标签

时间:2018-07-18 13:42:52

标签: matlab label cluster-analysis k-means

假设我有矩阵A,并在MATLAB中对其执行K-均值聚类。我得到以下

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}中}。

如何获取1中的标签,以使具有最高值的行始终获得相同的标签,例如kmeans,而具有最低值的行则始终获得3

例如,1的最后一行获得标签A,因此3的第三行也获得标签B

2 个答案:

答案 0 :(得分:0)

由k均值分配的簇号没有顺序-不要这样对待它们。这些数字只是为了方便起见,也可能是A B C D。

如果要对它们强加命令,则可以根据需要重新标记它们。您可以按X坐标对中心排序,然后重新标记它们。这样做不是k-means的工作,您需要自己执行此操作。

答案 1 :(得分:0)

每个标签都与聚类的均值相关。要对标签进行排序,您可以对例如沿给定轴(在此示例中为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()

enter image description here