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 的迭代原理非常简单,核心步骤就是:选中心、分簇、更新中心、再分簇,直到收敛稳定。具体流程如下:
- 初始化中心点:需要手工指定一个 K 值(根据肉眼观察数据大约有几个簇),随机选择 K 个点作为最开始的质心;
- 分配样本:计算每个样本到这些质心的距离,把它归属到离它最近的质心所在的簇;
- 更新质心:利用公式重新计算每个簇内所有点的质心,得到 K 个新质心;
- 重复分配与更新:将所有样本与这 K 个新质心重新做距离判断,样本的归属可能发生改变(有的点从这个簇换到另一个簇);
- 判断收敛:停止迭代的条件有三种,满足任一即可:
- 质心的位置不再发生变化;
- 样本的归属不再发生改变;
- 达到最大迭代次数(防止死循环)。
- 评估效果:聚类完成后,计算 SSE 来评估效果。
方法与步骤
手工实现 K-Means 的演示逻辑
文中通过代码演示了 K-Means 的执行过程,核心思路如下(伪代码梳理):
数据准备
- 生成 300 个样本;
- 设置分成 4 个簇;
- 参数
0.6控制簇的稀疏程度; - 使用工具生成散点分布样本数据。
手工实现基本流程
- 随机初始化:使用
random.choice方法,随机选择 K 个点作为初始质心; - 分配样本:计算每个样本到每个中心点的距离,对每一行判断它到哪个中心点最近,就将样本归属为对应的标签。这样得到 K 个簇,每个簇下面有一些样本;
- 更新质心:对每个簇内的所有样本重新求均值,计算新的中心点;
- 收敛检查:检查之前的中心点与现在的中心点的差距是否有变化:
- 如果有变化则继续迭代;
- 如果不再变化则跳出循环;
- 迭代上限:设置最大迭代次数为 15 次,如果 15 次之后还未收敛,则按最后一次的结果输出。
演示过程中的观察
- 第 1 次迭代:完成初始质心随机初始化后,给样本标记归属;
- 第 2-4 次迭代:不断更新质心位置,部分样本被分到这个簇或那个簇;
- 第 6 次迭代:质心位置基本不再变动,聚类完成。
从可视化结果可以看到,刚开始质心是随机分布,随着不断迭代,质心位置和簇内样本归属逐渐趋于稳定,最终形成的聚类结果与初始随机状态有明显差别。
案例与数据
优化方案一:K-Means++(改进初始质心选择)
问题背景
K-Means 的第一个不稳定因素是随机选择初始化的质心。不同的初始化方式可能导致:
- 算法陷入较差的局部最优解;
- 聚类结果存在明显差异。
K-Means++ 的核心策略
K-Means++ 在选取初始质心时做了改进,不再是全部随机选择:
- 选择第一个质心:先从样本点中随机挑选一个样本点作为第一个质心;
- 选择后续质心:不再是完全随机选择,而是尽可能挑选距离已有质心(或已选质心集合)较远的样本点作为新的质心。
举例说明:如果第一个选了这个点,下一步就找一个距离这个点最远的点做质心;再下一步找距离这两个点都比较远的点做质心。
这样做的目的是防止像随机选择那样,初始时几个质心恰好都集中在一小片区域内,导致其他区域的分簇出现困难。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 减少颜色数量
任务目标
将一张彩色图片进行颜色压缩,只用少数几种颜色表示整张图片。
操作步骤
- 读取本地图片:通过代码读取图像,注意正确配置图片路径;
- 数据归一化:图像中的每个颜色由 RGB 三原色组成,每个原色的数值范围在 0~255 之间。将所有像素值除以 255,使数值归一化到 0~1 之间,形成一个像素矩阵;
- 设置不同簇数:分别设置 K=4、K=16、K=64 进行聚类;
- 聚类压缩颜色:聚类完成后,用每个簇的质心颜色替代簇内所有像素点的原颜色。例如图像本来有上万种颜色,K=4 时仅用 4 种质心颜色来表示;
- 对比效果:将不同 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 算法"非常初级",存在较多限制,但它是理解聚类思想的重要起点。
如果对无监督学习的其他方向感兴趣,还可以了解其他相关应用。下节内容将介绍无监督学习的另一分支——数据降维:当特征数量特别多时,如何通过降维手段让特征数量变少,使数据处理更加高效。