返回
查看原链接原链接
Bilibili17分26秒 · —

K-Means 聚类算法(无监督学习)详解

K-Means 聚类算法(无监督学习)详解

K-Means 是一种典型的无监督聚类算法,通过将无标签数据自动划分为 K 个簇,实现按样本间相似性对数据分组,是发现数据内在结构和规律的基础模型。

核心要点

无监督学习背景

在前面的学习中,我们接触到的无论是回归模型还是分类模型,利用的数据都是自带标签的。模型经过训练可以预测一个值,然后与真实值对比进行优化,直到预测较为准确为止。

但在现实生活中,我们经常会遇到一些根本没有标签的数据。数据本身不包含"答案",但内部隐藏着一些结构或规律,需要模型自动去发现。

聚类问题的适用场景

聚类问题在现实中有着广泛应用,文中给出了以下代表性场景:

  • 电商用户画像分群:根据用户购买的频率、消费的金额等特征,将用户划分为不同群体,实现差异化运营;
  • 图像主色提取与压缩:图像中包含各种各样的颜色,通过只选取少数的关键颜色来表示整张图片,使图像的 size(大小)大幅下降;
  • 异常检测:识别偏离常规的数据点,例如异常的访问、恶意的攻击等,这需要通过数据分布中的规律来做识别。

聚类问题定义

聚类问题是指在没有标签的前提下,根据样本之间的相似性,把数据划分成若干组,也称之为不同的簇,使得:

  • 相同簇内的样本尽可能相似;
  • 不同簇之间尽可能有差异。

K-Means 算法的基本定位

K-Means 模型主要的用途就是实现对数据的分组。它是一个典型的聚类算法,用于将一批无标签数据自动划分为 K 个簇

对于名字的解释:

  • K:指你要划分多少个簇;
  • Means:均值的意思,指各个簇的中心位置。在簇内,它是最中心的点,该位置相对于所有样本用均值来表示。

举例来说,给定一幅图像的散点数据,即便只用肉眼观察,大概也能看出有四个簇。K-Means 就是去寻找这四个中心点,使得该簇内所有的样本点到该中心点的距离是最近的;相对于到其他中心点的距离而言,每个样本都应属于离其最近的中心点所在的簇。


详细解析

一、质心(Centroid)

质心就是簇中心的位置,通常取该簇内所有点在各个维度上的均值

举例说明:在二维空间中,有 3 个点,它们的质心计算方法为:

  • 对所有的 X 值求均值;
  • 对所有 Y 值求均值。

得到的坐标(如 (2,3))即为这 3 个点的质心。

二、欧式距离(Euclidean Distance)

在聚类中经常需要度量距离,判断谁离谁近、谁离谁远,最常用的度量方式就是欧式距离(欧吉里德距离)。

二维空间中:若有 A、B 两个点,它们的欧式距离计算方式为:

distance = sqrt((xA - xB)² + (yA - yB)²)

多维推广:当数据扩展到三维甚至更高维(例如 10 维),每个点可以理解为多维空间中的一个向量。其计算方式是各维度上对应值相减后的平方和(再开方):

  • 二维时计算 X 与 Y 两个维度;
  • 三维时增加 Z 维度;
  • 四维时继续增加,依此类推,直到第 N 维(N 为数据的维度数)。

三、簇内平方和(SSE)与聚类效果评估

K-Means 追求的聚类目标是:让同一个簇内的样本尽可能都接近,靠近该簇的质心

评价聚类效果好坏的标准被称作 SSE(Sum of Squared Error,即簇内误差平方和,原文中用 S S 表示),其计算思路为:

对于每一个簇(第 i 个簇,记为 Ci):

  • 计算簇中所有样本点到其质心 μ(Mu)的距离;
  • 对这些距离计算平方和;
  • 将每个簇内算出的平方和进行累加。

最终得到总的 SSE 值。该数值越小,说明:

  • 簇内样本越紧凑;
  • 聚类效果通常越好。

