聚类分析算法——K-means聚类 详解

        K-means 聚类是一种常用的基于距离的聚类算法,旨在将数据集划分为 K 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面,我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。


1. K-means 的核心思想

        K-means 的目标是将数据集划分为 K 个簇(clusters),使得每个数据点属于距离最近的簇中心。通过反复调整簇中心的位置,K-means 不断优化簇内的紧密度,从而获得尽量紧凑、彼此分离的簇。

核心思想

  • 簇(Cluster):K-means 通过最小化簇内距离的平方和,使得数据点在簇内聚集。
  • 簇中心(Centroid):簇中心是簇中所有点的平均值,表示簇的中心位置。
  • 簇分配和更新:K-means 通过不断更新簇分配和簇中心,来逐步收敛。

2. K-means 的算法步骤

        K-means 聚类的流程分为两个主要步骤:分配(Assignment)更新(Update)。以下是详细步骤:

  1. 选择 K 值
    设定簇的数量 K

  2. 初始化簇中心
    随机选择 K 个数据点作为初始簇中心(centroids)。

  3. 分配步骤(Assignment Step)
    对于数据集中的每个点,将它分配到最近的簇中心对应的簇。这里的“距离”通常使用欧氏距离(Euclidean distance)。

  4. 更新步骤(Update Step)
    根据当前的簇分配,重新计算每个簇的中心,即计算簇内所有点的均值作为新的簇中心。

  5. 重复 3 和 4 步
    不断重复分配和更新步骤,直到簇中心不再发生变化(收敛)或达到指定的最大迭代次数。


3. K-means 的数学公式

        K-means 的目标是最小化簇内平方误差和(Within-Cluster Sum of Squares,WCSS),即每个点到其所属簇中心的距离的平方和,公式如下:

其中:

  • K 是簇的数量。
  • C_{i}是第 i 个簇的点集。
  • x是属于 C_{i} 的数据点。
  • \mu _{i}是第 i 个簇的中心。
  • \left | \right |x-\mu _{i}\left | \right |^{2} 表示数据点 x 与簇中心 \mu _{i} 之间的欧氏距离平方。

欧氏距离

K-means 通常采用欧氏距离来衡量点到簇中心的距离,其公式为:

d\left ( x,\mu \right )=\sqrt{\sum_{j=1}^{n}\left ( x_{j}-\mu _{j} \right )^{2}}

其中 n 是数据的维度。


4. K-means 的伪代码

KMeans(X, K):1. 随机选择 K 个点作为初始簇中心2. 重复以下步骤,直到簇中心不再发生变化:a. 分配每个点到最近的簇中心b. 重新计算每个簇的中心,作为簇内所有点的均值3. 返回最终的簇分配和簇中心

分配步骤(Assignment Step)

对于每个数据点,找到距离最近的簇中心  μj​:

c_{i}=arg \underset{j}{min}\left | \right | x_{i}-\mu _{j} \left | \right |

更新步骤(Update Step)

更新每个簇的中心 \mu _{j} 为簇内所有点的均值:

\mu _{j}=\frac{1}{\left | C_{j} \right |}\underset{x\in C_{j}}{\sum }x


5. K-means 的时间复杂度分析

  • 每次分配步骤:需要计算每个点到 K 个簇中心的距离,复杂度为 O(n*K)
  • 更新步骤:重新计算每个簇的中心,需要遍历所有点,复杂度也是 O(n*K)
  • 总复杂度:若迭代次数为 T,则总体复杂度为 O(n*K*T)

6. K-means 的优缺点

优点

  • 简单高效:在样本数量较少或维度较低时效果很好。
  • 收敛速度快:在适合的初始中心选择下,K-means 通常可以较快收敛。

缺点

  • 对初始点敏感:初始簇中心的选择对最终结果影响较大。
  • 只能发现球形簇:K-means 假设每个簇是凸形且大小相近,不能处理非球形的簇。
  • 对离群点敏感:离群点会影响簇的中心计算。

7. K 值的选择

确定最佳的簇数 K 是 K-means 聚类中的一个难点。常用的选择方法有:

  1. 肘部法(Elbow Method)
    绘制不同 K 值下的 WCSS 图,寻找“肘部”点作为最佳 K值。

  2. 轮廓系数(Silhouette Coefficient)
    衡量聚类结果的紧密度和分离度。通常,轮廓系数越高,聚类效果越好。

  3. Calinski-Harabasz 指数
    衡量簇内的方差与簇间方差之比,值越大越好。


8. Python 实现 K-means

我们可以使用 scikit-learn 中的 KMeans,以及手动实现以便更深入理解。

8.1 使用 scikit-learn 实现 K-means

from sklearn.cluster import KMeans
import numpy as np# 生成示例数据
X = np.array([[1, 2], [2, 2], [3, 3], [8, 7], [8, 8], [25, 80]])# 初始化并训练 KMeans 模型
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)# 获取簇标签和簇中心
labels = kmeans.labels_
centroids = kmeans.cluster_centers_print("Cluster labels:", labels)
print("Centroids:", centroids)

