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。