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

【漫话机器学习系列】269.K-Means聚类算法(K-Means Clustering)

一、K-Means 聚类算法简介

K-Means 是一种基于距离的无监督机器学习算法,属于聚类算法(Clustering Algorithm)。它的目标是将数据集划分为 K 个不重叠的子集(簇),使得每个子集中的数据点尽可能相似,而不同子集之间的数据点差异尽可能大。

由于其实现简单、效率高,被广泛应用于市场细分、图像压缩、社群发现、推荐系统等领域。


二、K-Means 算法原理(图解步骤)

我们先看一张图,了解 K-Means 的基本执行流程:


图源:Chris Albon

该图将 K-Means 的核心过程总结为四个步骤:

Step 1:随机初始化 K 个中心点

选择 K 个初始的聚类中心(Centroids),一般是从样本中随机挑选。K 值需要事先指定,不同的 K 值会产生不同的聚类效果。

初始中心点的选择会对最终聚类结果产生影响,K-Means++ 是一种改进的初始化方法。


Step 2:将每个样本分配到最近的中心点

对于每一个样本点,计算其与所有 K 个中心点的距离(常用欧几里得距离),并将其归入最近的中心所代表的簇。

这是“聚类”的过程,形成 K 个子集。


Step 3:更新中心点位置

对于每个簇,重新计算其所有样本的几何中心(均值),作为新的中心点。

新的中心点就是该簇中所有点坐标的平均值。


Step 4:重复步骤 2 和 3,直到收敛

不断重复样本分配(Step 2)中心更新(Step 3),直到没有样本发生簇变更,或者中心点变化非常小(小于阈值),即认为算法收敛

K-Means 会在有限次迭代后停止,通常收敛较快。


三、K-Means 算法实现(伪代码)

def kmeans(X, K):初始化 K 个中心点(可以随机选取)while 中心点未收敛:将每个样本分配给最近的中心点重新计算每个簇的中心点return 各个簇及其中心点

你可以使用 sklearn.cluster.KMeans 模块直接调用实现:

from sklearn.cluster import KMeanskmeans = KMeans(n_clusters=3, random_state=0).fit(X)
labels = kmeans.labels_  # 每个样本所属簇
centers = kmeans.cluster_centers_  # 中心点

四、K 值选择方法

K 值对聚类质量影响极大。常见的确定方法包括:

  • 肘部法则(Elbow Method):绘制误差平方和 SSE 与 K 的关系图,寻找“拐点”;

  • 轮廓系数(Silhouette Score):评估聚类的紧密度与分离度;

  • Gap Statistic:与参考模型比较聚类效果。


五、优缺点总结

优点缺点
实现简单,计算效率高需手动指定 K 值
适合大规模数据对初始中心敏感
可解释性强只适用于凸形聚类,不能处理非线性边界

六、应用场景示例

  • 客户群体划分(市场营销)

  • 图像分割(图像处理)

  • 文章/新闻主题分类

  • 商品推荐系统中的用户分群


七、结语

K-Means 是数据科学和机器学习中最基础也最重要的聚类算法之一。掌握它的原理和实现,是学习更复杂聚类模型(如 DBSCAN、Gaussian Mixture Model 等)的重要基础。

图中的简要流程总结清晰明了,建议初学者反复理解图示四步,结合代码动手实践,加深理解。

如果你觉得本文对你有帮助,欢迎点赞、收藏、关注,获取更多机器学习干货!


参考资料:

  • Chris Albon 原始手写图解(https://chrisalbon.com)

  • Scikit-learn 官方文档:2.3. Clustering — scikit-learn 1.6.1 documentation

http://www.xdnf.cn/news/7537.html

相关文章:

  • 健康养生指南:科学生活,活力常驻
  • BI行业分析思维框架 - 环保行业分析(一)
  • 【JavaWeb】MyBatis
  • Python类的力量:第六篇:设计模式——Python面向对象编程的“架构蓝图”
  • 人工智能核心知识:AI Agent 的四种关键设计模式
  • ssm项目环境搭建
  • 【漫话机器学习系列】270.KNN算法(K-Nearest Neighbors)
  • JDK8到JDK17最常用的核心功能
  • mariadb-cenots8安装
  • 基于开源链动2+1模式AI智能名片S2B2C商城小程序的社群构建与新型消费迎合策略研究
  • 【Linux】第二十二章 访问网络附加内存
  • OpenCv高阶(8.0)——答题卡识别自动判分
  • 驱动开发硬核特训 · Day 31:理解 I2C 子系统的驱动模型与实例剖析
  • 前端开发——前端样式BUG调试全指南2025终极版
  • 什么是数据中台
  • TYUT-企业级开发教程-第8章
  • RK3568 OH5.1 搭建环境及源码获取
  • C/C++ 整数类型的长度
  • 基于CodeBuddy的Craft完成一个数字华容道的小游戏
  • File的使用
  • 79、modelsim单独仿真altera带IP核的文件
  • 如何解决全局或静态变量被修改的bug
  • 基于R语言的空间异质性数据分析技术
  • Vue 3 ~ 3.5 版本useTemplateRef使用
  • Vue3.0教程005:watch监视ref定义的【基本类型】数据和【对象类型】数据
  • Vortex GPGPU的github流程跑通与功能模块波形探索(三)
  • 系统设计——项目设计经验总结1
  • arcgispro双击打开没反应怎么办
  • 基于 ABP vNext + CQRS + MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战
  • ubuntu设置conda虚拟环境