输出

Cluster labels: [0 0 0 1 1 1]
Centroids: [[ 2.   2.33333333][13.66666667 31.66666667]]

8.2 手动实现 K-means 算法

以下是 K-means 的核心逻辑手动实现:

import numpy as npdef initialize_centroids(X, k):indices = np.random.choice(len(X), k, replace=False)return X[indices]def closest_centroid(X, centroids):distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)return np.argmin(distances, axis=1)def update_centroids(X, labels, k):return np.array([X[labels == i].mean(axis=0) for i in range(k)])def kmeans(X, k, max_iters=100, tol=1e-4):centroids = initialize_centroids(X, k)for i in range(max_iters):labels = closest_centroid(X, centroids)new_centroids = update_centroids(X, labels, k)if np.all(np.abs(new_centroids - centroids) < tol):breakcentroids = new_centroidsreturn labels, centroids# 示例数据
X = np.array([[1, 2], [2, 2], [3, 3], [8, 7], [8, 8], [25, 80]])# 运行 K-means
labels, centroids = kmeans(X, k=2)
print("Cluster labels:", labels)
print("Centroids:", centroids)

9. 收敛性与初始中心的选择

        K-means 的收敛性受到初始簇中心选择的影响。K-means++ 是一种改进的初始化方法,可以帮助选择更合理的初始中心,减少陷入局部最优的风险。

K-means++ 初始中心选择步骤

  1. 随机选择一个点作为第一个中心。
  2. 对于每个点,计算其与已选择中心的最小距离。
  3. 根据与最近中心的距离平方值选择下一个中心,概率越大则越有可能成为下一个中心。

10. 总结

        K-means 是一种简单、快速的聚类算法,广泛应用于数据聚类任务。通过反复优化簇中心位置,K-means 不断收敛并找到数据的聚类结构。然而,它对初始条件敏感,对簇形状有限制,适合于球形且均匀分布的簇。在实际应用中,可通过结合 K-means++、肘部法和轮廓系数等手段改进其效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Easy Excel合并单元格情况简单导入导出

需求 实现报表数据的导入导出&#xff0c;表格中部分数据是系统生成&#xff0c;部分数据是甲方填写&#xff0c;录入系统。 批号唯一 Maven <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.…

《IDE 巧用法宝:使用技巧全解析与优质插件推荐》

在日常撸代码的时候&#xff0c;相信兄弟们在IDEA 中用到不少插件&#xff0c;利用插件&#xff0c;不仅可以提高工具效率&#xff0c;撸起代码来&#xff0c;也格外的娃哈哈…… 一、IntelliJ IDEA 作为一个资深 Java 程序员&#xff0c;除了 IDEA 中默认的插件&#xff0c;我…

linux入门之必掌握知识点

#1024程序员节&#xff5c;征文# Linux基础 top命令详解 top命令是用来查看进程系统资源使用情况的工具&#xff0c;它可以动态的现实。 top命令执行后&#xff0c;按大写M可以按内存使用情况进行排序&#xff0c;大写P可以按CPU使用情况进行排序&#xff0c;大写H可以显示线…

GNN+A2C 强化学习训练一个粒子避障决策模型

最近想尝试下使用GNN A2C 进行强化学习&#xff0c;GNN 可以充当一个特征提取器&#xff0c;这样可以增加强化学状态空间因为张量长度受限泛化能力不足的缺点&#xff0c;之前做强化学习的时候受限于需要在环境里提取每个对手的特征&#xff0c;在每个不同场景下因为对手的数量…

使用excel.js(layui-excel)进行layui多级表头导出,根据单元格内容设置背景颜色,并将导出函数添加到toolbar

本段是菜狗子的碎碎念&#xff0c;解决办法请直接从第二段开始看。layui多级表头的导出&#xff0c;弄了两天才搞定&#xff0c;中途一度想放弃&#xff0c;还好坚持下来了。一开始用的是layui的toolbar里自带的那个导出&#xff0c;但是多级表头没有正常导出&#xff0c;单元格…

【功能安全】技术安全概念TSC

目录 01 TSC定义 02 TSC注意事项 03 TSC案例 01 TSC定义 所处位置 TSC:Technical safety concept技术安全概念 TSR:Technical safety requirement技术安全需求 在系统开发阶段属于安全活动4-6 系统层产品开发示例 TSC目的

Codeforces Round 981 (Div. 3)

前言&#xff1a; 记录一下自己昨天晚上打的div3吧&#xff0c;感觉自己好久没写博客&#xff0c;以后可能会更新一些其他内容&#xff0c;在这里先买个关子&#xff0c;我要现在今年沉淀几个月&#xff0c;所以这几天可能不会更新博客&#xff0c;今天先出来冒个泡先。 正文&a…

数理统计(第3章:单侧假设检验)

目录 概念&#xff0c;步骤 单个正态母体 两个正态母体 概念&#xff0c;步骤 如果构造统计量是一个未知数&#xff0c;则构造不成统计量&#xff0c;所以拿来构造统计量&#xff0c;用保守估计作为假设&#xff1a;有无显著提高&#xff0c;减小&#xff0c;则假设没有显著…

