聚类分析算法——K-means聚类 详解
K-means 聚类是一种常用的基于距离的聚类算法,旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面,我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。
1. K-means 的核心思想
K-means 的目标是将数据集划分为 个簇(clusters),使得每个数据点属于距离最近的簇中心。通过反复调整簇中心的位置,K-means 不断优化簇内的紧密度,从而获得尽量紧凑、彼此分离的簇。
核心思想
- 簇(Cluster):K-means 通过最小化簇内距离的平方和,使得数据点在簇内聚集。
- 簇中心(Centroid):簇中心是簇中所有点的平均值,表示簇的中心位置。
- 簇分配和更新:K-means 通过不断更新簇分配和簇中心,来逐步收敛。
2. K-means 的算法步骤
K-means 聚类的流程分为两个主要步骤:分配(Assignment)和更新(Update)。以下是详细步骤:
-
选择 K 值:
设定簇的数量 。 -
初始化簇中心:
随机选择 个数据点作为初始簇中心(centroids)。 -
分配步骤(Assignment Step):
对于数据集中的每个点,将它分配到最近的簇中心对应的簇。这里的“距离”通常使用欧氏距离(Euclidean distance)。 -
更新步骤(Update Step):
根据当前的簇分配,重新计算每个簇的中心,即计算簇内所有点的均值作为新的簇中心。 -
重复 3 和 4 步:
不断重复分配和更新步骤,直到簇中心不再发生变化(收敛)或达到指定的最大迭代次数。
3. K-means 的数学公式
K-means 的目标是最小化簇内平方误差和(Within-Cluster Sum of Squares,WCSS),即每个点到其所属簇中心的距离的平方和,公式如下:
其中:
- 是簇的数量。
- 是第 个簇的点集。
- 是属于 的数据点。
- 是第 个簇的中心。
- 表示数据点 与簇中心 之间的欧氏距离平方。
欧氏距离
K-means 通常采用欧氏距离来衡量点到簇中心的距离,其公式为:
其中 n 是数据的维度。
4. K-means 的伪代码
KMeans(X, K):1. 随机选择 K 个点作为初始簇中心2. 重复以下步骤,直到簇中心不再发生变化:a. 分配每个点到最近的簇中心b. 重新计算每个簇的中心,作为簇内所有点的均值3. 返回最终的簇分配和簇中心
分配步骤(Assignment Step)
对于每个数据点,找到距离最近的簇中心 μj:
更新步骤(Update Step)
更新每个簇的中心 为簇内所有点的均值:
5. K-means 的时间复杂度分析
- 每次分配步骤:需要计算每个点到 个簇中心的距离,复杂度为 。
- 更新步骤:重新计算每个簇的中心,需要遍历所有点,复杂度也是 。
- 总复杂度:若迭代次数为 ,则总体复杂度为 。
6. K-means 的优缺点
优点
- 简单高效:在样本数量较少或维度较低时效果很好。
- 收敛速度快:在适合的初始中心选择下,K-means 通常可以较快收敛。
缺点
- 对初始点敏感:初始簇中心的选择对最终结果影响较大。
- 只能发现球形簇:K-means 假设每个簇是凸形且大小相近,不能处理非球形的簇。
- 对离群点敏感:离群点会影响簇的中心计算。
7. K 值的选择
确定最佳的簇数 是 K-means 聚类中的一个难点。常用的选择方法有:
-
肘部法(Elbow Method):
绘制不同 K 值下的 WCSS 图,寻找“肘部”点作为最佳 值。 -
轮廓系数(Silhouette Coefficient):
衡量聚类结果的紧密度和分离度。通常,轮廓系数越高,聚类效果越好。 -
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++ 初始中心选择步骤
- 随机选择一个点作为第一个中心。
- 对于每个点,计算其与已选择中心的最小距离。
- 根据与最近中心的距离平方值选择下一个中心,概率越大则越有可能成为下一个中心。
10. 总结
K-means 是一种简单、快速的聚类算法,广泛应用于数据聚类任务。通过反复优化簇中心位置,K-means 不断收敛并找到数据的聚类结构。然而,它对初始条件敏感,对簇形状有限制,适合于球形且均匀分布的簇。在实际应用中,可通过结合 K-means++、肘部法和轮廓系数等手段改进其效果。
相关文章:
聚类分析算法——K-means聚类 详解
K-means 聚类是一种常用的基于距离的聚类算法,旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面,我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。…...
【Sublime Text】设置中文 最新最详细
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Sublime Text】设置中文 最新最详细 开…...
C++学习路线(二十四)
静态成员函数 类的静态方法: 1.可以直接通过类来访问【更常用】,也可以通过对象(实例)来访问。 2.在类的静态方法中,不能访问普通数据成员和普通成员函数(对象的数据成员和成员函数) 1)静态数据成员 可以直接访问“静态数据成员”对象的成…...
MySQL-存储过程/函数/触发器
文章目录 什么是存储过程存储过程的优缺点存储过程的基本使用存储过程的创建存储过程的调用存储过程的删除存储过程的查看delimiter命令 MySQL中的变量系统变量用户变量局部变量参数 if语句case语句while循环repeat循环loop循环游标cursor捕获异常并处理存储函数触发器触发器概…...
前端页面样式没效果?没应用上?
当我们在开发项目时会有很多个页面、相同的标签,也有可能有相同的class值。样式设置的多了,分不清哪个是当前应用的。我们可以使用网页的开发者工具。 在我们开发的网页中按下f12或: 在打开的工具中我们可以使用元素选择器,单击我…...
Mac apache配置cgi环境-修改httpd.conf文件、启动apache
Mac自带Apache,配置CGI,分以下几步: 找到httpd.conf。打开终端,编辑以下几处,去掉#或补充内容。在这个路径下写一个测试文件.py格式的,/Library/WebServer/CGI-Executables,注意第一行的python…...
多厂商的实现不同vlan间通信
Cisco单臂路由 Cisco路由器配置 -交换机配置 -pc配置 华三的单臂路由 -路由器配置 -华三的接口默认是打开的 -pc配置及ping的结果 -注意不要忘记配置默认网关 Cisco-SVI -交换机的配置 -创建vlan -> 设置物理接口对应的Acess或Trunk -> 进入vlan接口,打开接…...
sh与bash的区别
sh与bash的区别 结论:对于一般开发者,没有区别;对于要使脚本兼容较老系统,或者兼容其他shell(如ksh,dash),那么意义可能很重大,要确保自己代码没有bash扩展的特性。 区…...
D48【python 接口自动化学习】- python基础之类
day48 练习:开发自动咖啡(上) 学习日期:20241025 学习目标:类 -- 62 小试牛刀:如何开发自动咖啡机?(上) 学习笔记: 案例解析 定义类 定义属性和方法 clas…...
PostgreSQL(WINDOWS)下载、安装、简单使用
下载 PostgreSQL: Downloads PostgreSQL: Windows installers EDB: Open-Source, Enterprise Postgres Database Management 安装 注意密码要方便自己使用,不能忘记。 打开pgAdmin,输入密码 新建数据库 打开命令工具 新建表...
Git的初次使用
一、下载git 找淘宝的镜像去下载比较快 点击这里 二、配置git 1.打开git命令框 2.设置配置 git config --global user.name "你的用名"git config --global user.email "你的邮箱qq.com" 3.制作本地仓库 新建一个文件夹即可,然后在文件夹…...
rocketmq服务的docker启动和配置
rocketmq的默认启动参数占用的内存实在是太大了,小于8G的电脑无法启动,docker中的开发环境又不可能用这么大,通用的该法是改sh文件 修改文件如下 runbroker.sh 默认8G JAVA_OPT"${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn…...
BLE和经典蓝牙相比,有什么优缺点
蓝牙低功耗(Bluetooth Low Energy,简称 BLE)和经典蓝牙(Bluetooth Classic,即 BR/EDR,Basic Rate/Enhanced Data Rate)是蓝牙技术的两种主要模式。两者都有各自的优缺点,具体如下&am…...
ECharts图表图例知识点小结
ECharts 图表图例简述 一、知识点 1. 作用: - 用于标识图表中的不同系列,帮助用户理解图表所展示的数据内容。 2. 位置: - 可以通过配置项设置图例的位置,如 top 、 bottom 、 left 、 right 等。 3. 显示状态控制:…...
LabVIEW非接触式模态参数识别系统开发
基于LabVIEW的模态参数识别系统采用非接触式声学方法,结合LabVIEW软件和高精度硬件,实现机械结构模态参数的快速准确识别。降低了模态分析技术门槛,提高测试效率和准确性。 项目背景与意义: 传统的模态分析方法,如锤击法&#x…...
厨艺爱好者的在线家园:基于Spring Boot的实现
1 绪论 1.1 研究背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的…...
PostgreSQL使用clickhouse_fdw访问ClickHouse
Postgres postgres版本:16(测试可用)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常见的镜像有以下三个:wurstmeister/zookeeper、kafka、confluentinc/cp-zookeeper、cp-kafka 和 bitnami/zookeeper、kafka。 wurstmeister/xxx: 由wurstmeister团队维护,提供的镜像适用于开发和测试环…...
AnaTraf | 全面掌握网络健康状态:全流量的分布式网络性能监测系统
AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具AnaTraf网络流量分析仪是一款基于全流量,能够实时监控网络流量和历史流量回溯分析的网络性能监控与诊断系统(NPMD)。通过对网络各个关键节点的监测,收集网络性能…...
单片机入门教程
单片机入门教程 单片机是一种将中央处理器(CPU)、存储器、输入输出接口等集成在一个芯片上的微型计算机系统。本教程将带你从零开始学习如何使用一款常见的单片机——ATmega328P,并编写简单的控制程序。 1. 单片机简介 1.1 什么是单片机&a…...
三维管线管网建模工具MagicPipe3D V3.5.3
经纬管网建模系统MagicPipe3D,本地离线参数化构建地下管网三维模型(包括管道、接头、附属设施等),输出标准3DTiles、Obj模型等格式,支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析&…...
(二十三)、k8s(minikube) 部署mysql
文章目录 1、安装1.1、环境1.2、workbench 崩溃问题1.1、deployment.yaml 文件1.2、运行1.3、启动隧道,从宿主机直接访问 k8s 中的mysql 2、完整卸载 mysql(pod/deployment/service/pvc) 1、安装 1.1、环境 docker 部署 minikube,minikube …...
FFMPEG+Qt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频
FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频 文章目录 FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频1、前言1.1 目标1.2 一些说明 2、效果3、代码3.1 思路3.2 工程目录3.3 核心代码 4、全部代码获取 1、前言 本文通过FFMPEG(7.0.2)与Qt(5.13.…...
微信小程序中关闭默认的 `navigationBar`,并使用自定义的 `nav-bar` 组件
要在微信小程序中关闭默认的 navigationBar,并使用自定义的 nav-bar 组件,你可以按照以下步骤操作: 1. 关闭默认的 navigationBar 在你的页面的配置文件 *.json 中设置 navigationBar 为 false。你需要在页面的 JSON 配置文件中添加以下代码…...
FPGA 小鸟避障游戏
FPGA实现效果: FPGA 小鸟避障游戏 FPGA(Field Programmable Gate Array)即现场可编程门阵列,是一种可以编程的数字逻辑器件。基于FPGA的小鸟避障游戏是一种结合了硬件加速和算法优化来运行的实时交互游戏。这种游戏一般利用FPGA的…...
Claude Financial Data Analyst:基于Claude的金融数据分析工具!免费开源!
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...
django5入门【03】新建一个hello界面
文章目录 1、前提条件⭐2、操作步骤总结3、实际操作示例 1、前提条件⭐ 将上一节创建的 Django 项目导入到 PyCharm 中。 2、操作步骤总结 (1)在 HelloDjango/HelloDjango 目录下,新建一个 views.py 文件。 (2)在 H…...
【Unity】Unity中调用手机的震动功能 包括安卓和IOS
直接上代码 #if UNITY_IOS[DllImport("__Internal")]private static extern void EX_C_CallVibrateE(int eID); #endif public static void CallVibrate(int eID){ #if UNITY_EDITOR#elif UNITY_ANDROIDlong miSec 30;if(eID 1520){miSec 60;}//通过报名获取ja…...
【软件工程】软件工程入门
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀软件开发必练内功_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…...
深圳腾网站建设/厦门seo排名外包
在向服务器添加SCSI硬盘时,可以在服务器不停机的情况下,让系统识别出新插入的硬盘,具体步骤如下:第一步:将新硬盘插到机器上;第二步:以root用户运行命令:echo "scsi add-single-device x y…...
wordpress网站正在建设中/微友圈推广平台怎么加入
文章目录 零、写在前面一、题目描述二、解题思路三、代码详解四、推荐专栏五、习题练习零、写在前面 目前本专栏正在进行优惠活动,在博主主页添加博主好友(好友位没有满的话),可以获取 付费专栏优惠券。 今天是学习 「 C语言 」 打卡的第三十一天,学习方式很简单,每天…...
微网站制作提供商推荐/广州seo服务外包
绝对定位与相对定位和浮动的区别与运用绝对定位使元素脱离文档流,因此不占据空间。普通文档流中元素的布局就当绝对定位的元素不存在时一样。因为绝对定位的框与文档流无关,所以它们可以覆盖页面上的其他元素。 而浮动元素的定位还是基于正常的文档流。C…...
公司可以做多个网站吗/网站推广优化外链
凡有位运算的全加括号!!!!! 二进制嘛,可以加速 a*2a<<1 a/2a>>1 2^b1<< b 可以判断一些东西 a&1->(a%21) a^1可以求出数的一个相邻数 等等等等 下面我会在做题目时记录一…...
武汉网站设计推荐刻/深圳百度网站排名优化
1. rand函数rand() 函数可以不加任何参数,就可以生成随机整数。如果要设置随机数范围,可以在函数中设置 min 和 max 的值。如果需要生成随机数的种子,使用 srand 函数配置。echo rand(); // 生成 0~RAND_MAX 之间的随机数,Windows…...
网站怎么做支付/百度收录网址提交
一、Visual Studio安装与插件 可以到官网下载 VS Code 并安装,推荐配置的插件有“ C/C ” ,“ Code Runner ”和中文简体扩展包,安装了 Extensions “C/C” 后就可以使用 Ctrl Shift P 打开命令面板输入“ C/C :编辑配置(UI…...