因此该指标可以作为后续衡量聚类效果的重要依据。

四、K-Means 的迭代原理与流程

K-Means 的迭代原理非常简单,核心步骤就是:选中心、分簇、更新中心、再分簇,直到收敛稳定。具体流程如下:

  1. 初始化中心点:需要手工指定一个 K 值(根据肉眼观察数据大约有几个簇),随机选择 K 个点作为最开始的质心;
  2. 分配样本:计算每个样本到这些质心的距离,把它归属到离它最近的质心所在的簇;
  3. 更新质心:利用公式重新计算每个簇内所有点的质心,得到 K 个新质心;
  4. 重复分配与更新:将所有样本与这 K 个新质心重新做距离判断,样本的归属可能发生改变(有的点从这个簇换到另一个簇);
  5. 判断收敛:停止迭代的条件有三种,满足任一即可:
  • 质心的位置不再发生变化;
  • 样本的归属不再发生改变;
  • 达到最大迭代次数(防止死循环)。
  1. 评估效果:聚类完成后,计算 SSE 来评估效果。

方法与步骤

手工实现 K-Means 的演示逻辑

文中通过代码演示了 K-Means 的执行过程,核心思路如下(伪代码梳理):

数据准备
  • 生成 300 个样本;
  • 设置分成 4 个簇;
  • 参数 0.6 控制簇的稀疏程度;
  • 使用工具生成散点分布样本数据。
手工实现基本流程
  1. 随机初始化:使用 random.choice 方法,随机选择 K 个点作为初始质心;
  2. 分配样本:计算每个样本到每个中心点的距离,对每一行判断它到哪个中心点最近,就将样本归属为对应的标签。这样得到 K 个簇,每个簇下面有一些样本;
  3. 更新质心:对每个簇内的所有样本重新求均值,计算新的中心点;
  4. 收敛检查:检查之前的中心点与现在的中心点的差距是否有变化:
  • 如果有变化则继续迭代;
  • 如果不再变化则跳出循环;
  1. 迭代上限:设置最大迭代次数为 15 次,如果 15 次之后还未收敛,则按最后一次的结果输出。
演示过程中的观察
  • 第 1 次迭代:完成初始质心随机初始化后,给样本标记归属;
  • 第 2-4 次迭代:不断更新质心位置,部分样本被分到这个簇或那个簇;
  • 第 6 次迭代:质心位置基本不再变动,聚类完成。

从可视化结果可以看到,刚开始质心是随机分布,随着不断迭代,质心位置和簇内样本归属逐渐趋于稳定,最终形成的聚类结果与初始随机状态有明显差别。


案例与数据

优化方案一:K-Means++(改进初始质心选择)

问题背景

K-Means 的第一个不稳定因素是随机选择初始化的质心。不同的初始化方式可能导致:

  • 算法陷入较差的局部最优解;
  • 聚类结果存在明显差异。
K-Means++ 的核心策略

K-Means++ 在选取初始质心时做了改进,不再是全部随机选择:

  1. 选择第一个质心:先从样本点中随机挑选一个样本点作为第一个质心;
  2. 选择后续质心:不再是完全随机选择,而是尽可能挑选距离已有质心(或已选质心集合)较远的样本点作为新的质心。

举例说明:如果第一个选了这个点,下一步就找一个距离这个点最远的点做质心;再下一步找距离这两个点都比较远的点做质心。

这样做的目的是防止像随机选择那样,初始时几个质心恰好都集中在一小片区域内,导致其他区域的分簇出现困难。K-Means++ 的选择方式使得初始质心的分布把握度更大、更均匀。

优化方案二:肘部法则(Elbow Method)选择 K 值

问题背景

K-Means 需要预设 K 值,但对于复杂数据,肉眼并不容易判断 K 应取多少。而 K 值的设置显著影响分簇效果:

  • 若某些数据真实的簇数是 4,强行设置 K=3 时,分类效果会较差;
  • 若强行设置 K=6,则分类过细,很多时候没有必要。
