如何避免 k-means 在不同的运行中分配不同的标签?

机器算法验证 Python k-均值 无监督学习
2022-03-02 22:09:36

我有未标记的数据集。我正在运行具有 2 个集群的 k-means 平面集群。每次我运行以下程序时,标签都是不同的。我怎样才能使标签不改变。甚至可能吗?

X = np.array([[1, 2],
          [5, 8],
          [1.5, 1.8],
          [8, 8],
          [1, 0.6],
          [9, 11]])

kmeans=KMeans(n_clusters=2)


kmeans.fit(X)

centeroids=kmeans.cluster_centers_
labels=kmeans.labels_



colors = ["g.","r."]

for i in range(len(X)):
    print("coordinate:",X[i], "label:", labels[i])
    plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10)


plt.scatter(centeroids[:, 0],centeroids[:, 1], marker = "x", s=150, linewidths = 5, zorder = 10)
print centeroids
print labels
plt.show()

第一次运行标签为 [0 1 0 1 0 1]。一秒运行标签为 [1 0 1 0 1 0]。我怎样才能修复它?

    On the first run, this is how clusters are assigned to the dataset.

    [1, 2] ------>0
    [5, 8] ---------->1
    [1.5, 1.8] ---------> 0
    [8, 8] ---------->1
    [1, 0.6] ---------> 0
    [9, 11]----------->1


   On the second run, this is how clusters are assigned to the dataset.

    [1, 2] ------>1
    [5, 8] ---------->0
    [1.5, 1.8] ---------> 1
    [8, 8] ---------->0
    [1, 0.6] ---------> 1
    [9, 11]----------->0

我怎样才能让它不改变?

4个回答

简而言之:不,您不能简单地指示大多数 K-Means 实现每次都为其集群使用相同的名称(至少我不知道有这样的名称)——因此您可能需要自己执行此操作。

原因很简单,K-Means 在开始时有意随机分布聚类中心,因此此时为聚类分配名称不会有任何语义意义。由于当 K-Means 收敛时集群仍然相同(只有它们的中心和相关样本发生了变化),所以从语义的角度来看,这也不会改变。

您可以做的是,例如,在 K-Means 通过您定义的某个度量(例如,它们到某个原点的距离)收敛后,自动对集群中心进行排序。但是请注意,a)K-Means 在不同的运行中很可能会以不同的方式收敛(“局部最优”,如果你想这样称呼它们)可能会完全改变你的命名,并且 b)即使你每次都非常接近地收敛,微小的变化可能仍会导致您的指标以不同的方式对集群中心进行排序,这反过来会导致例如 2 个集群的名称“切换”,或者一个集群的排序比以前的运行早/晚得多,从而也改变了许多其他集群的名称如果你不走运,集群。请记住,如果您更改运行之间的集群数量,结果自然会大不相同,

更新:

正如@whuber 和@ttnphns 在评论中指出的那样,您当然也可以使用一些集群相似性度量来自动匹配两次收敛的K-Means 运行的集群。总体思路是在运行 A 和 B 上获得集群的成对匹配,其中运行 A 的所有集群与运行 B 中的对应集群的距离最小化。在大多数情况下,这可能会给您比单独订购集群更好的结果。根据集群的数量,从穷举(蛮力)方法到搜索策略的广泛范围可能是合适的。

尝试random_state=0 参数

kmeans = KMeans(n_clusters = 20,  random_state=0)

见官方词汇表

我有类似的问题,并在这里使用此建议 https://stackoverflow.com/questions/44888415/how-to-set-k-means-clustering-labels-from-highest-to-lowest-with-python 在这种情况下,我总是根据它们的值来构建标签。我想这会对你有所帮助。

使用 v-measure 怎么样?这是一个对称的度量

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.v_measure_score.html

您可能还想阅读更多关于同质性分数和完整性分数的信息。