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

K-Means 算法详解

K-Means 是一种常用的无监督学习算法,广泛应用于数据聚类分析。本文将详细讲解 K-Means 算法的原理、步骤、公式以及 Python 实现,帮助你深入理解这一经典算法。

什么是 K-Means 算法?

K-Means 算法是一种基于原型的聚类算法,其目标是将数据集分成K个簇(clusters),使得同一簇内的数据点尽可能相似,不同簇之间的数据点尽可能不同。每个簇由其中心(即质心,centroid)表示。

K-Means 算法的步骤

K-Means 算法的主要步骤如下:

  1. 初始化:随机选择 K个数据点作为初始质心。
  2. 分配簇:将每个数据点分配到距离其最近的质心对应的簇。
  3. 更新质心:计算每个簇的质心,即簇内所有数据点的平均值。
  4. 重复步骤 2 和 3:直到质心不再发生变化(或变化很小),或者达到预设的迭代次数。

详细步骤解释

  1. 初始化

    • 从数据集中随机选择K 个点作为初始质心。这些质心可以是数据集中的实际点,也可以是随机生成的点。
  2. 分配簇

    • 计算每个数据点到所有质心的距离(通常使用欧氏距离)。对于数据点 ( x i ) \ (x_i )  (xi) 和质心 ( μ j ) (\mu_j) (μj),欧氏距离计算公式为:
      d ( x i , μ j ) = ∑ m = 1 M ( x i m − μ j m ) 2 \ d(x_i, \mu_j) = \sqrt{\sum_{m=1}^M (x_{im} - \mu_{jm})^2} \  d(xi,μj)=m=1M(ximμjm)2  
    • 将每个数据点分配到距离其最近的质心对应的簇,即:
      C i = { x p : ∥ x p − μ i ∥ ≤ ∥ x p − μ j ∥ , ∀ j , 1 ≤ j ≤ k } \ C_i = \{ x_p : \| x_p - \mu_i \| \leq \| x_p - \mu_j \|, \forall j, 1 \leq j \leq k \} \  Ci={xp:xpμixpμj,j,1jk} 
  3. 更新质心

    • 对每个簇 ( C i ) \ ( C_i )  (Ci),计算簇内所有数据点的平均值,并将该平均值作为新的质心。新的质心计算公式为:
      μ i = 1 ∣ C i ∣ ∑ x j ∈ C i x j \ \mu_i = \frac{1}{|C_i|} \sum_{x_j \in C_i} x_j \  μi=Ci1xjCixj 
  4. 重复

    • 重复分配簇和更新质心的步骤,直到质心位置不再发生变化或达到最大迭代次数。

K-Means 算法的优化目标

K-Means 算法的优化目标是最小化所有数据点到其所属簇质心的距离平方和。优化目标函数可以表示为:
J = ∑ i = 1 k ∑ x j ∈ C i ∥ x j − μ i ∥ 2 \ J = \sum_{i=1}^k \sum_{x_j \in C_i} \| x_j - \mu_i \|^2 \  J=i=1kxjCixjμi2 

该目标函数也称为聚类内的总平方误差(Total Within-Cluster Sum of Squares,简称 TSS)。

K-Means 算法的优缺点

优点

  1. 简单易懂:K-Means 算法原理简单,容易实现。
  2. 速度快:算法收敛速度快,适合处理大规模数据集。
  3. 适用范围广:在许多实际问题中表现良好。

缺点

  1. 选择 ( k ) 值的困难:需要预先指定簇的数量 ( k ),而合适的 ( k ) 值通常不易确定。
  2. 对初始值敏感:初始质心的选择会影响最终结果,可能陷入局部最优解。
  3. 对异常值敏感:异常值可能会显著影响质心的位置。

K-Means 算法的 Python 实现

下面通过 Python 代码实现 K-Means 算法,并以一个示例数据集展示其应用。

导入库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeansplt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

生成示例数据集

# 生成示例数据集
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.show()

应用 K-Means 算法

# 应用 K-Means 算法
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='x')
plt.show()

原始数据集

在这里插入图片描述

结果解释

在上面的示例中,我们生成了一个有 4 个簇的示例数据集,并使用 K-Means 算法对其进行聚类。最终,我们通过可视化展示了聚类结果以及每个簇的质心。

总结

K-Means 算法是一种简单而有效的聚类算法,广泛应用于各种数据分析和机器学习任务中。本文详细介绍了 K-Means 算法的原理、步骤、公式以及 Python 实现。虽然 K-Means 算法有一些缺点,但通过合理选择参数和预处理数据,可以在许多实际应用中取得良好的效果。希望本文能帮助你更好地理解和应用 K-Means 算法。

相关文章:

  • 游戏中的寻路算法研究
  • 解决内核模块加载使用-f参数无法加载的问题
  • 为什么要学Java?
  • Linux驱动开发(二)--字符设备驱动开发提升 LED驱动开发实验
  • 18个机器学习核心算法模型总结
  • 2025计算机毕业设计选题题目推荐-毕设题目汇总大全
  • 智慧校园综合管理系统:打造高效智慧的学校管理平台
  • 契约锁电子签章平台 add 远程命令执行漏洞复现(XVE-2023-23720)
  • 关于面试被面试官暴怼:“几年研究生白读” 的前因后果
  • React获取DOM节点
  • 【Android】基于webView打造富文本编辑器(H5)
  • 网络故障排查-TCP标志位
  • VB.net调用VC DLL(二)
  • AD域离线破解新思路:Trustroasting和TimeRoasting
  • HTML(13)——显示模式
  • 【mysql】环境安装、服务启动、密码设置
  • 【知识碎片】第三方登录弹窗效果
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • conda常用的命令
  • Hibernate【inverse和cascade属性】知识要点
  • idea + plantuml 画流程图
  • IDEA 插件开发入门教程
  • iOS小技巧之UIImagePickerController实现头像选择
  • LeetCode29.两数相除 JavaScript
  • Magento 1.x 中文订单打印乱码
  • maven工程打包jar以及java jar命令的classpath使用
  • PermissionScope Swift4 兼容问题
  • Quartz初级教程
  • React Transition Group -- Transition 组件
  • 阿里云Kubernetes容器服务上体验Knative
  • 从重复到重用
  • 对超线程几个不同角度的解释
  • 开发基于以太坊智能合约的DApp
  • 力扣(LeetCode)22
  • 每天一个设计模式之命令模式
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Python 之网络式编程
  • 回归生活:清理微信公众号
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #include<初见C语言之指针(5)>
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (LeetCode 49)Anagrams
  • (web自动化测试+python)1
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (二十三)Flask之高频面试点
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (四)图像的%2线性拉伸
  • (转)socket Aio demo
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)