肘部法则的原理

肘部法则的操作方式是:从 K=1 开始,对一个范围内的每个 K 值分别计算其对应的 SSE。

规律是:随着 K 值增大,SSE 会持续下降。原因在于:如果令 K 等于样本总数(如 300 个样本取 K=300),那么每个样本单独成为一个簇,簇内每个点到自身质心的距离为零,SSE 必定为 0——但这毫无实际意义。

因此,关键是找到 SSE 下降趋势中出现明显拐点的位置。这个拐点位置形状类似手臂弯曲时的肘部,所以被形象地称为"肘部法则"。从曲线图可以判断出最合适的 K 值。

演示结论

通过运行代码测算,示例数据的最佳 K 值大约为 4

使用 Scikit-Learn 内置 K-Means 的效果验证

在用 Scikit-Learn(原文中记为 seclar learn)实现时,代码非常简洁。使用 K-Means 时:

  • 设置 K=4;
  • 默认使用 K-Means++ 作为质心初始化方法;
  • 设置 n_init=10(原文写作 ne 等于 10)。其含义是让算法从 10 次不同的初始化运行中,挑选出 SSE 最小的一次结果来消除随机初始化的不确定性。

实际运行效果:

  • 初始质心会与最终结果有明显差别,经过聚类后数据被正确分成 4 类;
  • SSE 为 362(样本量共 300 个),平均来看每个点的偏差约为 1.2~1.3 左右,属于比较准确的结果;
  • 算法只迭代了 3 次就实现了快速收敛,效果非常好。

案例与数据

应用场景详解:聚类模型的广泛用途

聚类模型的用途非常广泛。除了前面提到的特征分类之外,还包括:

应用领域具体说明
电商客户分层根据用户行为特征划分不同群体
图像处理将颜色轻量化、图像分割、压缩颜色空间
异常检测识别偏离常规模式的数据点
推荐系统冷启动用户或物品数据量较少的初期阶段,为"猜你喜欢"提供依据
数据探索(EDA)帮助初步了解数据内部的结构与分布
特征工程用聚类结果作为新的特征维度

图像压缩案例:用 K-Means 减少颜色数量

任务目标

将一张彩色图片进行颜色压缩,只用少数几种颜色表示整张图片。

操作步骤
  1. 读取本地图片:通过代码读取图像,注意正确配置图片路径;
  2. 数据归一化:图像中的每个颜色由 RGB 三原色组成,每个原色的数值范围在 0~255 之间。将所有像素值除以 255,使数值归一化到 0~1 之间,形成一个像素矩阵;
  3. 设置不同簇数:分别设置 K=4、K=16、K=64 进行聚类;
  4. 聚类压缩颜色:聚类完成后,用每个簇的质心颜色替代簇内所有像素点的原颜色。例如图像本来有上万种颜色,K=4 时仅用 4 种质心颜色来表示;
  5. 对比效果:将不同 K 值的压缩结果与原图进行对比。
实验观察结果
  • K=1:整个图像只呈现一种颜色(可能是全黑);
  • K=2:图像呈现黑白两色;
  • K=4:结果类似于早期卡通的风格;
  • K=16:图像相对较清晰,但部分轮廓细节仍不太清楚;
  • K=64:几乎与原图没有任何差别。

K 值越大,图像越接近原图,但文件体积也越大。这个案例说明 K-Means 对图像数据可以做到大范围的压缩,在压缩比和图像质量之间可以通过 K 值进行平衡。


限制与待确认问题

K-Means 的优点总结

  • 思想简单:算法思路非常直观,容易理解;
  • 流程清晰:迭代过程逻辑明确;
  • 可解释性强:每个簇都有明确中心点,如颜色压缩后直接选出 4 种代表色;
  • 计算效率高:在中型规模的数据上运行效率相对较高;
  • 实现简单:即使不用 Sklearn 库,手写一个基础 K-Means 也只需不到 50~100 行代码。

