Matlab K-均值排序标签

Matlab K-均值排序标签,matlab,label,cluster-analysis,k-means,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
,我在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

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


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

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


如果你想对他们下订单,你可以根据你的需要重新给他们贴标签。您可以按X坐标对中心进行排序,然后重新标记它们。这不是k-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()

那么您想根据k个平均向量的范数对其进行排序吗?如果两个向量有相同的范数呢?尺寸>=2没有唯一的顺序。在这种情况下,标签没有任何意义。如果矩阵A的第二行在簇2中,而矩阵C的第三行也有类似的行为,那么我想要这样的结果。如果你要求4个簇,你得到4个簇。K-means并没有猜测有多少簇是有意义的。这些答案或类似的答案在R中如何:这背后的方法是什么:即1D数据。您可以在3D中实施某种排序(如您的示例中),但这是一种有用的排序吗?例如,词典排序,或基于范数,但基于词典排序消除歧义。你需要在你的问题的上下文中定义“更高”和“更低”。你能给我看一段代码吗?我有一个想法,我不知道如何准确地实现它,我不使用Matlab。