从零开始理解 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 均值中最常用的距离度量有两种:

  1. 欧式距离:最直观的 "直线距离" 比如二维平面上两点 (x₁,y₁) 和 (x₂,y₂) 的欧式距离,就是我们初中学的 "两点间距离公式": \(d = \sqrt{(x₁-x₂)² + (y₁-y₂)²}\) 推广到 n 维空间,就是所有特征差值的平方和开根号。

  2. 曼哈顿距离:像出租车在网格状街道上行驶的 "实际距离" 二维平面上的公式为:\(d = |x₁-x₂| + |y₁-y₂|\)(只算水平和垂直方向的距离总和)。

三、K 均值算法步骤:4 步实现聚类

K 均值的核心是 "迭代优化",通过 4 个步骤不断调整分组,直到结果稳定:

  1. 初始化聚类中心:随机选择 k 个样本作为初始 "中心"(k 是我们预设的聚类数量)。
  2. 分配样本:计算每个样本到 k 个中心的距离,把样本分到距离最近的中心所在的组。
  3. 更新中心:每个组内所有样本的 "均值"(比如 x₁的均值、x₂的均值)就是新的中心。
  4. 迭代收敛:重复步骤 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 库来实战,步骤如下:

  1. 生成模拟数据(用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) # 可视化原始数据

  2. 用 KMeans 聚类:

    from sklearn.cluster import KMeans

    kmeans = 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)使用。下一篇,我们将聊聊如何通过 "组合多个模型" 提升预测能力 ------ 集成学习的奥秘。

相关推荐
神齐的小马4 小时前
机器学习 [白板推导](十三)[条件随机场]
人工智能·机器学习
@Wufan5 小时前
【机器学习】7 Linear regression
人工智能·机器学习·线性回归
明月照山海-6 小时前
机器学习周报十
深度学习·机器学习·cnn
@Wufan6 小时前
【机器学习】10 Directed graphical models (Bayes nets)
人工智能·机器学习
我找到地球的支点啦6 小时前
Matlab系列(005) 一 归一化
人工智能·机器学习·matlab·信息与通信
ygy.白茶6 小时前
线性回归入门级
人工智能·python·机器学习
@Wufan7 小时前
【机器学习】9 Generalized linear models and the exponential family
人工智能·机器学习
遥感-GIS7 小时前
遥感时序分析的基石:深度剖析Harmonized Landsat Sentinel-2 (HLS) 数据集的诞生、原理、特点与应用
机器学习·时序分析·hls·数据融合·landsat·sentinel-2
Fine姐8 小时前
数据挖掘 4.1~4.7 机器学习性能评估参数
人工智能·机器学习·数据挖掘