K-Means 的局限性

1. 预设 K 值不当会导致严重问题

问题描述:K 值的选取准确度直接影响聚类效果。对复杂数据而言,难以仅凭经验正确估计 K 值。

解决方案:使用肘部法则先对 K 值做出预判(也可与 K-Means++ 配合使用)。

2. 对初始值敏感,容易陷入局部最优

问题描述:随机选择初始质心可能导致算法收敛到局部最优解,而非全局最优,不同初始条件下聚类结果可能差异很大。

解决方案

  • 使用 K-Means++ 对质心初始化进行优化;
  • 设置多次运行参数(如 n_init=10),从多次聚类结果中选取 SSE 最小的一次,消除部分不确定性。
3. 只能发现球形簇

问题描述:K-Means 对簇形状有天然限制,只适合发现类似球形的簇。若数据分布呈现月牙形、环形或其他非凸形状,K-Means 的处理效果会非常差。在前面的例子中数据分布接近圆形或球形,所以 K-Means 能正常处理。

4. 对异常值非常敏感

问题描述:由于簇中心通过均值计算,异常点会对质心的位置产生显著影响。举例来说,如果大部分数据点集中在某个区域内,但有一个点远远偏离到屏幕外,这个极端的数据点会使全局质心的计算结果明显偏移。

5. 对特征尺度敏感

问题描述:不同特征的数值尺度差异(如有的特征单位为个位、有的特征达到数千)会显著影响距离计算的结果,从而影响聚类效果。

解决方案:在使用 K-Means 之前,必须先对特征做标准化(Standardization)或归一化(Normalization)操作

针对局限性的已有缓解方案

对应上述缺陷,业界存在多种常用的优化策略:

问题优化方案
初始质心随机选择K-Means++ 初始化算法
局部最优的随机波动多次运行(如 n_init=10),选取 SSE 最小结果
大型数据计算效率Mini Batch K-Means
异常值敏感中心点聚类(K-Medoids)
无法处理任意形状簇基于密度的聚类(DBSCAN)
需要手动设定 K层次聚类、基于密度的聚类(自动判定簇数)
  • Mini Batch K-Means:核心思想是在每轮迭代时,不使用全部样本更新质心,而是随机抽取一个小批量(mini-batch)样本来更新质心,从而显著提升运行速度;
  • 尽管上述方案能改善部分问题,但需要注意的是,K-Means 的固有局限性并不会完全被消除。

总结

扩展内容:其他更高阶的聚类算法

在实际应用中,K-Means 仍然是非常基础级别的算法,存在大量局限。业界已有一些更高级的聚类方法可以做了解与选用:

  • 中心点聚类(K-Medoids):与 K-Means 的不同之处在于它并不是计算出一个虚拟的质心,而强制选取一个实际存在的数据点作为簇的中心。这样使得算法对噪声和极端异常值不那么敏感;
  • 基于密度的聚类:不需要预先设定 K 值,算法会根据数据本身的密度自动计算簇的数量。它将密度足够高的数据区域划分为一个簇,能够处理任意形状(如环形、月牙形)的数据分布,且自带异常点检测能力;
  • 层次聚类:其过程与决策树有些相似。支持自顶向下或自底向上两种方向。以自底向上为例:最开始每个点单独作为一个簇,之后持续寻找距离最近的两个簇合并成一个新簇,不断合并,直到达到所期望的 K 值为止。这个方法同样不需要预先设定 K 值,算法会自行检测合理的聚类数目。

课程收束与后续预告

K-Means 是最基础的无监督学习模型之一,适合作为无监督学习的入门内容。正如作者所说,K-Means 算法"非常初级",存在较多限制,但它是理解聚类思想的重要起点。

如果对无监督学习的其他方向感兴趣,还可以了解其他相关应用。下节内容将介绍无监督学习的另一分支——数据降维:当特征数量特别多时,如何通过降维手段让特征数量变少,使数据处理更加高效。