假设我有矩阵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
。
答案 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()