了解 K-Means 聚类的工作原理(详细指南)
一、说明
K-means 的目标是将一组观测值划分为 k 个聚类,每个观测值分配给均值(聚类中心或质心)最接近的聚类,从而充当该聚类的代表。
在本文中,我们将全面介绍 k 均值聚类(最常用的聚类方法之一)及其组成部分的所有内容。我们将了解聚类,为什么它很重要,以及它的应用。
二、什么是 K-means 聚类?
K-Means 聚类是一种流行的无监督机器学习算法,用于将数据集划分为一组不同的、不重叠的组或聚类。目标是以这样一种方式对数据点进行分组,即同一聚类中的点彼此之间比与其他聚类中的点更相似。该技术广泛应用于数据挖掘、市场细分、图像压缩以及其他需要模式识别的领域。
2.1 K-means 中使用的数学概念
在我们开始计算 k 均值之前,我们将讨论 K 均值中使用的数学概念。
- 质心:这些是聚类的中心点,在每次迭代中都会重新计算,以作为分配给聚类的点的平均值。
- 欧几里得距离:这是 K-Means 中最常用的距离度量。它计算欧几里得空间中两点之间的直线距离。
对于 n 维的 X(x1,x2,...,xn) 和 Y(y1,y2,...,yn) 2 个点,使用此公式测量欧几里得距离。
- 惯性:它衡量集群的分布程度。它是每个数据点与其分配的质心之间的平方距离之和。目标是将惯性降至最低。
WCSS = d1² + d2²+ d3² + ...........+ dn²
2.2 K-means是如何工作的?
# Generating Data
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs# Parameters
n_samples = 300
n_features = 2
centers = 4# Generate data
X, y = make_blobs(n_samples=n_samples, n_features=n_features, centers=centers, cluster_std=3, random_state=42)# Visualize the data
plt.scatter(X[:, 0], X[:, 1], s=50, cmap='viridis')
plt.title("Initial Data")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
from sklearn.cluster import KMeanskmeans = KMeans(n_init = 10, n_clusters = 4, verbose=100)
kmeans.fit(X)y_kmeans = kmeans.predict(X)plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 60, c = 'red', label = 'Cluster1')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 60, c = 'blue', label = 'Cluster2')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 60, c = 'green', label = 'Cluster3')
plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s = 60, c = 'yellow', label = 'Cluster4')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 100, c = 'black', label = 'Centroids')plt.legend()plt.show()
- 初始化:
- 选择簇数 K。
- 随机初始化 K 个质心,它们是数据集中表示每个聚类中心的点。
2. 分配步骤:
- 根据欧几里得距离将每个数据点分配给最近的质心。这将创建 K 个聚类。
我们计算一个点到每个质心的欧几里得距离,并将其放入距离最小的聚类中。
3. 更新步骤:
- 通过取分配给每个聚类的所有数据点的平均值来计算新的质心。
我们计算聚类中所有点的平均值,以获得新的质心。
4.重复:
- 使用新的质心重复分配和更新步骤,直到质心不再更改或更改低于预定义的阈值。
生成上述图像的代码在此处。
三、如何确定质心的数量?
3.1 弯头法
肘部方法是一种用于确定 K-Means 聚类中最佳聚类数的技术。这个想法是对 K 的值范围运行 K-Means,并计算从每个点到其分配的质心的距离平方和(称为惯性或簇内平方和)。随着 K 的增加,惯性减小,因为点更接近它们的质心。
目标是找到“肘点”,其中下降速度急剧减慢,表明随着 K 的增加,回报递减,即在肘点之后增加 K 的值没有多大好处。
WCSS = d1² + d2² + d3² + ...........+ dn²
我们通常计算前 10 个聚类的惯性。对于 K = 数据点数,惯性将为零。
from sklearn.cluster import KMeanswcss = []
for i in range(1, 11):kmeans = KMeans(n_init = 10, n_clusters = i)kmeans.fit(X)wcss.append(kmeans.inertia_)plt.title("Elbow Method")
plt.xlabel("Number of Clusters(k)")
plt.ylabel("WCSS")
plt.plot(range(1,11),wcss)
因此,集群的数量可以是 3 个或 4 个。
肘部方法有一些限制,例如:
- 肘点的选择是主观的。
- 它不适用于所有数据集,例如当聚类具有不规则形状或大量特征时。
3.2 剪影分数
Silhouette 分数是一个指标,用于量化集群的质量。它适用于任何聚类算法。
剪影分数的值从 -1 到 +1 不等。
- +1 : 良好(集群分离良好)
- 0 : 集群彼此靠近
- -1 : 错误(错误的聚类)
内聚力: 同一聚类中元素彼此接近的程度。(它衡量集群的紧凑性。
分离: 它指的是不同的集群彼此之间有多么不同或分辨得多么好。
S(i) 是剪影分数。
a(i) 是所取点与其自身聚类中所有点的平均距离。它代表着凝聚力。
b(i) 是所取点与剩余最近聚类的所有点之间的平均聚类距离。它代表分离。
from sklearn.metrics import silhouette_score
sil = []
for i in range(2, 11):kmeans = KMeans(n_clusters=i)cluster_labels = kmeans.fit_predict(X)silhouette_avg = silhouette_score(X, cluster_labels)sil.append(silhouette_avg)plt.xlabel("Number of Clusters(k)")
plt.ylabel("Silhouette Score")
plt.plot(range(2,11),sil)
根据轮廓分数,我们应该假设 k=3,因为对于 3 个聚类,分数是最大的。
四、如何初始化质心?
4.1 K-均值++
K-Means++ 是 K-Means 聚类算法的高级版本,它改进了质心的初始选择,旨在提高聚类结果和收敛速度。标准的 K-Means 算法对质心的初始放置很敏感,初始化不良会导致聚类次优和收敛速度变慢。K-Means++ 通过使用更智能的初始化策略来解决这个问题。
4.2 K-Means++ 初始化的步骤
1. 选择第一个质心:
• 从数据集中随机选择第一个质心。
2. 选择后续质心:
• 对于每个后续质心,计算从每个
数据点 x 到最近的已选质心的距离 D(x)。
• 从数据点中选择下一个质心,其概率与 D(x)² 成正比。概率最大的点作为质心。(我们采用概率而不是距离本身来减少异常值的影响。
3. 重复:
• 重复该过程,直到选择 K 个质心。
4. 继续使用标准 K-Means:
• 使用这些 K 质心作为初始起点,并运行标准 K-Means 算法
五、K-means的假设和局限性
- 假设簇是球形和各向同性(不是不规则形状)。
- 假定聚类具有相似的大小。
- 假设所有聚类都具有相似的方差。
- 集群的数量是预定义的。
- 当聚类分离良好时,此算法效果最佳。
- K 均值不能在存在异常值的情况下应用(因为质心会移动太多并且无法正确分配)
六、结论
K-Means 简单性和效率使其成为各种应用的热门选择,包括图像分割、市场分割和模式识别。尽管它很简单,但它为各个领域的许多应用程序提供了坚实的基础。但是,它对质心的初始放置很敏感,这可能导致次优聚类。尽管存在一些局限性,例如对 K 选择的敏感性以及卡在局部最小值中的可能性,但 K-Means 仍然是数据分析和机器学习中一种基本且高效的聚类技术。
K-Means 有其局限性,其他聚类算法(如 DBSCAN 和 GMM)可以克服这些局限性。
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/143353e6f4bba8329d6a97fb19497cd0.png)
了解 K-Means 聚类的工作原理(详细指南)
一、说明 K-means 的目标是将一组观测值划分为 k 个聚类,每个观测值分配给均值(聚类中心或质心)最接近的聚类,从而充当该聚类的代表。 在本文中,我们将全面介绍 k 均值聚类(最常用的聚类方法之一࿰…...
![](https://i-blog.csdnimg.cn/direct/fb4cf32438d34bae9cae99639bc42063.jpeg)
预警先行,弯道哨兵让行车更安全
预警先行,弯道哨兵让行车更安全”这句话深刻体现了现代交通安全理念中预防为主、科技赋能的重要性。在道路交通中,尤其是复杂多变的弯道区域,交通事故的发生率往往较高,因此,采取有效的预警措施和引入先进的交通辅助设…...
![](https://i-blog.csdnimg.cn/direct/0672c49f21da40f3b87160f5b73b6197.png)
预约咨询小程序搭建开发,uniapp前端,PHP语言开发
目录 前言: 一、预约小程序搭建功能介绍 二、示例代码片段 前言: 预约咨询小程序适合需付费咨询和交流的场景:比如讲师,摄影,婚庆,美发,律师,心理等等支持商家入驻支持视频、图文、线下、电话等方式在线支付咨询。 一、预约小程…...
![](https://i-blog.csdnimg.cn/direct/472b9f8ffda64c43bd2c7239d3536d3f.png)
极速文件预览!轻松部署 kkFileView 于 Docker 中!
大家好,这几天闲的难受,决定给自己找点事做。博主的项目中有个文件预览的小需求,原有方案是想将文件转换成 PDF 进行预览。本着能借鉴就绝对不自己写的原则。今天就让我们简单试用一下 kkFileView 文件预览服务,一起探索它的强大功…...
![](https://i-blog.csdnimg.cn/direct/14d6b395608a4980b06cea64f3ea03f1.png)
某验九宫格分类识别
注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 九宫格分类如下 这种就是最简单的分类识别了,用迁移学习resnet训练即可,下面来看成品 训练代码查看往期文章中就有,部分代码如下: DEVICE = torch.device(…...
![](https://www.ngui.cc/images/no-images.jpg)
未来展望:观测云技术的发展与企业业务的融合
随着技术的不断进步,观测云作为企业数据监控和分析的关键工具,其发展与企业业务的融合趋势显得尤为重要。在未来,观测云技术将如何演进,以及它将如何更深层次地与企业业务相融合,是值得我们深入探讨的问题。 首先&…...
![](https://i-blog.csdnimg.cn/direct/4d5c7e5de2c04914896a3967a78d09f6.png)
day6JS-DOM(文档对象模型)
DOM树 DOM 操作 1. 获取元素 1.1 根据id名获取元素 document.getElementById("id名"); 案例: <body><div id"box">div盒子</div><h1>一级标题</h1><script>console.log(document.getElementById(&quo…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL列表分区分区表
什么是列表分区分区表? 列表分区是一种根据某个列的离散值将表数据分割成多个分区的分区方式。在列表分区中,每个分区都有自己的离散值集合,当插入数据时,MySQL会根据指定的列值将数据分配到相应的分区中。这种分区方式可以使得表…...
![](https://i-blog.csdnimg.cn/direct/4f6d833f35d549589f9440885d4ef392.png)
qt打包程序方法(非常好用)
1.下载 Index of /official_releases/qt-installer-framework/4.6.1 bi...
![](https://www.ngui.cc/images/no-images.jpg)
IP地址管理:优化网络布局与提升效率
在日益复杂的网络环境中,IP地址管理成为了网络管理员日常工作中不可或缺的一部分。有效的IP地址管理不仅能够优化网络布局,提升网络运行效率,还能确保网络安全和稳定性。本文将探讨IP地址管理的重要性、实施策略以及最佳实践。 一、IP地址管…...
![](https://i-blog.csdnimg.cn/direct/98eb27a8a0db4dbeb472846b6064dce2.jpeg#pic_center)
老古董Lisp实用主义入门教程(5):好奇先生用Lisp探索Lisp
鲁莽先生什么都不管 鲁莽先生打开电脑,安装一堆东西,噼里啪啦敲了一堆代码,叽里呱啦说了一堆话,然后累了就回家睡觉了。 这可把好奇先生的兴趣勾起来,他怎么也睡不着。好奇先生打开电脑,看了看鲁莽先生留…...
![](https://i-blog.csdnimg.cn/direct/45090b16dbff43d0911f9eb1be9c26e0.png)
linux文件——用户缓冲区——概念深度理解、IO模拟实现
前言:本篇文章主要讲解文件缓冲区。 讲解的方式是通过抛出问题, 然后通过分析问题, 将缓冲区的概念与原理一步一步地讲解。同时, 本节内容在最后一部分还会带友友们模拟实现一下c语言的printf, fprintf接口,…...
![](https://www.ngui.cc/images/no-images.jpg)
Selenium模拟鼠标滚动页面:实现自动化测试中的页面交互
Selenium模拟鼠标滚动页面:实现自动化测试中的页面交互 在进行网页自动化测试时,经常需要模拟用户的滚动行为来加载更多内容或触发页面上的某些交互。Selenium WebDriver提供了强大的工具来模拟这些用户行为,包括鼠标滚动。本文将介绍如何使…...
![](https://i-blog.csdnimg.cn/direct/ae37fff95ba5418a921bc5c1fb0ac9a6.png)
Eureka原理与实践:构建高效的微服务架构
Eureka原理与实践:构建高效的微服务架构 Eureka的核心原理Eureka Server:服务注册中心Eureka Client:服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client(服务提供者&…...
![](https://www.ngui.cc/images/no-images.jpg)
OpenJDK 和 OracleJDK 的区别、下载方式
OpenJDK 和 OracleJDK 都是 Java 开发套件 (JDK),用于开发和运行 Java 应用程序。它们之间的主要区别如下: 许可证和使用限制: OpenJDK:由 OpenJDK 社区开发和维护,基于 GPL v2 with Classpath Exception 许可证&#…...
![](https://i-blog.csdnimg.cn/direct/f44a1e02645d41eab16216c6208485c3.png)
arthas源码刨析:arthas-core (2)
文章目录 attach JVMagent**ArthasBootstrap** arthas-core的启动可以从上一篇做参考 参考 pom,即启动是调用的 Arthas 的 main 方法 attach JVM JVM提供了 Java Attach 功能,能够让客户端与目标JVM进行通讯从而获取JVM运行时的数据,甚至可以…...
![](https://img-blog.csdnimg.cn/img_convert/506590b99ea68ee93b1fffeeac0d50cd.jpeg)
【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源
开门见山 帮别人弄了一台 格力G0245D,把找到的资源和教程分享一下 教程 这个写的很详细了格力手机色界G0245D-Root-最简指南 不过教程里刷rec这一步漏了加上电源键,加上就行了。 附加参考:格力手机2刷机 格力手机二代刷机 GREE G0215D刷机…...
![](https://i-blog.csdnimg.cn/direct/6dcba1e3976c4ef28e4977d8411a85ff.png)
开学必备清单来啦!大学好物合集推荐!每一个都能帮你提升幸福感
随着开学季的到来,好多学生都在忙着准备各类学习与生活必需品,以迎接新的大学生活到来。以下是一些开学季必备的好物推荐,每一个都很实用,可以帮你提升学习和生活的幸福感! 1、西圣电容笔 一句话推荐:公认…...
![](https://www.ngui.cc/images/no-images.jpg)
已解决:javax.xml.transform.TransformerFactoryConfigurationError 异常的正确解决方法,亲测有效!!!
1. 问题描述 javax.xml.transform.TransformerFactoryConfigurationError 是在使用 Java 的 XML 处理库时,配置 TransformerFactory 出错时抛出的异常。通常,这个异常发生在应用程序试图创建一个 TransformerFactory 实例时,由于无法找到合适…...
![](https://i-blog.csdnimg.cn/direct/4c8694a971134acaa506c427212c52b4.png)
商品价格与优惠信息在API返回值中的位置
在API返回值中,商品价格与优惠信息的具体位置可能因不同的电商平台和API设计而有所不同。然而,一般来说,这些信息会以结构化的方式呈现,通常包含在一个包含多个字段的JSON对象或XML文档中。以下是根据多个电商平台(如阿…...
![](https://www.ngui.cc/images/no-images.jpg)
Oracle Index Partition索引分区的管理
Oracle索引分区的管理是数据库管理中的重要任务之一,它涉及索引的创建、维护、重建以及优化等多个方面。以下是对Oracle索引分区管理的详细解析: 一、索引分区的概念 索引分区(Partitioned Index)是针对分区表而言的,…...
![](https://i-blog.csdnimg.cn/direct/a4da2b3d0c5b4d74b25c743378cf1fde.png)
统信UOS系统访问windows共享目录
问题背景 当我们使用UOS系统的时候,想要访问windows系统的一些资料并将其拷贝下来使用的话,应该怎么操作呢?这个需求是可以实现的,统信UOS系统是基于Linux系统开发的,Linux系统和windows系统之间可以通过SMB协议来共享…...
![](https://www.ngui.cc/images/no-images.jpg)
单一职责原则与REST API设计:如何定义清晰的资源与职责
在软件设计中,单一职责原则(Single Responsibility Principle, SRP)和 REST API 设计是两个重要的概念。单一职责原则是一种设计原则,它强调一个类或模块应当只有一个单一的职责,这有助于提高系统的可维护性和扩展性。…...
![](https://i-blog.csdnimg.cn/direct/41ba1c8580304ba596da30b5766bd811.png)
JAVA IO模型
我们在平常开发过程中接触最多的就是 磁盘 IO(读写文件) 和 网络 IO(网络请求和响应)。从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负…...
![](https://i-blog.csdnimg.cn/blog_migrate/5309fd059aea4f2ccf0c6d984fd47572.png#pic_center)
《C/C++实战专栏》介绍
🚀 前言 本文是《C/C实战专栏》专栏的说明贴(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)。 专栏介绍:以多年的开发实战为基础,总结并讲解一些的C/C基础与项目实战进阶内容&…...
![](https://www.ngui.cc/images/no-images.jpg)
前端跨域2
前端跨域2 前端跨域解决方案(11种方案) 1.JSONP跨域解决方案的底层原理 script、img、link、iframe...<script src"https://cdn.bootcss.com/jquery/3.4.1/core.js"></script>// 这个就是因为script标签没有跨域限制࿰…...
![](https://i-blog.csdnimg.cn/direct/2b07cfd708ea494096d550890bd6ae1a.png)
electron仿微信,新建贴合窗口
说明 在写electron项目时,只有一个主窗口不足以满足需求,我们通常还会打开很多个窗口。 怎么打开一个子窗口像微信的聊天界面一样,全贴合在一起,看起来像一个整体呢: 分析 这个窗口有点像element ui中的抽屉(drawe…...
![](https://i-blog.csdnimg.cn/direct/e3a28fed31df47989dc69add083d69e8.png)
uniapp微信小程序 分享功能
uniapp https://zh.uniapp.dcloud.io/api/plugins/share.html#onshareappmessage export default {onShareAppMessage(res) {if (res.from button) {// 来自页面内分享按钮console.log(res.target)}return {title: 自定义分享标题,path: /pages/test/test?id123}} }需要再真机…...
![](https://www.ngui.cc/images/no-images.jpg)
Java实现数据库数据到Excel的高效导出
在数据处理和分析工作中,经常需要将数据库中的数据导出到Excel文件中。本文将提供一个Java实现的示例,展示如何边从数据库读取数据,边将其写入Excel文件,同时注重内存效率。 环境配置: Java 1.8 或更高版本MySQL 5.7…...
![](https://i-blog.csdnimg.cn/direct/aa1b45c874a040e29530a5bf4b2c2d99.png)
python之matplotlib (8 极坐标)-圆与心
极坐标 极坐标图像的绘制类似于三维图像的绘制,只需要将projection参数由3d改为polar即可。 import numpy as np import matplotlib.pyplot as plt figplt.figure() axfig.add_subplot(projectionpolar)theta np.linspace(0, 2 * np.pi, 100) r np.sin(the…...
![](http://www.blogjava.net/images/blogjava_net/landon/target_jad.jpg)
旅游网站设计论文摘要/百度指数支持数据下载吗
Jad是一个Java的一个反编译工具,是用命令行执行,和通常JDK自带的java,javac命令是一样的。不过因为是控制台运行,所以用起来不太方便。不过幸好有一个eclipse的插件JadClipse,二者结合可以方便的在eclipse中查看class文…...
![](https://www.oschina.net/img/hot3.png)
wordpress如何开启page页面评论/抖音引流推广怎么做
2019独角兽企业重金招聘Python工程师标准>>> 概述 正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配、替换、截取匹配的字符串。常用的语言基本上都有正则表达式,如JavaScript、java等。其实࿰…...
![](/images/no-images.jpg)
做a短视频网站/淄博网站优化
//这么写才能被正确渲染 <textarea></textarea> //这样就会有空格 <textarea> </textarea> 不能换行,涨姿势转载于:https://www.cnblogs.com/liyinSakura/p/5755560.html...
![](/images/no-images.jpg)
企业网站seo参考文献/seo排名的公司
Orgrimmar 题意: 就是给你一个树,然后让你选择一些点集,每个点的度<1。问你这个点集最大是多少。 思考: 刚开始我想了个贪心,既然度<1的才能保留,那么我先把度>3的全部删掉,剩下的能…...
![](https://img-blog.csdnimg.cn/20201030132151514.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NDY3MDgz,size_16,color_FFFFFF,t_70#pic_center)
益阳 网站制作维护/优化的含义
在使用STM32的hal库的时候,我们常常可以看到很多库自带的函数有很多是使用__weak修饰的,比如: 这个修饰符的作用是什么呢? 函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。 加上了__weak 修饰符的…...
![](https://img-blog.csdnimg.cn/img_convert/f5fcedb7aafebccca9b91fd633e977e4.png)
资源管理器/石家庄seo外包的公司
ODBC简介 开放数据库连接(Open Database Connectivity),ODBC是为解决异构数据库间的数据共享而产生的,ODBC 为异构数据库访问提供统一接口,允许应用程序以SQL 为数据存取标准,存取不同DBMS管理的数据&…...