详解 k-Means 算法
一、概念
k-Means 是一种无监督学习的聚类算法,用于将数据划分为 k 个互不重叠的簇 (clusters)。 其核心思想是:通过迭代优化,将样本分配到最近的簇中心(质心),并更新质心位置,直到收敛。
from sklearn.cluster import KMeans
二、底层流程
-
随机初始化:从数据中随机选 K 个点作为初始质心
-
分配样本:计算每个样本到所有质心的距离,分给最近的质心所属的簇
-
更新质心:对每个簇,计算簇内所有样本的均值,作为新的质心
-
重复 2、3 步:直到质心不再变化
注意:质心是向量空间里的一个坐标点,不要求恰好有一个样本在那里。
三、聚类评估方法
1. SSE(误差平方和)
-
所有样本到其质心的距离平方和
-
SSE 越小 → 簇内越紧密 → 效果越好
-
但 K 越大 SSE 一定越小(K=样本数时 SSE=0)
-
肘方法:找 SSE 突然变缓的拐点
2. SC(轮廓系数)
-
取值范围:[-1, 1]
-
越接近 1 → 效果好
-
接近 0 → 在边界上
-
为负 → 可能分错簇
-
-
越大越好
3. CH(Calinski-Harabasz 指数)
-
CH = (簇间离散度) / (簇内离散度)
-
CH 越大 → 簇间越分散,簇内越紧密 → 效果好
-
越大越好
python
# 示例代码
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, calinski_harabasz_score
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X)
sse = kmeans.inertia_
sc = silhouette_score(X, labels)
ch = calinski_harabasz_score(X, labels)
四、优缺点与适用场景
优点
-
简单直观,容易理解
-
速度快,适合大数据集
-
可解释性强(质心可以直接看)
-
只要指定 K,就能自动聚类
缺点
-
必须事先指定 K(通常不知道)
-
对初始质心敏感(不同初始化可能结果不同)
-
只能发现球形簇(无法处理复杂形状,如同心圆、细长条)
-
对异常值敏感(离群点会拉偏质心)
-
假设各簇大小、密度相近(不均匀时效果差)
适用场景
| 场景 | 说明 |
|---|---|
| ✅ 客户分群 | 电商、银行用户画像 |
| ✅ 图像压缩 | 颜色量化 |
| ✅ 数据预处理 | 先聚类再分类 |
| ✅ 文档主题划分 | 文本聚类 |
| ✅ 球形数据 | 数据分布近似球形,簇大小相近 |
五、面试回答(总分总结构)
总
k-Means 是一种无监督学习的聚类算法,用于将数据划分为 k 个互不重叠的簇。其核心思想是通过迭代优化,将样本分配到最近的簇中心(质心),并更新质心位置,直到收敛。
分
工作原理(四步循环):
-
随机初始化 K 个质心
-
把每个样本分配给离它最近的质心,形成 K 个簇
-
对每个簇,计算簇内所有样本的平均值,作为新的质心
-
重复直到质心不变
K 值怎么选:
-
肘方法(看 SSE 拐点)
-
轮廓系数(SC 越大越好)
-
CH 指数(越大越好)
-
通常结合肘方法和轮廓系数一起判断
优缺点: 优点是简单、快、可解释;缺点是需要事先指定 K,对初始值敏感,只能发现球形簇。
与监督学习的区别: 聚类没有标签,只看数据本身的相似性。分类是有标签的监督学习,聚类是无监督的探索性分析。
总
k-Means 是聚类任务的入门算法,适合数据分布近似圆形、簇大小相近的场景。不确定 K 值时用肘方法和轮廓系数辅助判断。
六、快速记忆口诀
随机选心,近者归队,队内求均,重复至稳。 肘看拐点,轮看系数,球状数据,k 值先估。