在机器学习的无监督学习领域,聚类算法是挖掘数据内在结构的重要工具,而K 均值(K-Means)算法凭借其简洁高效的特点,成为最广泛应用的聚类算法之一。无论是用户分群、图像分割还是异常检测,都能看到它的身影。今天,我们就从基础原理出发,一步步拆解 K 均值算法,带你掌握它的核心逻辑与实际应用。
一、K 均值算法:到底在 “聚” 什么?
K 均值算法的核心目标,是将N 个样本数据划分到K 个不同的簇(Cluster) 中,使得每个簇内的样本具有极高的相似性(即簇内距离最小),而不同簇之间的样本差异尽可能大(即簇间距离最大)。这里的 “均值”,指的是每个簇的 “中心点”—— 也就是簇内所有样本的特征均值,我们称之为 “质心(Centroid)”。
简单来说,K 均值的本质就是通过不断调整质心的位置,找到最优的簇划分方案,让 “同类” 样本紧紧围绕在各自的质心周围。
二、K 均值算法的核心步骤:4 步实现聚类
K 均值算法的流程非常直观,主要分为 4 个关键步骤,且这 4 个步骤会反复迭代,直到满足停止条件。下面我们用通俗的语言拆解每一步:
1. 确定簇的数量 K
这是 K 均值算法的 “前提”—— 我们需要先指定要将数据分成多少个簇(K 值)。比如对电商用户分群时,若想分为 “高消费用户”“中等消费用户”“低消费用户”,则 K=3。
注意:K 值的选择没有固定标准,通常需要结合业务场景或通过 “肘部法则”(Elbow Method)等方法确定,这也是 K 均值的难点之一。
2. 随机初始化 K 个质心
在所有样本数据的特征空间中,随机选择 K 个样本作为初始质心。这一步的选择会影响后续迭代的效率和最终聚类结果,因此部分改进版 K 均值(如 K-Means++)会优化初始质心的选择逻辑,避免质心过于集中。
3. 计算距离,划分簇
针对每个样本,计算它与 K 个质心之间的距离(常用欧氏距离,适用于连续型特征;也可使用曼哈顿距离等),并将该样本划分到距离最近的质心所在的簇中。
例如,样本 A 与质心 1 的距离为 2,与质心 2 的距离为 5,则样本 A 会被分到质心 1 对应的簇。
4. 更新质心,重复迭代
当所有样本都划分到对应的簇后,重新计算每个簇的质心:对于每个簇,将簇内所有样本的每个特征值取平均值,得到新的质心坐标。
之后,重复步骤 3 和步骤 4,即基于新质心重新划分样本、更新质心,直到满足停止条件 —— 常见的停止条件有两种:一是质心的位置变化小于某个预设的阈值(如 0.001),二是迭代次数达到预设上限(如 100 次)。
三、K 均值算法的优缺点:适用场景很关键
优点:简洁高效,性价比高
- 计算复杂度低:K 均值的时间复杂度为 O (nkt)(n 为样本数,k 为簇数,t 为迭代次数),对大规模数据的处理速度较快,适合工业场景落地。
- 易于理解和实现:核心逻辑围绕 “距离计算” 和 “质心更新”,无需复杂的数学推导,无论是手动实现还是调用 Sklearn 等工具库,都非常便捷。
- 结果可解释性强:每个簇对应一个质心,通过分析质心的特征(如某用户簇的质心 “平均消费额” 为 500 元),能快速理解簇的含义。
缺点:这些坑要避开
- 需提前指定 K 值:K 值的选择直接影响聚类效果,若业务中无明确的簇数量定义,需多次尝试才能找到最优 K,增加了操作成本。
- 对初始质心敏感:若初始质心选择不当(如集中在数据的某一局部),可能导致算法收敛到 “局部最优解”,而非全局最优解。
- 对异常值敏感:异常值的特征值通常偏离正常样本,会严重拉偏质心的位置(如一个消费额 10 万元的异常用户,会让 “普通用户簇” 的质心大幅上升)。
- 仅适用于凸形簇:K 均值基于 “距离” 划分簇,若数据的簇是非凸形状(如环形、螺旋形),则无法准确聚类(例如,环形数据会被错误地分成两个半圆形簇)。
四、K 均值的实战应用:从理论到落地
K 均值的应用场景非常广泛,以下是几个典型案例:
- 用户分群:电商平台通过用户的 “消费金额”“购买频率”“浏览时长” 等特征,用 K 均值将用户分为 “高价值用户”“潜力用户”“流失风险用户”,针对性推送营销活动。
- 图像分割:在图像处理中,K 均值可根据像素的 RGB 值将图像分成不同的区域(如背景、主体物体),实现简单的图像分割。
- 异常检测:将正常数据聚类后,那些远离所有质心的样本(距离过大)可被判定为异常值,如信用卡交易中的异常消费、服务器日志中的异常请求。
- 文本聚类:将文本转化为词向量(如 TF-IDF)后,用 K 均值对文章进行分类,实现 “新闻聚类”“论文主题划分” 等功能。
五、工具推荐:快速实现 K 均值
在实际工作中,无需手动编写 K 均值的迭代逻辑,借助 Python 的 Sklearn 库即可快速实现:
from sklearn.cluster import KMeans
import numpy as np
# 1. 准备数据(示例:2个特征的样本数据)
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
# 2. 初始化K均值模型(K=2,迭代次数上限100)
kmeans = KMeans(n_clusters=2, max_iter=100, random_state=42)
# 3. 训练模型并得到聚类结果
y_pred = kmeans.fit_predict(X)
# 4. 查看聚类中心
print("聚类中心:", kmeans.cluster_centers_)
# 输出:聚类中心: [[1.16666667 1.46666667]
# [7.33333333 9. ]]
总结
K 均值算法是无监督学习中的 “入门级但实用级” 算法,它用最简单的逻辑解决了大部分常规的聚类需求。但在使用时,需注意 K 值的选择、异常值的处理,以及数据形状是否适合。如果你的业务场景是大规模、凸形簇的数据聚类,K 均值绝对是性价比首选;若需处理非凸簇或更复杂的数据,则可考虑 DBSCAN、层次聚类等其他算法。
1119

被折叠的 条评论
为什么被折叠?



