假设我有矩阵 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
.
最佳答案
每个标签都与集群的平均值相关。要对标签进行排序,您可以对例如中的平均值进行排序沿给定轴(本例中为 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()
关于matlab - K 均值排序标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51403595/