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

相关推荐
JJJJ_iii13 小时前
【机器学习12】无监督学习:K-均值聚类与异常检测
人工智能·笔记·python·学习·机器学习·均值算法·聚类
彩云回1 天前
多维尺度分析法(MDS)
人工智能·机器学习·1024程序员节
FL16238631291 天前
智慧交通红绿灯检测数据集VOC+YOLO格式1215张3类别
深度学习·yolo·机器学习
兩尛1 天前
神经网络补充知识
人工智能·神经网络·机器学习
电鱼智能的电小鱼1 天前
基于电鱼 ARM 工控机的煤矿主控系统高可靠运行方案——让井下控制系统告别“死机与重启”
arm开发·人工智能·嵌入式硬件·深度学习·机器学习
长桥夜波1 天前
机器学习日报09
人工智能·机器学习
TGITCIC1 天前
通过神经网络手搓一个带finetune功能的手写数字识别来学习“深度神经网络”
人工智能·深度学习·机器学习·卷积神经网络·dnn·文字识别·识别数字
yumgpkpm1 天前
CMP(类ClouderaCDP7.3(404次编译) )完全支持华为鲲鹏Aarch64(ARM)使用 AI 优化库存水平、配送路线的具体案例及说明
大数据·人工智能·hive·hadoop·机器学习·zookeeper·cloudera
Cathy Bryant1 天前
智能模型对齐(一致性)alignment
笔记·神经网络·机器学习·数学建模·transformer