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

聚类分析算法——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++、肘部法和轮廓系数等手段改进其效果。

相关文章:

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

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

【Sublime Text】设置中文 最新最详细

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Sublime Text】设置中文 最新最详细 开…...

C++学习路线(二十四)

静态成员函数 类的静态方法: 1.可以直接通过类来访问【更常用】&#xff0c;也可以通过对象(实例)来访问。 2.在类的静态方法中&#xff0c;不能访问普通数据成员和普通成员函数(对象的数据成员和成员函数&#xff09; 1)静态数据成员 可以直接访问“静态数据成员”对象的成…...

MySQL-存储过程/函数/触发器

文章目录 什么是存储过程存储过程的优缺点存储过程的基本使用存储过程的创建存储过程的调用存储过程的删除存储过程的查看delimiter命令 MySQL中的变量系统变量用户变量局部变量参数 if语句case语句while循环repeat循环loop循环游标cursor捕获异常并处理存储函数触发器触发器概…...

前端页面样式没效果?没应用上?

当我们在开发项目时会有很多个页面、相同的标签&#xff0c;也有可能有相同的class值。样式设置的多了&#xff0c;分不清哪个是当前应用的。我们可以使用网页的开发者工具。 在我们开发的网页中按下f12或&#xff1a; 在打开的工具中我们可以使用元素选择器&#xff0c;单击我…...

05.MyISAM主键和二级索引树

...

Mac apache配置cgi环境-修改httpd.conf文件、启动apache

Mac自带Apache&#xff0c;配置CGI&#xff0c;分以下几步&#xff1a; 找到httpd.conf。打开终端&#xff0c;编辑以下几处&#xff0c;去掉#或补充内容。在这个路径下写一个测试文件.py格式的&#xff0c;/Library/WebServer/CGI-Executables&#xff0c;注意第一行的python…...

多厂商的实现不同vlan间通信

Cisco单臂路由 Cisco路由器配置 -交换机配置 -pc配置 华三的单臂路由 -路由器配置 -华三的接口默认是打开的 -pc配置及ping的结果 -注意不要忘记配置默认网关 Cisco-SVI -交换机的配置 -创建vlan -> 设置物理接口对应的Acess或Trunk -> 进入vlan接口&#xff0c;打开接…...

sh与bash的区别

sh与bash的区别 结论&#xff1a;对于一般开发者&#xff0c;没有区别&#xff1b;对于要使脚本兼容较老系统&#xff0c;或者兼容其他shell&#xff08;如ksh&#xff0c;dash&#xff09;&#xff0c;那么意义可能很重大&#xff0c;要确保自己代码没有bash扩展的特性。 区…...

D48【python 接口自动化学习】- python基础之类

day48 练习&#xff1a;开发自动咖啡&#xff08;上&#xff09; 学习日期&#xff1a;20241025 学习目标&#xff1a;类 -- 62 小试牛刀&#xff1a;如何开发自动咖啡机&#xff1f;&#xff08;上&#xff09; 学习笔记&#xff1a; 案例解析 定义类 定义属性和方法 clas…...

PostgreSQL(WINDOWS)下载、安装、简单使用

下载 PostgreSQL: Downloads PostgreSQL: Windows installers EDB: Open-Source, Enterprise Postgres Database Management 安装 注意密码要方便自己使用&#xff0c;不能忘记。 打开pgAdmin&#xff0c;输入密码 新建数据库 打开命令工具 新建表...

Git的初次使用

一、下载git 找淘宝的镜像去下载比较快 点击这里 二、配置git 1.打开git命令框 2.设置配置 git config --global user.name "你的用名"git config --global user.email "你的邮箱qq.com" 3.制作本地仓库 新建一个文件夹即可&#xff0c;然后在文件夹…...

rocketmq服务的docker启动和配置

rocketmq的默认启动参数占用的内存实在是太大了&#xff0c;小于8G的电脑无法启动&#xff0c;docker中的开发环境又不可能用这么大&#xff0c;通用的该法是改sh文件 修改文件如下 runbroker.sh 默认8G JAVA_OPT"${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn…...

BLE和经典蓝牙相比,有什么优缺点

蓝牙低功耗&#xff08;Bluetooth Low Energy&#xff0c;简称 BLE&#xff09;和经典蓝牙&#xff08;Bluetooth Classic&#xff0c;即 BR/EDR&#xff0c;Basic Rate/Enhanced Data Rate&#xff09;是蓝牙技术的两种主要模式。两者都有各自的优缺点&#xff0c;具体如下&am…...

ECharts图表图例知识点小结

ECharts 图表图例简述 一、知识点 1. 作用&#xff1a; - 用于标识图表中的不同系列&#xff0c;帮助用户理解图表所展示的数据内容。 2. 位置&#xff1a; - 可以通过配置项设置图例的位置&#xff0c;如 top 、 bottom 、 left 、 right 等。 3. 显示状态控制&#xff1a…...

LabVIEW非接触式模态参数识别系统开发

基于LabVIEW的模态参数识别系统采用非接触式声学方法&#xff0c;结合LabVIEW软件和高精度硬件&#xff0c;实现机械结构模态参数的快速准确识别。降低了模态分析技术门槛&#xff0c;提高测试效率和准确性。 项目背景与意义: 传统的模态分析方法&#xff0c;如锤击法&#x…...

