了解 K-Means 聚类的工作原理(详细指南)

news2024/11/15 22:40:45

一、说明

        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 KMeans

kmeans = 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()

  1. 初始化
  • 选择簇数 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 KMeans

wcss = []
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 个。

肘部方法有一些限制,例如:

  1. 肘点的选择是主观的。
  2. 它不适用于所有数据集,例如当聚类具有不规则形状或大量特征时。

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的假设和局限性

  1. 假设簇是球形和各向同性(不是不规则形状)。
  2. 假定聚类具有相似的大小。
  3. 假设所有聚类都具有相似的方差。
  4. 集群的数量是预定义的。
  5. 当聚类分离良好时,此算法效果最佳。
  6. K 均值不能在存在异常值的情况下应用(因为质心会移动太多并且无法正确分配)

六、结论

K-Means 简单性和效率使其成为各种应用的热门选择,包括图像分割、市场分割和模式识别。尽管它很简单,但它为各个领域的许多应用程序提供了坚实的基础。但是,它对质心的初始放置很敏感,这可能导致次优聚类。尽管存在一些局限性,例如对 K 选择的敏感性以及卡在局部最小值中的可能性,但 K-Means 仍然是数据分析和机器学习中一种基本且高效的聚类技术。

K-Means 有其局限性,其他聚类算法(如 DBSCAN 和 GMM)可以克服这些局限性。

K 表示
聚类

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

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

相关文章

Python 全栈系列263 简易资源监控

说明 开始比等待强 这块其实我也不太熟,而且我也知道应该有更专业的做法 其实连grafana我都准备好了,prometheus的镜像也准备好了,但是还没时间去细细弄。 我想先快快整一版够用的(能让我依据这个数据进行调度)就行。…

高性能内存对象缓存

Memcached概述 一套开源的高性能分布式内存对象缓存系统 所有的数据都存储在内存中 支持任意存储类型的数据 提高网站的访问速度 数据存储方式与数据过期方式 数据存储方式:Slab Allocation 按组分配内存,每次先分配一个Slab,相当于一个大小为1M的页&…

技术革新!MultiDesk:高效远程桌面管理工具,TAB切换引领新潮流!

前言 话说远程操作,win系统自带的远程工具那可真是个让人头疼又爱不释手的活儿;不过别怕,今天小江湖要给大家揭秘一款神器——MultiDesk;有了它,可以不需要频繁切换窗口,不再为记不住复杂的服务器地址和密…

电脑监控怎样看回放视频?一键解锁电脑监控回放,守护安全不留死角!高效员工电脑监控,回放视频随时查!

你是否曾好奇那些键盘敲击背后的秘密?电脑监控不仅是守护企业安全的隐形盾牌,更是揭秘高效与合规的魔法镜!一键解锁安企神监控回放,就像打开时间宝盒,让过去的工作瞬间跃然眼前。无论是精彩瞬间还是潜在风险&#xff0…

go语言中数据接口set集合的实现

概述 set 是一种常用的数据结构,它表示一组唯一元素的集合。在不同的编程语言和库中,set 可能有不同的实现方式和特性。 set 集合数据结构具有以下特性: 唯一性:set 中的元素是唯一的,不允许重复。这意味着在 set 中…

Linux环境下OpenSSH升级到 OpenSSH_9.8p1(内置保姆级教程并包含openssl升级过程)

文章目录 前言一、下载openssh、openssl二进制包二、升级步骤1.系统开启telnet,防止意外导致shh无法连接2.确认升级前openssh的版本3.升级openssh3.1.备份旧ssh配置文件及目录3.2.备份旧ssh相关的二进制程序文件3.3.安装gcc,并解压9.8p1的安装包3.4.执行openssh编译…

超有性价比深度学习卡特斯拉 P100,16G大显存,Stable Diffusion AI 绘画利器

超有性价比深度学习卡特斯拉 P100,16G大显存,Stable Diffusion AI 绘画利器 在当今数字化创作的时代,AI 绘画技术正以惊人的速度发展,为艺术家和创作者们带来了全新的可能性。而要实现高效的 AI 绘画,一款性能卓越的显…

MySQL——基本概念、环境安装、分类、语法(增删改查)以及内置数据库与基本函数

