K-Means聚类的一站式解决方案

高效便捷的K-Means聚类解决方案一站式服务

如何使相似的数据点聚集起来并具有意义呢?好吧,K-Means是其中之一的答案。这篇文章总结了关于K-Means聚类的几乎所有内容。话虽如此,我没写过这段代码 🙂

大纲 —

  1. 什么是K-Means聚类
  2. 聚类的特性
  3. K-Means聚类算法
  4. 收敛/停止准则
  5. 质心初始化: K-Means ++
  6. 选择最优K值
  7. 评估聚类质量

~物以类聚

1. 什么是K-Means聚类?

K-Means聚类是一种无监督学习算法,帮助我们把数据中相似的数据点聚集到一起形成簇。这些簇代表了数据点之间共享的特征,标志着它们的相似性。

简单来说,K-Means与KNN相似,我们寻找K个最近的点以确定相似性。在K-Means聚类中,我们形成K个簇,使得簇中的点相似并具有共同特征。下面的图表将更加清晰地解释:

Ideal Clustering with 5 clusters

K-Means让我们通过将数据作为输入参数来实现上述类似的图表。由于我们仅仅基于现有的数据点形成聚类,因此对于这些点我们不需要y标签。因此,聚类是一种无监督学习算法,我们不需要数据点的标签。

聚类的应用 —

1. 客户细分2. 文档细分3. 图像分割4. 推荐系统等等

2. 聚类的特性

现在,这些聚类具有一些特性,按照这些特性它们才具有意义。

  1. 簇内的所有数据点应尽可能相似 — 簇内的数据点非常接近。这意味着在特征空间中,数据点代表着相似的特征。此外,相似的点更容易形成簇。因此,为了使聚类有意义,同一个簇内的点应尽可能相似。
  2. 来自不同簇的数据点应尽可能不同 — 来自不同簇的数据点相距较远。这意味着在特征空间中,这些点代表着非常不同的特征。此外,不同的点永远不会形成簇。因此,不同簇的数据点应尽可能不同,以使聚类有意义。
  3. 每个簇都有一个质心 — 我们形成的每个簇都有一个质心,所有点都与质心相关联。这个质心是帮助我们形成聚类的关键点,并根据簇内点的均值进行调整。

~好吧,这些特性不用那么费心,它们只是些枯燥的理论。有趣的部分还在后面

3. 聚类算法

这里我们将深入探讨算法如何生成美丽的聚类。

算法 —

  • [步骤1] — 选择我们想要的簇数(K) — 目前可以任意选择,因为我们将在稍后决定如何选择K的值。最常用的是选择一个随机值K=3来开始算法。
  • [步骤2] — 选择K个随机点作为聚类中心点(K-centroids) — 这些点也是随机选择的,用于形成每个簇的中心点。这些点可以从我们的数据或其他地方随机选择。
  • [步骤3] — 将每个数据点分配给最近的中心点 — 然后我们计算数据集中每个点与所有K个中心点的距离。该点被分配给距离该中心点最近的中心点。可以如下所示可视化:

对于每个点重复此过程,最终每个点都被分配给某个或另一个中心点。这样,我们就得到了K个簇。我们通常使用欧几里得距离来计算点与中心点之间的距离。

  • [步骤4] — 计算新的中心点 — 在将每个点分配给其他中心点后,我们通过计算每个簇中所有点的平均值来计算每个簇的新中心点。新的中心点可以通过分别对所有数据点的x坐标和y坐标求平均值来计算。

这里的‘m’是一个特定簇中数据点的数量。

  • [步骤5] — 重复步骤3和步骤4,直到达到收敛/停止条件

让我们进行可视化:

1. [步骤1] — 假设我们选择k = 22. [步骤2] —

选择2个随机中心点

3. [步骤3] —

将点分配给最近的中心点

4. [步骤4] —

计算新的中心点

5. [步骤5] —

计算新的中心点
收敛 — 完美的簇

4. 收敛/停止条件

如果上述算法没有收敛,将会无限重复。因此,我们需要一些停止标准。有几个停止标准,当遇到它们时,算法应该停止。这些标准包括:

  1. 在特定簇中分配的数据点保持不变 – 我们运行算法直到数据点不再分配给任何新的簇。这个过程非常缓慢,可能需要很长时间。
  2. 质心保持不变 – 我们运行算法直到计算得到的新质心与之前的质心相同。这个过程非常缓慢,可能需要很长时间。
  3. 数据点到质心的距离最小 – 我们设置数据点到质心的距离阈值。当达到这个阈值时,算法将停止。这个过程很快,但需要非常小心地选择距离阈值。
  4. 达到固定的迭代次数 – 我们设置迭代次数的阈值,当达到这个阈值时停止。这个过程很快,但是不明智的阈值设置可能导致簇形成不良。

我们可以在算法中实现这些停止条件,以实现早期收敛和适当的聚类。

5. 质心初始化