【在Win11下安装ubuntu +图形化界面】

在win11下安装ubuntu 一、安装流程1. 前期准备&#xff1a;先配置好基础设置2. 安装 ubuntu3. ubuntu进行配置4. 下载图形化界面 并安装 二、遇到的问题问题1. win11安装wsl报错&#xff1a;无法解析服务器的名称或地址1. 方法一&#xff1a;更改DNS&#xff08;对本人无效&…

SpringBoot最佳实践之 - 项目中统一记录正常和异常日志

1. 前言 此篇博客是本人在实际项目开发工作中的一些总结和感悟。是在特定需求背景下&#xff0c;针对项目中统一记录日志(包括正常和错误日志)需求的实现方式之一&#xff0c;并不是普适的记录日志的解决方案。所以阅读本篇博客的朋友&#xff0c;可以参考此篇博客中记录日志的…

【问题解决】三维相关:​Unity Package Manager中没有Newtonsoft Json‌​

问题&#xff1a; 在Unity开发中&#xff0c;用到复杂的json的数据格式&#xff0c;需要将对象和json数据之间相互转换。Unity原生json支持不适用复杂json&#xff08;例如嵌套数组、动态键值对等&#xff09;。大部分人推荐直接在Package Manager中搜索导入(如怎么在unity3D工…

Jupyter Notebook 中使用render_notebook渲染pyecharts图像不显示的一种情况

一开始我发现自己的jupyter文件在渲染pyecharts图片时一开始可以显示&#xff0c;但后来不知道怎么的就不显示了&#xff0c;查找了很多方法&#xff0c;但是没有效果&#xff0c;都是改js渲染什么的&#xff0c;还有就是参数不对的&#xff0c;对于我来说都没什么用&#xff0…

excel中,将时间戳(ms或s)转换成yyyy-MM-dd hh:mm.ss或毫秒格式

问题 在一些输出为时间戳的文本中&#xff0c;按照某种格式显示更便于查看。 如下&#xff0c;第一列为时间戳(s)&#xff0c;第二列是转换后的格式。 解决方案&#xff1a; 在公式输入框中输入&#xff1a;yyyy/mm/dd hh:mm:ss TEXT((A18*3600)/8640070*36519, "yyy…

从传统到智能,从被动监控到主动预警,解锁视频安防平台EasyCVR视频监控智能化升级的关键密钥

视频监控技术从传统监控到智能化升级的过程是一个技术革新和应用场景拓展的过程。智能视频监控系统通过集成AI和机器学习算法&#xff0c;能够实现行为分析、人脸识别和异常事件检测等功能&#xff0c;提升了监控的准确性和响应速度。这些系统不仅用于传统的安全防护&#xff0…

Ribbon客户端负载均衡策略测试及其改进

文章目录 一、目的概述二、验证步骤1、源码下载2、导入IDE3、运行前修改配置4、策略说明5、修改策略 三、最终结论四、改进措施1. 思路分析2. 核心代码3. 测试页面 一、目的概述 为了验证Ribbon客户端负载均衡策略在负载节点失效的情况下&#xff0c;是否具有故障转移的功能&a…

一家生物技术企业终止,科创属性可能不足,报告期内专利数猛增

轩凯生物九成以上营业收入来源于植物营养领域&#xff0c;收入来源结构单一&#xff0c;产品下游应用领域较为集中。报告期内公司应收账款账面价值逐年上升&#xff0c;回款比例显著低于前两年&#xff0c;遭交易所问询是否存在较大的坏账风险。 轩凯生物核心技术是否成熟以及是…

【SDL】微软SDL建设指南

【SDL】微软SDL建设指南 1.建立安全标准、指标和治理2.要求使用经过验证的安全功能、语言和框架3.执行安全设计审查和威胁建模4.定义并使用密码学标准5.确保软件供应链安全6.确保工程环境安全7.执行安全测试8.确保运营平台安全9.实施安全监控和响应&#xff08;态势管理或漏洞管…

二十、Innodb底层原理与Mysql日志机制深入剖析

文章目录 一、MySQL的内部组件结构1、Server层1.1、连接器1.2、查询缓存1.3、分析器1.4、优化器1.5、执行器 2、存储引擎层 二、Innodb底层原理与Mysql日志机制1、redo log重做日志关键参数2、binlog二进制归档日志2.1、binlog日志文件恢复数据 3、undo log回滚日志4、错误日志…

群晖通过 Docker 安装 Firefox

1. 获取 firefox 镜像 在注册表搜索 jlesage/firefox&#xff0c;并且下载 2. 创建容器 运行映像 jlesage/firefox&#xff0c;开始创建容器 3. 配置容器 启用自动重新启动&#xff0c;重点配置存储空间和环境变量&#xff0c;其他默认。 创建文件夹&#xff0c;及子文件夹…

高效设备管理:中小企业的Spring Boot解决方案

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理中小企业设备管理系统的相关信息成为必然。…