K-means 聚类模型详解

news2024/11/26 5:33:08

K-means 聚类模型详解

K-means 是一种常用的无监督学习算法,用于将数据集分成 K 个簇。其目标是最小化各个簇内数据点到簇中心的距离平方和。K-means 广泛应用于图像压缩、市场细分、模式识别等领域。

算法步骤
  1. 初始化: 随机选择 K 个初始簇中心(质心)。
  2. 分配: 将每个数据点分配给距离最近的簇中心。
  3. 更新: 重新计算每个簇的质心。
  4. 重复: 重复步骤 2 和 3,直到簇中心不再变化或达到预设的迭代次数。
公式推导

目标函数: 最小化各个簇内的平方误差和(Sum of Squared Errors, SSE)。

( X = { x 1 , x 2 , . . . , x n } ) ( X = \{x_1, x_2, ..., x_n\} ) (X={x1,x2,...,xn}) 为数据集, $ C = {c_1, c_2, …, c_K} $ 为簇中心, $S_i $ 为第 i 个簇中的数据点集合。目标函数为:
J = ∑ i = 1 K ∑ x ∈ S i ∥ x − c i ∥ 2 J = \sum_{i=1}^{K} \sum_{x \in S_i} \|x - c_i\|^2 J=i=1KxSixci2

其中, ∥ x − c i ∥ \|x - c_i\| xci​ 表示数据点 x x x 到簇中心 $ c_i $ 的欧氏距离。

算法步骤

步骤 1: 初始化 C = { c 1 , c 2 , . . . , c K } C = \{c_1, c_2, ..., c_K\} C={c1,c2,...,cK}(随机选择 K 个数据点作为初始簇中心)。

步骤 2: 对每个数据点 $ x_j $​,分配到最近的簇中心:
S i = { x j : ∥ x j − c i ∥ 2 ≤ ∥ x j − c k ∥ 2 , ∀ k , 1 ≤ k ≤ K } S_i = \{x_j : \|x_j - c_i\|^2 \leq \|x_j - c_k\|^2, \forall k, 1 \leq k \leq K\} Si={xj:xjci2xjck2,k,1kK}
步骤 3: 重新计算每个簇的簇中心:
c i = 1 ∣ S i ∣ ∑ x ∈ S i x c_i = \frac{1}{|S_i|} \sum_{x \in S_i} x ci=Si1xSix

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

运用示例

下面是一个使用 K-means 算法进行数据聚类的 Python 示例,使用 sklearn 库。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 生成示例数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42, cluster_std=0.60)

# 可视化数据
plt.scatter(X[:, 0], X[:, 1])
plt.title("Generated Data")
plt.show()

# 使用 K-means 进行聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 获取簇中心
centers = kmeans.cluster_centers_

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.title("K-means Clustering")
plt.show()

在这里插入图片描述

解释
  1. 生成数据: 使用 make_blobs 生成 300 个样本点,分成 4 个簇,标准差为 0.60。
  2. 可视化数据: 使用 plt.scatter 绘制生成的数据。
  3. K-means 聚类: 创建 KMeans 对象,设置簇数为 4,并拟合数据。
  4. 获取聚类结果: 使用 predict 方法获取每个数据点的簇标签。
  5. 获取簇中心: 使用 cluster_centers_ 属性获取簇中心坐标。
  6. 可视化聚类结果: 绘制聚类后的数据点,并标记出簇中心。
优缺点

优点:

  • 简单易理解,实现和解释都很直观。
  • 计算效率高,适用于大规模数据集。

缺点:

  • 需要预先指定簇的数量 K K K
  • 对初始值敏感,不同的初始值可能导致不同的结果。
  • 适用于球形簇,不适用于非球形簇或密度不均匀的簇。

总结

K-means 是一种高效的聚类算法,通过迭代优化簇内距离平方和实现数据的自动分组。尽管有一些限制,如需要预先指定簇数和对初始值敏感,但在许多实际应用中仍然非常有用。通过结合实际数据集进行聚类分析,可以更好地理解数据的结构和模式。

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

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

相关文章

富港银行 优惠链接 邀请码 兑换码 优惠码 分享

首次记得一定要点击链接注册,注册开户费50美金 限时!优惠开通国际银行账户! cbi帐户管理费:10美元/月,余额>500美元,1美元/月/,余额>2000美元,0美元/月。 一定要显示50的时候…

牛!华为《Linux 面试笔记大全》太赞了,完整版PDF 开放下载!

在QQ和微信社群中,我注意到许多人都在寻找一份全面的Linux学习资料。因此,我在这里为大家整理和分类了相关的信息,可以看作是对重点内容的梳理和归纳。 这份《Linux面试笔记》主要分为三大部分:基础篇-进阶篇-高级篇 本书笔记针…

基于SpringBoot的本科生考研率统计系统

基于SpringBoot的本科生考研率统计系统 一、开发技术二、功能模块三、代码结构四、数据库设计五、运行截图六、源码获取 一、开发技术 技术:SpringBoot、MyBatis-Plus、Redis、MySQL、Thymeleaf、Html、Vue、Element-ui。 框架:基于开源框架easy-admin开…

【前端学习笔记】HTML基础

HTML 一、HTML介绍1.HTML概念2.文档声明3.字符编码4. HTML标签5. HTML属性 二、标签1.meta标签2.语义标签3.布局标签4.列表5.超链接6.图片7.字符实体8.内联格式9.HTML 表格10.HTML 表单 三、HTML5新特性1. 本地存储2. Cookie3. 语义化标签4.多媒体元素5.表单增强6.Canvas7.SVG …

【云原生_K8S系列】认识 Kubernetes

