matlab - K-means 排序标签
问题描述
假设我有矩阵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
解决方案
每个标签都与集群的平均值相关联。要对标签进行排序,您可以按照给定轴(本例中的 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()