当前位置: 首页 > news >正文

从零开始理解 K 均值聚类:原理、实现与应用

一、什么是聚类?从 “物以类聚” 说起

聚类属于机器学习中的 “无监督学习”—— 也就是说,我们手里只有数据,没有提前标注的 “标签”(比如 “这是高消费客户”“这是低消费客户”)。聚类的核心思想很简单:让相似的样本聚在一起,不相似的样本分开

举个例子,假设有 5 个样本(A、B、C、D、E),每个样本有两个特征(x₁和 x₂),数据如下:

样本x₁x₂
A31
B10
C12
D04
E25

直观来看,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)  # 可视化原始数据
  1. 用 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)使用。下一篇,我们将聊聊如何通过 “组合多个模型” 提升预测能力 —— 集成学习的奥秘。

http://www.dtcms.com/a/342678.html

相关文章:

  • Grafana侧重可视化,那多数据源告警呢?
  • Linux的奇妙冒险——进程间通信(管道、SystemV IPC)
  • 【实战记录】麒麟服务器操作系统安装KSC-Defender安全中心全指南
  • EagleTrader交易员采访|交易是一场概率游戏
  • 免费DirectX修复工具?游戏运行异常?【图文详解】dll修复工具?D3DX9_43.dll丢失
  • 【科研绘图系列】R语言绘制序列分析图
  • Rust 的流程控制与函数
  • SQL 中 DISTINCT 的全方位指南:从基础用法到性能优化
  • 【51单片机】【protues仿真】基于51单片机温度烟雾控制系统
  • C++项目实战——高性能内存池(一)
  • Redis面试精讲 Day 26:Redis源码分析:事件循环与网络模型
  • docker使用和部署深化学习
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第一章知识点问答(21题)
  • 华为AUTOSAR质量目标与开发实践
  • LeetCode100 -- Day3
  • 常德二院全栈国产化实践:KingbaseES 数据库的关键作用
  • 机器学习聚类算法学习报告
  • Spring容器Bean的创建流程
  • 使用jwt+redis实现单点登录
  • Matplotlib+HTML+JS:打造可交互的动态数据仪表盘
  • Android - 统一资源标识符 Uri
  • 利用DeepSeek编写调用系统命令用正则表达式替换文件中文本的程序
  • [NCTF2019]True XML cookbook
  • PyTorch Vision 系列:高效数据处理的利器
  • 动手学深度学习(pytorch版):第五章节—深度学习计算(2)参数管理
  • 进程和进程调度
  • Rclone入门对象存储云到云迁移
  • 我从零开始学微积分(2)- 函数与图形
  • YOLO --- YOLOv3以及YOLOv4模型详解
  • Redis Hash数据类型深度解析:从命令、原理到实战场景