在当今数字化转型的浪潮中,企业对于构建高效、灵活的软件架构有了更高的期望。而在这个迅速变化的环境中,容器化技术如雨后春笋般涌现,为解决传统部署和管理软件所带来的挑战提供了一种全新的解决方案。在众多容器编排工具中,Kube…

2024年4月—马克思主义基本原理概论真题及答案解析(上海自考)

目录 1.选择题 2.简答题 3.论述题 1.选择题 2.简答题

“盲人独立生活技能提升方案”:科技点亮希望之光

在追求平等与包容的社会进程中,盲人群体的独立生活能力提升成为了重要议题。随着科技的飞速发展,一款名为“蝙蝠避障”的辅助软件应运而生,以其独特的实时避障和拍照识别功能,为盲人在旅行乃至日常生活中开辟了新的可能。这不仅是…

社会工程学:美色你顶得住吗?

背景 近年来,网络钓鱼的手段是屡见不鲜,手段和方式也是层出不穷。钓鱼相关的技术作为一种比较高效的打点方式,越来越多的应用于红蓝对抗当中。本文主要分享一次实战攻防中几个有趣的钓鱼场景。 重点说明:本文分享内容为一次经过授…

2024年第六届中青杯数学建模竞赛浅析

获取比赛资料,请关注gzh“小何数模”! 本次中青杯数学建模的赛题已正式出炉,无论是赛题难度还是认可度,该比赛都是仅次于数模国赛的独一档,可以用于国赛前的练手训练。考虑到大家解题实属不易,为了帮助大家…

景源畅信电商:做抖音运营怎么开始第一步?

在数字化时代的浪潮中,抖音作为一款短视频平台迅速崛起,成为许多人表达自我、分享生活的重要舞台。随着用户量的激增,如何做好抖音运营,尤其是迈出成功的第一步,成为了众多内容创作者和品牌主们关注的焦点。接下来&…

C++ 常量和变量

1 常量 具体把数据写出来 2,3&#xff0c;4&#xff1b;1.2 1.3;“Hello world!”,“C” cout<<2015 常量&#xff1a;不能改变的量。 字面常量&#xff08;字面量、直接常量&#xff09;:直接写出的数据。 符号常量&#xff1a;用符号表示数据&#xff0c;但它一旦确定…

Nginx企业级负载均衡:技术详解系列(13)—— 四层访问控制

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 今天&#xff0c;咱们聊聊Nginx的一个核心功能——四层访问控制。 废话不多说&#xff0c;让我们直接进入正题&#xff0c;一探究竟&#xff01; 四层访问控制 Nginx的四层访问控制指的是在传输层&#xff08;TCP层…

生成式AI的GPU网络技术架构

生成式AI的GPU网络 引言&#xff1a;超大规模企业竞相部署拥有64K GPU的大型集群&#xff0c;以支撑各种生成式AI训练需求。尽管庞大Transformer模型与数据集需数千GPU&#xff0c;但实现GPU间任意非阻塞连接或显冗余。如何高效利用资源&#xff0c;成为业界关注焦点。 张量并…

混合A*算法详解(二)路径平滑

描述 上一篇文章混合A*算法详解&#xff08;一&#xff09;路径搜索 路径损失函数使用Voroni势能图 根据之前的文章分析&#xff0c;决定A*路径长度的有两点&#xff1a;路径长度和距离障碍物远近。Voroni图用于权衡这两者。之前我在记录二维点云的阿尔法形状算法时简单介绍过…

「代码厨房大揭秘:Python性能优化的烹饪秘籍!」

哈喽&#xff0c;我是阿佑&#xff0c;上篇咱们讲了 Socket 编程 —— 探索Python Socket编程&#xff0c;赋予你的网络应用隐形斗篷般的超能力&#xff01;从基础到实战&#xff0c;构建安全的聊天室和HTTP服务器&#xff0c;成为网络世界的守护者。加入我们&#xff0c;一起揭…

docker-compose 映射端口失败! docker端口映射失败 ,docker映射只能使用老端口,映射无法使用

1. 现象 使用docker-compose 启动项目&#xff0c;发现映射端口出现问题&#xff0c;不能映射端口&#xff01; 如图&#xff1a; 使用原来端口是可以使用的 2. 问题原因&#xff1a; 使用了docker-mode 为host模式&#xff0c;所以不能换端口&#xff0c;只能写为"8086:…

Java RMI

RMI - 安全篇 RMI分为三个主体部分&#xff1a; *Client-客户端*&#xff1a;客户端调用服务端的方法 *Server-服务端*&#xff1a;远程调用方法对象的提供者&#xff0c;也是代码真正执行的地方&#xff0c;执行结束会返回给客户端一个方法执行的结果。 *Registry-注册中心…

动态内存管理—C语言通讯录

目录 一&#xff0c;动态内存函数的介绍 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的内存开辟 二&#xff0c;通讯录管理系统 动态内存函数的介绍 malloc free calloc realloc 一&#xff0c;动态内存函数的介绍 1.1 malloc和free void* malloc (…

Python 读取.shp文件并生成图幅编号

代码适用于需要处理和分析地理空间数据的场景&#xff0c;如城市规划、环境监测或自然资源管理&#xff0c;其中它可以帮助用户读取特定区域的Shapefile文件&#xff0c;确定其地理边界&#xff0c;并基于这些边界计算出按照经纬度5度间隔的图幅编号&#xff0c;进而用于地图制…

Qt Creator(2)【如何在Qt Creator中创建新工程】

阅读导航 引言一、Qt Creator开始界面介绍二、如何在Qt Creator中创建新工程1. 新建项目2. 选择项目模板3. 选择项目路径4. 选择构建系统5. 填写类信息设置界面6. 选择语言和翻译文件7. 选择Qt套件8. 选择版本控制系统9. 最终效果 三、认识Qt Creator项目内容界面1. 基本界面2.…