厨艺爱好者的在线家园:基于Spring Boot的实现

1 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时间变得更加地宝贵化&#xff0c;因为每天的…...

PostgreSQL使用clickhouse_fdw访问ClickHouse

Postgres postgres版本&#xff1a;16&#xff08;测试可用&#xff09;docker 安装 插件安装 clickhouse_fdw: https://github.com/ildus/clickhouse_fdw 安装命令 git clone gitgithub.com:ildus/clickhouse_fdw.git cd clickhouse_fdw mkdir build && cd build…...

docker 单节点arm架构服务器安装zookeeper、kafka并测试通信

kafka、zookeeper常用镜像介绍 kafka和zookeeper常见的镜像有以下三个&#xff1a;wurstmeister/zookeeper、kafka、confluentinc/cp-zookeeper、cp-kafka 和 bitnami/zookeeper、kafka。 wurstmeister/xxx: 由wurstmeister团队维护&#xff0c;提供的镜像适用于开发和测试环…...

AnaTraf | 全面掌握网络健康状态:全流量的分布式网络性能监测系统

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具AnaTraf网络流量分析仪是一款基于全流量&#xff0c;能够实时监控网络流量和历史流量回溯分析的网络性能监控与诊断系统&#xff08;NPMD&#xff09;。通过对网络各个关键节点的监测&#xff0c;收集网络性能…...

Godot引擎集成Wwise音频中间件:从原理到实战的完整指南

1. 项目概述&#xff1a;当AAA级音频引擎遇见开源游戏引擎如果你是一位使用Godot引擎的游戏开发者&#xff0c;并且对游戏音频的品质有追求&#xff0c;那么你很可能听说过Wwise。Wwise&#xff0c;全称Audiokinetic Wwise&#xff0c;是游戏音频领域的行业标准&#xff0c;从《…...

Flutter 表单处理完全指南

Flutter 表单处理完全指南 引言 表单是移动应用中不可或缺的一部分&#xff0c;Flutter 提供了强大的表单处理能力。本文将深入探讨 Flutter 表单的各种用法和高级技巧。 基础概念回顾 核心组件 Form: 表单容器TextFormField: 文本输入字段FormState: 表单状态管理GlobalKey: 全…...

疯狂五月:AI 化身最强“神探”,重塑网络安全攻防战

原文链接&#xff1a;AI 小老六 在网络安全领域&#xff0c;每个月的第二个星期二被称为“补丁星期二&#xff08;Patch Tuesday&#xff09;”&#xff0c;是微软等科技巨头集中发布安全更新的日子。然而&#xff0c;2026 年 5 月的这一天显得格外特殊——整个科技圈正在经历一…...

零中频接收机技术演进与动态范围优化方案

1. 零中频接收机技术演进与核心挑战零中频架构&#xff08;Zero-IF&#xff09;在移动通信领域已发展超过二十年&#xff0c;最早可追溯至1990年代的GSM手机设计。这种直接将射频信号下变频至基带的技术&#xff0c;相比传统超外差架构省去了中频处理环节&#xff0c;理论上具有…...

OpenTelemetry可观测系统之Metrics学习

概念 OpenTelemetry 是一套通用监控工具包&#xff0c;不生产监控数据&#xff0c;只负责采集监控数据&#xff1b;Metrics 是它专门用来抓「数字指标」的模块 理解&#xff1a;OTel Metrics 1.区分三大可观测核心 OTel 只干三件事&#xff0c;你可以把服务运行状态想象成人&am…...

终极raylib游戏开发指南:如何在3天内从零到一创建跨平台游戏

终极raylib游戏开发指南&#xff1a;如何在3天内从零到一创建跨平台游戏 【免费下载链接】raylib A simple and easy-to-use library to enjoy videogames programming 项目地址: https://gitcode.com/GitHub_Trending/ra/raylib raylib是一个简单易用的轻量级游戏编程库…...

风冷热泵中央空调系统安装:从冷热源到末端联动的完整解析

一、什么是风冷热泵中央空调系统安装&#xff1f;风冷热泵中央空调系统安装&#xff0c;是指在办公楼、商业综合体、酒店、学校、医院、厂房办公区、实验室、园区配套建筑以及各类中小型公共建筑中&#xff0c;根据建筑冷热负荷、使用时段、空间功能和节能要求&#xff0c;对风…...

千问 LeetCode 2402.会议室 III public int mostBooked(int n, int[][] meetings)

这道题是经典的会议室 III&#xff0c;核心是双堆模拟&#xff0c;一个堆管空闲会议室&#xff08;按编号排序&#xff09;&#xff0c;一个堆管正在使用的会议室&#xff08;按结束时间排序&#xff09;。解题思路1. 排序&#xff1a;按会议开始时间升序排列。 2. 双堆初始化&…...

7种智能提取方案深度解析:网盘直链下载助手的跨平台文件管理革命

7种智能提取方案深度解析&#xff1a;网盘直链下载助手的跨平台文件管理革命 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云…...

数据可视化:使用D3.js创建交互式图表

数据可视化&#xff1a;使用D3.js创建交互式图表 大家好&#xff0c;我是欧阳瑞&#xff08;Rich Own&#xff09;。今天想和大家聊聊数据可视化这个话题。作为一个全栈开发者&#xff0c;我经常需要将复杂的数据以直观的方式展示给用户。D3.js是一个功能强大的数据可视化库&am…...