如何为 k-means 聚类选择初始质心

Posted

技术标签:

【中文标题】如何为 k-means 聚类选择初始质心【英文标题】:how to choose initial centroids for k-means clustering 【发布时间】:2016-06-27 09:37:20 【问题描述】:

我正在努力在 Python 中实现 k-means 聚类。为数据集选择初始质心的好方法是什么?例如:我有以下数据集:

A,1,1
B,2,1
C,4,4
D,4,5

我需要创建两个不同的集群。我如何从质心开始?

【问题讨论】:

【参考方案1】:

您可能想了解K-means++ 方法,因为它是选择初始质心的最流行、最简单且结果一致的方法之一。这里有paper。它的工作原理如下:

从数据点中随机均匀选择一个中心。 对于每个数据点x,计算D(x)x 与已选择的最近中心之间的距离。 使用加权概率分布随机选择一个新数据点作为新中心,其中一个点x 的选择概率与D(x)^2 成正比(您可以为此使用scipy.stats.rv_discrete)。 重复第 2 步和第 3 步,直到选择 k 中心。 现在已经选择了初始中心,继续使用标准 k 均值聚类。

【讨论】:

从数据点中随机均匀地选择中心。我没有得到这部分。如何在我的数据集上选择它? 如果你选择一个随机元素,你会根据一些分布对其进行采样。统一意味着您从一个集合中采样它,其中绘制每个元素的可能性相同。所以在你的情况下你可以做类似random.sample(set('ABCD'), 1)的事情。【参考方案2】:

标准的初始化是简单的

选择 k 个随机实例。

还有更多方法(例如 k-means++),但它们通常不能始终如一地产生比此基线更好的结果。诸如 k-means++ 之类的方法有时效果很好,但也经常不会产生任何改进;但是需要花费大量额外的时间来计算。

【讨论】:

【参考方案3】:

如果数据集像您的情况一样小,则 K- 表示本身会选择随机的不同簇,然后重复计算质心以优化质心和点之间的距离。

但是,如果数据集很大,则可以使用称为 sharding 的简单方法代替集群的初始随机化,因为它可以减少优化集群所需的迭代次数,从而节省时间.

你可以应用分片,这里有详细解释

Sharding in k means

【讨论】:

【参考方案4】:

一个标准的初始化是将每个数据点随机分配给集群,然后只计算这些随机集群的均值。

另一种方法是只选择k 随机数据点,其中k 是集群的数量,这些是你的手段。这有时被称为 Forgy 方法。

【讨论】:

随机聚类分配实际上是最差方法之一。因为平均而言,所有中心都是相同的。

以上是关于如何为 k-means 聚类选择初始质心的主要内容,如果未能解决你的问题,请参考以下文章

k-means聚类算法

详解聚类算法Kmeans-重要参数init & random_state & n_init:初始质心怎么放更好菜菜的sklearn课堂笔记

如何从 Tf-IDF 向量中选择 K-mean 的初始聚类

基于k-means的聚类算法—机器学习

聚类算法:K均值

K-means 聚类的质心