【问题标题】:K-means sort labelsK-means 排序标签
【发布时间】:2018-12-26 11:12:22
【问题描述】:

假设我有矩阵 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,那么B的第三行也得到标签3

【问题讨论】:

  • 那么你想根据它们的范数对k个均值向量进行排序吗?如果两个向量具有相同的范数怎么办?尺寸 >= 2 没有唯一的顺序。
  • 在这种情况下,标签没有任何意义。如果矩阵 A 的第二行在集群 2 中,并且矩阵 C 的第三行也有类似的行为,我想要这样的东西也应该集群在 2 中。
  • 你要求 4 个集群,你得到 4 个集群。 K-means 不会猜测有多少集群是有意义的。
  • R 中的这些答案或类似内容怎么样:这背后的方法是什么:stackoverflow.com/questions/48182601/…
  • 那是一维数据。您可以在 3D 中强加某种排序(如您的示例中所示),但它是有用的排序吗?例如字典顺序,或基于规范但基于字典顺序去歧义。您需要在问题的上下文中定义“更高”和“更低”。

标签: matlab label cluster-analysis k-means


【解决方案1】:

每个标签都与集群的平均值相关联。要对标签进行排序,您可以对例如中的手段进行排序。沿给定轴(本例中为 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()

【讨论】:

    【解决方案2】:

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

    如果想要对它们下达命令,您可以根据需要重新标记它们。您可以按 X 坐标对中心进行排序,然后重新标记它们。这不是 k-means 的工作,你需要自己做。

    【讨论】:

    • 你能给我看一段代码吗,我有一个想法,我不知道具体如何实现
    • 我不使用 Matlab。
    猜你喜欢
    • 1970-01-01
    • 2014-07-12
    • 2014-09-06
    • 1970-01-01
    • 2013-07-03
    • 2013-10-12
    • 2020-03-03
    • 2020-09-05
    • 2013-07-03
    相关资源
    最近更新 更多