目录 一、数据库的概念 二、数据库的分类 关系型数据库: 非关系型数据库: 三、数据库系统 四、安装数据库 配置数据库的环境变量 五、MySQL的登录命令 六、SQL DDL DML DQL DCL 七、创建数据库 八、增删改查数据库 增加数据 删除数据 逻…

进程间的通信2——有名管道、信号

通信方式:(1)单工://广播;单一方向的数据通道; (2)半双工://对讲机;同一时刻只能有一个方向; (3)全双工://手机电话;同一时…

Selenium 自动化测试平台

1.介绍 Selenium 是一套 Web网站 的程序自动化操作 解决方案。 通过它,我们可以写出自动化程序,像人一样在浏览器里操作web界面。 比如点击界面按钮,在文本框中输入文字 等操作。 而且还能从web界面获取信息。 比如获取 火车、汽车票务信息…

Spark2.x 入门:套接字流(DStream)

Spark Streaming可以通过Socket端口监听并接收数据,然后进行相应处理。 新建NetworkWordCount.scala代码文件,请在该文件中输入如下内容: package org.apache.spark.examples.streaming import org.apache.spark._ import org.apache.spark…

图像数据处理9

二、灰度变换 2.3 非线性灰度变换 以下式子中使用 f 表示输入图像的像素值&#xff0c;g 表示输出图像的像素值 2.3.1伽马校正&#xff08;Gamma Correction&#xff09; γ 是伽马值&#xff0c;通常大于0。调整 γ 的值可以改变图像的亮度。当 γ<1 时&#xff0c;图像…

一个简单的Rtmp推流客户端(QT录音,OpenCV摄像,FFmpeg编码推流)

RTMP&#xff08;Real-Time Messaging Protocol&#xff09;是一种实时流媒体传输协议&#xff0c;常用于音视频直播。 RTMP推流客户端是一种能够将音视频数据推送到直播服务器的工具。QT录音是利用Qt库实现的录音功能。OpenCV摄像是利用OpenCV库实现的对摄像头的控制和图像处理…

Chrome书签搜索插件

效果展示 这是一个chroma插件&#xff0c;可以按住 ctrl/command B 进行搜索您的书签&#xff0c;并且点击打开您的书签。支持上下切换回车打开新页面。支持文件夹搜索。多层级文件夹使用 / 分割。如&#xff1a;文件夹1/文件夹2/标签1 扩展下载地址 bookmark-search 欢迎有…

小程序学习day09-WXS脚本、自定义组件-组件的创建、引用、组件与页面的区别、组件的样式隔离

39、WXS脚本&#xff08;小程序独有的一套脚本语言&#xff09; &#xff08;1&#xff09;作用&#xff1a;结合WXML&#xff0c;可以构建出页面结构 &#xff08;2&#xff09;应用&#xff1a;在小程序中充当过滤器。&#xff08;wxml无法调用在页面的.js中定义的函数&…

DNS in Kubernetes

DNS in Kubernetes 对象分配的名称Service DNS 记录Pod DNS 记录 Cluster DNS参考 DNS for Services and Pods 这里主要讨论集群内不同对象之间的DNS解析 默认情况下&#xff0c;创建集群时&#xff0c;k8s会部署内置的DNS服务器&#xff0c;在集群内&#xff0c;我们不关注…

spring-boot-3.2.6+spring-security-6.2.4+oauth2整合github示例

一、添加依赖 在 pom.xml 中添加如下依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"h…

<数据集>航拍路面病害识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3151张 标注数量(xml文件个数)&#xff1a;3151 标注数量(txt文件个数)&#xff1a;3151 标注类别数&#xff1a;7 标注类别名称&#xff1a;[Longitudinal crack, Transverse crack, Alligator crack, Oblique cr…

腾讯 图标点选 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

Element UI中报dateObject.getTime is not a function解决方法~

1、错误信息。 2、该报错原因是Element UI中日期组件的校验规则是type: "date",而一般我们从后台拿到的数据是字符串型的&#xff0c;不满足预期&#xff0c;就会报错。 3、解决方法。 去掉日子组件中的type: "date"校验规则即可。 rules: {newName: [{…