从零开始理解 K 均值聚类:原理、实现与应用
一、什么是聚类?从 “物以类聚” 说起
聚类属于机器学习中的 “无监督学习”—— 也就是说,我们手里只有数据,没有提前标注的 “标签”(比如 “这是高消费客户”“这是低消费客户”)。聚类的核心思想很简单:让相似的样本聚在一起,不相似的样本分开。
举个例子,假设有 5 个样本(A、B、C、D、E),每个样本有两个特征(x₁和 x₂),数据如下:
样本 | x₁ | x₂ |
---|---|---|
A | 3 | 1 |
B | 1 | 0 |
C | 1 | 2 |
D | 0 | 4 |
E | 2 | 5 |
直观来看,A、B、C 的 x₁和 x₂数值更接近,D 和 E 的数值更接近,这就是聚类要捕捉的 “相似性”。
二、K 均值的核心:如何定义 “相似”?距离度量是关键
判断样本是否 “相似”,本质是计算样本间的 “距离”—— 距离越近,越相似。K 均值中最常用的距离度量有两种:
欧式距离:最直观的 “直线距离” 比如二维平面上两点 (x₁,y₁) 和 (x₂,y₂) 的欧式距离,就是我们初中学的 “两点间距离公式”: \(d = \sqrt{(x₁-x₂)² + (y₁-y₂)²}\) 推广到 n 维空间,就是所有特征差值的平方和开根号。
曼哈顿距离:像出租车在网格状街道上行驶的 “实际距离” 二维平面上的公式为:\(d = |x₁-x₂| + |y₁-y₂|\)(只算水平和垂直方向的距离总和)。
三、K 均值算法步骤:4 步实现聚类
K 均值的核心是 “迭代优化”,通过 4 个步骤不断调整分组,直到结果稳定:
- 初始化聚类中心:随机选择 k 个样本作为初始 “中心”(k 是我们预设的聚类数量)。
- 分配样本:计算每个样本到 k 个中心的距离,把样本分到距离最近的中心所在的组。
- 更新中心:每个组内所有样本的 “均值”(比如 x₁的均值、x₂的均值)就是新的中心。
- 迭代收敛:重复步骤 2 和 3,直到中心不再明显变化(或达到最大迭代次数),此时的分组就是最终结果。
举个简单的例子:如果要把上述 5 个样本聚成 2 类(k=2),可能先随机选 A 和 D 作为初始中心,然后根据距离把 B、C 分到 A 组,E 分到 D 组,再重新计算两组的均值作为新中心,直到分组稳定。
四、如何评估聚类效果?CH 指标来帮忙
聚类的难点之一是 “怎么知道分的好不好”。K 均值中常用CH 指标(Calinski-Harabasz 指数):
- 计算 “类内紧密度”:每个样本到所在组中心的距离平方和(越小越好);
- 计算 “类间分离度”:各组中心到所有样本总中心的距离平方和(越大越好);
- CH 指标 = (分离度 / 紧密度)× 调整系数,数值越大,说明聚类效果越好(类内越紧凑,类间越分散)。
五、K 均值的优缺点:适用场景与局限
- 优点:简单易实现,计算速度快,适合处理大规模常规数据集。
- 缺点:
- k 值需要人工预设(很难一开始就确定最佳 k);
- 对初始中心敏感(不同初始中心可能得到不同结果);
- 只能发现 “凸形” 簇(比如圆形、椭圆形),对不规则形状的簇(如月牙形)效果差。
六、实战:用 Python 实现 K 均值聚类
我们用 scikit-learn 库来实战,步骤如下:
- 生成模拟数据(用
make_blobs
函数):
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt# 生成3个簇的数据集,100个样本,2个特征
X, y_true = make_blobs(n_samples=100, n_features=2, centers=3, random_state=42)
plt.scatter(X[:, 0], X[:, 1], s=50) # 可视化原始数据
- 用 KMeans 聚类:
from sklearn.cluster import KMeanskmeans = KMeans(n_clusters=3, random_state=42) # 设定k=3
y_pred = kmeans.fit_predict(X) # 训练并预测分组# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=50, cmap='viridis')
centers = kmeans.cluster_centers_ # 提取最终聚类中心
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.7, marker='X') # 标记中心
运行后,就能看到数据被分成 3 组,红色 “X” 是各组中心,效果一目了然。
总结
K 均值是聚类算法中的 “入门款”,凭借简单高效的特点,在客户分群、图像分割、异常检测等场景中广泛应用。但它也有局限,实际使用时需结合数据特点选择合适的距离度量和 k 值,必要时搭配其他聚类算法(如 DBSCAN)使用。下一篇,我们将聊聊如何通过 “组合多个模型” 提升预测能力 —— 集成学习的奥秘。