在K-Means中,我们随机初始化质心。这可能会导致一些问题,导致聚类形成不良。

  • 如果质心是远离的点(异常值),那么可能没有数据点被分配给该质心。这可能导致多个簇被分配给同一个质心。
  • 如果两个或更多质心初始化得非常接近,这可能导致多个质心被分配给同一个簇。

这两个问题可以在下面的图中可视化:

聚类不良
理想的聚类

因此,我们需要更好的质心初始化方法。我们可以使用以下两种方法之一:

  1. 重复多次K-Means,直到得到最佳的聚类
  2. 使用K-Means ++算法

由于明显的原因,前者在时间复杂性方面非常低效。因此,我们使用K-Means ++算法进行质心初始化。

K-Means ++

这只是质心初始化的算法,其余过程与K-Means算法相同。

算法 –

  1. 随机选择第一个质心
  2. 现在计算每个点到最近质心的距离(开始时,第一个质心是最近质心)
  3. 现在为每个点分配概率值。概率值与点与前一个质心的距离成比例。这意味着距离质心最远的点具有被选为下一个质心的最高概率值。
  4. 重复这些步骤,直到我们有K个质心。

通过这样的初始化,确保每个质心与其他质心之间的距离尽可能远。因此,不会有多个质心被分配给同一个簇,也不会有多个簇被分配给同一个质心。

此后,K-Means算法将继续进行,其中数据点被分配给最近的质心,依此类推。

6. 选择一个最佳的K值

选择一个最佳的K值非常重要,因为这可能导致结构良好的聚类,也可能导致无组织的聚类。

有多种方法可以选择K的值,但最优的方法是通过一种称为肘部法则的方法。我们的目的是找到使得簇内平方和误差(WCSSE)最小的K的值。

WCSSE表示数据点与同一簇中心的平方距离的总和。

手肘法

手肘法是一种技术,通过查看每个K给出的结果,我们可以选择一个K值。

WCSSE计算为所有集群,并绘制在不同的K值下。图表中WCSSE急剧减小的点是我们要寻找的点。该点告诉我们WCSSE急剧下降并几乎保持不变的特定K值。因此,在此点之后,增加K值不会显著降低WCSSE,因此该点是最佳K值。

手肘法的步骤如下:

  • 我们选择一个K范围(例如从1到10)
  • 对于此范围内的每个K值,我们找到所有群集的WCSSE。
  • 然后,我们将WCSSE绘制为K,其中K在X轴上。
  • K值使WCSSE值急剧下降并呈肘状形状,是我们选择的最佳K值。

从上图中,我们可以看到在K值为5时,WCSSE急剧下降,并在此之后几乎保持不变。因此,在5个簇之外,WCSSE并没有显著减少。因此,我们选择K = 5。

< strong>7。评估簇质量

为了使群集有意义,我们必须评估每个群集的质量。通过质量,我指的是我们的群集如何解释我们的数据。为此,我们必须回到我们的 cluster属性。遵循所有属性的群集被认为是一个好的群集。那么,我们如何在数学上评估聚类属性呢?

有两种方法:1.惯性2.邓恩指数

1.惯性

惯性指的是特定群集中点与群集质心之间的距离的总和。这也可以被认为是簇内距离,因为我们计算的是簇内点之间的距离。对于簇质心C1,我们可以定义惯性为:

其中i的范围从1到m(该簇中的点数)

Intra-cluster distance

上图描绘了簇间距离或惯性。

对于一个有意义的簇,其点与质心之间的距离应该尽可能小。因此,簇可以满足第一个属性。

因此,对于一个好的簇,惯性值应该尽可能小

2.邓恩指标

邓恩指数是簇的第二个属性的度量。它衡量群集之间的距离有多远,这表示两个群集的属性之间的差异。邓恩指数通过计算簇内距离和簇间距离来实现。

簇间距离指的是两个群集之间的距离。现在,这个差异也取决于我们如何衡量它。

– 它可以是两个群集质心之间的差异 – 它可以是两个群集中最远点之间的差异 – 它可以是两个群集中最近点之间的差异。

无论选择用于衡量簇间距离的标准如何,邓恩指数可以表示为:

为了使两个簇尽可能不同/远离,分子应该是非常大的数,而分母应该是非常小的数。因此,

  • 任意两个簇之间的最小距离[最小簇间距]应该是非常大的数,以便使分子成为一个较大的值。
  • 点与簇的质心之间的最大距离[最大簇内距离]应该是一个非常小的数,以便使分母成为一个较小的值。

对于一个具有显著性的簇,簇间距必须尽可能大。因此,该簇可以满足第二个属性。

因此,对于一个好的簇,邓恩指数必须尽可能大。

好了,这几乎就是关于K-Means聚类的全部理论。我会编码。

也可以看看这些:

  1. KNN
  2. 逻辑回归
  3. 支持向量机
  4. 朴素贝叶斯
  5. 评估指标 – 分类