通俗易懂的聚类算法之K均值详解

news/2025/3/5 7:02:35/

K 均值聚类算法(K-Means Clustering) 是一种常用的无监督学习算法,用于将数据集划分为 K 个簇(Cluster)。它的核心思想是通过迭代优化,将数据点分配到最近的簇中心,并更新簇中心,直到簇中心不再变化或达到最大迭代次数。

以下是对 K 均值算法的通俗易懂的详解:


一、K 均值算法的核心思想

  1. 目标:将数据集划分为 K 个簇,使得每个数据点都属于离它最近的簇中心。
  2. 簇中心:每个簇的中心点(质心)是该簇中所有数据点的平均值。
  3. 距离度量:通常使用欧氏距离(Euclidean Distance)来计算数据点与簇中心的距离。

二、K 均值算法的步骤

  1. 初始化

    • 随机选择 K 个数据点作为初始簇中心。
    • 或者使用其他初始化方法(如 K-Means++)来优化初始簇中心的选择。
  2. 分配数据点

    • 对于每个数据点,计算它与所有簇中心的距离。
    • 将数据点分配到距离最近的簇中心所属的簇。
  3. 更新簇中心

    • 对于每个簇,重新计算其簇中心(即该簇中所有数据点的平均值)。
  4. 迭代

    • 重复步骤 2 和步骤 3,直到簇中心不再变化或达到最大迭代次数。

三、K 均值算法的示例

假设有以下二维数据集,我们希望将其划分为 2 个簇(K=2):

数据点X 坐标Y 坐标
A11
B12
C21
D88
E98
F99

步骤 1:初始化

  • 随机选择两个数据点作为初始簇中心,例如:
    • 簇中心 1:A (1, 1)
    • 簇中心 2:D (8, 8)

步骤 2:分配数据点

  • 计算每个数据点到两个簇中心的距离:

    • A 到簇中心 1:0,A 到簇中心 2:√(7² + 7²) ≈ 9.9 → A 属于簇 1。
    • B 到簇中心 1:1,B 到簇中心 2:√(7² + 6²) ≈ 9.2 → B 属于簇 1。
    • C 到簇中心 1:1,C 到簇中心 2:√(6² + 7²) ≈ 9.2 → C 属于簇 1。
    • D 到簇中心 1:9.9,D 到簇中心 2:0 → D 属于簇 2。
    • E 到簇中心 1:√(8² + 7²) ≈ 10.6,E 到簇中心 2:1 → E 属于簇 2。
    • F 到簇中心 1:√(8² + 8²) ≈ 11.3,F 到簇中心 2:√(1² + 1²) ≈ 1.4 → F 属于簇 2。
  • 分配结果:

    • 簇 1:A, B, C
    • 簇 2:D, E, F

步骤 3:更新簇中心

  • 重新计算簇中心:
    • 簇中心 1:( (1+1+2)/3, (1+2+1)/3 ) = (1.33, 1.33)
    • 簇中心 2:( (8+9+9)/3, (8+8+9)/3 ) = (8.67, 8.33)

步骤 4:迭代

  • 重复步骤 2 和步骤 3,直到簇中心不再变化。

四、K 均值算法的优缺点

优点:

  1. 简单高效算法原理简单,计算速度快。
  2. 可扩展性强:适合大规模数据集。
  3. 结果直观:簇中心可以直观地表示每个簇的特征。

缺点:

  1. 需要预先指定 K 值:K 值的选择对结果影响较大。
  2. 对初始簇中心敏感:初始簇中心的选择可能影响最终结果。
  3. 对噪声和离群点敏感:噪声数据可能导致簇中心偏移。
  4. 只能处理凸数据集:对于非凸形状的数据集,效果可能不理想。

五、K 均值算法的改进

  1. K-Means++:优化初始簇中心的选择,减少对初始值的依赖。
  2. Mini-Batch K-Means:使用数据集的子集进行迭代,适合大规模数据集。
  3. Elbow Method(肘部法):通过绘制 SSE(误差平方和)与 K 值的关系图,选择最佳的 K 值。
  4. DBSCAN:基于密度的聚类算法,适合处理噪声和非凸数据集。

六、K 均值算法的代码实现(Python)

以下是使用 Python 的 scikit-learn 库实现 K 均值算法的示例:

from sklearn.cluster import KMeans
import numpy as np# 示例数据
data = np.array([[1, 1],[1, 2],[2, 1],[8, 8],[9, 8],[9, 9]
])# 创建 KMeans 模型
kmeans = KMeans(n_clusters=2, random_state=0)# 训练模型
kmeans.fit(data)# 输出结果
print("簇中心:", kmeans.cluster_centers_)
print("数据点所属簇:", kmeans.labels_)

输出结果:

簇中心: [[1.33333333 1.33333333][8.66666667 8.33333333]]
数据点所属簇: [0 0 0 1 1 1]

七、总结

  • K 均值算法是一种简单高效的聚类算法,适合处理大规模数据集。
  • 通过迭代优化,将数据点分配到最近的簇中心,并更新簇中心。
  • 需要预先指定 K 值,且对初始簇中心敏感。
  • 可以通过改进算法(如 K-Means++)和优化 K 值选择来提高聚类效果。

http://www.ppmy.cn/news/1576757.html

相关文章

07 搜索(BFS和DFS)图的遍历

引用链接:https://blog.csdn.net/weixin_43955293/article/details/126445861深度优先搜索(DFS)和广度优先搜索(BFS)_深度优先搜索和广度优先搜索对比-CSDN博客 1、广度优先遍历(BFS) 1.1概念…

Cherno 游戏引擎笔记(91~111)

好久不见! 个人库的地址:(GitHub - JJJJJJJustin/Nut: The game_engine which learned from Cherno),可以看到我及时更新的结果。 -------------------------------Saving & Loading scene-----------------------…

嵌入式软件测试工具的“安全与效率悖论”破局之道

嵌入式软件测试工具的“安全与效率悖论”破局之道 ——从winAMS的技术底层看行业范式升级 一、行业困境:当“安全需求”撞上“交付速度” 2024年,全球嵌入式软件测试工具市场规模达52亿美元,但市场痛点并未因规模扩张而缓解‌: …

20250304笔记-阅读论文

文章目录 前言一、寻找论文1.1寻找有代码的论文方法一:浏览器扩展1.1.1使用流程 方法二:使用Papers with Code 1.2大量搜索代码 二、阅读论文所用软件 三、引用文献格式总结 前言 一、寻找论文 1.1寻找有代码的论文 方法一:浏览器扩展 浏览…

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾:周期计数代码 我们正在进行一个项目的代码优化工作,目标是提高性能。当前正在优化某个特定的代码片段,已经将其执行周期减少到48个周期。为了实现这一目标,我们设计了一个…

【大模型基础_毛玉仁】0.概述

更多内容:XiaoJ的知识星球 【大模型基础_毛玉仁】 系列文章参考 系列文章 【大模型基础_毛玉仁】0.概述 【大模型基础_毛玉仁】1.1 基于统计方法的语言模型 更新中。。。。。。 参考 书籍:大模型基础_完整版.pdf Github:https://github.co…

计算机毕设-基于springboot的拖恒ERP-物资管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

一个开源且免费的 .NET CMS 和应用程序框架

前言 今天大姚给大家分享一个开源且免费的 .NET CMS 和应用程序框架:Cofoundry。 项目介绍 Cofoundry是一个开源且免费的 .NET CMS 和应用程序框架,专注于代码优先的开发模式、无侵入的集成方式、可扩展且灵活的架构以及简单且用户友好的内容管理。 …