matlab - K 均值排序标签

标签 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 的第二行位于簇 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()

enter image description here

关于matlab - K 均值排序标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51403595/

相关文章:

javascript - 如何将参数添加到 javascript 中的事件处理程序?

algorithm - 哪种聚类方法适合哪种数据?

python - 当我只在行中获得聚类时,如何微调 K 均值聚类?

matlab - 如何在 Simulink 中调整子系统模块上 IO 端口的显示?

variables - Outreg2 和具有交互作用的回归 c.var1##c.var2

Jquery 根据 ID 选择标签

r - 在 postgresql 中使用 PL/R 进行 kmeans 聚类

matlab - 在matlab中批量读取wav文件为神经网络训练集创建矩阵

循环错误中的 Matlab 图

MATLAB:从 'command line' 确定依赖项,不包括内置依赖项