深入了解 K-Means 聚类算法:原理与应用
引言
在数据科学和机器学习的世界中,聚类是一项非常重要的技术,它帮助我们根据数据的相似性将数据划分为不同的组或簇。聚类算法在许多领域中得到了广泛的应用,如图像处理、市场细分、基因研究等。K-Means 聚类算法作为最常见的无监督学习算法之一,因其简单易用、计算效率高而被广泛应用。本文将深入探讨 K-Means 算法的原理、应用以及一些常见的变种和改进方法。
什么是 K-Means 聚类?
K-Means 聚类是一种将数据集划分为 K 个簇的无监督学习算法。它的目标是将数据集中的相似点分配到同一个簇中,使得每个簇的内聚度尽可能大,而簇与簇之间的差异尽可能大。简而言之,K-Means 算法试图最小化每个簇内的点与簇中心的距离。
K-Means 算法的工作原理
K-Means 聚类算法的核心思想非常简单,具体过程如下:
-
选择 K 个簇的初始中心: 随机选择 K 个数据点作为簇的初始中心(也叫做“质心”)。
-
将数据点分配到最近的簇中心: 对于数据集中的每个数据点,计算它与 K 个簇中心的距离,并将该数据点分配给距离最近的簇。
-
更新簇中心: 一旦所有数据点都被分配到了相应的簇,重新计算每个簇的中心(即簇中所有点的均值),并将簇中心更新为新的均值。
-
重复步骤 2 和 3: 重复步骤 2 和步骤 3,直到簇中心不再变化(即收敛)或者达到最大迭代次数为止。
K-Means 算法的关键点
-
K 的选择: K-Means 算法的核心参数是 K,即簇的数量。如何选择合适的 K 值是 K-Means 算法中的一个重要问题。通常,我们可以使用以下几种方法来确定 K 值:
- 肘部法则(Elbow Method):通过绘制不同 K 值对应的总误差平方和(SSE),观察 SSE 随 K 增加的变化。当 SSE 的下降速度明显放缓时,通常可以选择该 K 值。
- 轮廓系数(Silhouette Coefficient):衡量每个数据点与其簇的相似度和与其他簇的差异,轮廓系数的值越大,表明聚类效果越好。
-
初始化簇中心: K-Means 算法的一个缺点是,初始簇中心的选择对最终聚类结果有很大影响。不同的初始簇中心可能会导致不同的聚类结果。为了解决这个问题,可以使用 K-Means++ 初始化方法,采用更智能的方式选择初始簇中心,从而提高聚类的稳定性和准确性。
-
欧氏距离: K-Means 算法通常使用 欧氏距离 来计算数据点与簇中心的相似度。虽然欧氏距离在许多场景下有效,但在某些高维数据中,欧氏距离可能会受到维度灾难的影响,因此可以考虑使用其他距离度量方法,如曼哈顿距离、余弦相似度等。
-
收敛性: K-Means 算法的收敛性并不意味着聚类结果最优。K-Means 的目标是最小化每个簇内点到簇中心的距离和(即总误差平方和),但这并不一定是全局最优解。由于其初始化的随机性,K-Means 可能会陷入局部最优解。
import cv2
import numpy as npclass ImageSegmentation:def __init__(self, num_clusters=4):"""初始化图像分割类。:param num_clusters: 聚类的数量(默认值为 4)"""super().__init__()self.num_clusters = num_clustersself.init_parameters()def init_parameters(self, *args, **kwargs):"""初始化参数。"""passdef do(self, frame, device):"""对输入帧进行图像分割,并返回分割结果。:param frame: 输入帧:param device: 设备信息(未使用):return: 分割后的图像"""# 将图像转换为二维数组pixel_values = frame.reshape((-1, 3)) # 将图像展平为 (height * width, 3) 的数组pixel_values = np.float32(pixel_values) # 转换为浮点型# 定义 K-Means 聚类的终止条件criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.2)# 使用 K-Means 聚类_, labels, centers = cv2.kmeans(pixel_values, self.num_clusters, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)# 将聚类结果映射回图像centers = np.uint8(centers) # 将中心点转换为整数segmented_image = centers[labels.flatten()] # 将每个像素映射到对应的聚类中心segmented_image = segmented_image.reshape(frame.shape) # 恢复图像形状# 将分割结果叠加到原始图像上alpha = 0.5 # 设置透明度blended_image = cv2.addWeighted(frame, 1 - alpha, segmented_image, alpha, 0)return blended_image
K-Means 算法的优缺点
优点:
-
简单易懂: K-Means 算法结构简单,易于理解,且实现起来也比较容易,是最基础的聚类算法之一。
-
计算效率高: 在大多数情况下,K-Means 算法的时间复杂度较低,尤其是在数据量很大时,能够有效地处理大规模数据集。
-
适用于大规模数据集: 由于算法的计算效率较高,K-Means 算法适用于大规模数据集的聚类任务,尤其是在处理图像、文本等高维数据时非常有效。
缺点:
-
需要预先指定 K 值: K-Means 算法需要事先指定簇的数量 K,这在实际应用中往往是不容易确定的,尤其是在没有先验知识的情况下。
-
对初始值敏感: K-Means 算法对初始簇中心的选择非常敏感。不同的初始簇中心可能会导致不同的聚类结果,甚至可能陷入局部最优解。
-
无法处理非球形簇: K-Means 算法假设簇的形状是圆形的,适用于球形簇的场景。在处理不规则形状的簇时,K-Means 的效果较差。
-
对噪声和离群点敏感: K-Means 对噪声和离群点非常敏感,因为离群点会显著影响簇的中心位置,从而影响聚类效果。
K-Means 算法的改进和变种
为了解决 K-Means 算法的不足,研究者提出了许多改进方法和变种。以下是一些常见的改进和变种:
-
K-Means++: 该方法改进了簇中心初始化的过程,通过选择远离当前簇中心的数据点作为新的初始中心,从而提高了聚类结果的稳定性和准确性。
-
Mini-Batch K-Means: 当数据集非常大时,K-Means 的计算效率可能会成为瓶颈。Mini-Batch K-Means 通过在每次迭代时仅使用一小部分数据(即小批量),显著提高了算法的计算效率,适用于大规模数据集。
-
密度聚类(DBSCAN): DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,能够自动检测簇的数量,并且能够处理噪声和不规则形状的簇。相比 K-Means,DBSCAN 适合处理非球形簇的情况。
-
层次聚类: 层次聚类算法(如 Agglomerative Clustering)通过构建一个树形结构(即树状图),逐步合并或分裂簇,可以适应不同形状的簇,并且不需要预先指定簇的数量 K。
-


K-Means 在实际中的应用
K-Means 聚类算法在多个领域都有广泛应用:
-
图像分割: K-Means 常用于图像处理中的图像分割,将图像中的像素点根据颜色、纹理等特征分配到不同的簇,从而实现图像的区域划分。
-
市场细分: 在市场营销中,K-Means 被用于将消费者根据其购买行为、收入、兴趣等特征进行分群,从而制定个性化的营销策略。
-
客户分群: 在金融、零售等行业,K-Means 被广泛应用于客户分析和分群,以便根据客户的行为特征进行分类和定制服务。
-
文档聚类: 在文本分析中,K-Means 可以根据文本的内容特征(如TF-IDF向量)对大量文档进行聚类,从而发现文本之间的主题或相似性。
结论
K-Means 聚类算法以其简单、高效和易于实现的特点,广泛应用于数据科学和机器学习的各个领域。尽管该算法存在一些局限性,如对初始簇中心的敏感性和对簇形状的假设,但通过一些改进方法,如 K-Means++ 和 Mini-Batch K-Means,我们可以在许多实际问题中获得较好的聚类效果。随着数据量的增加和计算能力的提高,K-Means 依然是一个非常有价值的工具,帮助我们从海量数据中提取有价值的信息。
相关文章:
深入了解 K-Means 聚类算法:原理与应用
引言 在数据科学和机器学习的世界中,聚类是一项非常重要的技术,它帮助我们根据数据的相似性将数据划分为不同的组或簇。聚类算法在许多领域中得到了广泛的应用,如图像处理、市场细分、基因研究等。K-Means 聚类算法作为最常见的无监督学习算…...
Rust ~ Collect
背景 Transforms an iterator into a collection 将一个迭代器转换为一个集合 collect() 可以处理任何可迭代的对象,并将其转换为相关的集合 collect() 最基本模式是将一个集合转换为另一个集合: 先获取一个集合,对其调用 iter 方法&#x…...
C# 类型转换
C# 类型转换 引言 在C#编程语言中,类型转换是一种将一个数据类型的变量转换成另一个数据类型的操作。类型转换是编程中常见的操作,特别是在处理不同数据类型的变量时。本文将详细探讨C#中的类型转换,包括隐式转换和显式转换,以及…...
[IP] DDR_FIFO(DDR3 用户FIFO接口)
IP(DDR_FIFO)将DDR3 IP的用户侧复杂接口修改为简易的FIFO接口,用户侧更加简易例化使用MIG 核 IP介绍 c0_xx (连接DDR app接口) 此IP 仅需根据MIG配置进行有限修改,即可使用! 关于IP详细使用说明,参考IP datasheet! 示…...
第三百七十二节 JavaFX教程 - JavaFX HTMLEditor
JavaFX教程 - JavaFX HTMLEditor HTMLEditor控件是一个富文本编辑器,具有以下功能。 粗体斜体下划线删除线字体系列字体大小前景色背景颜色缩进项目符号列表编号列表对齐水平线复制文本片段粘贴文本片段 HTMLEditor类返回HTML字符串中的编辑内容。 创建HTML编辑器…...
蓝桥杯试题:DFS回溯
一、题目要求 输入一个数组n,输出1到n的全排列 二、代码展示 import java.util.*;public class ikun {static List<List<Integer>> list new ArrayList<>();public static void main(String[] args) { Scanner sc new Scanner(System.in);…...
Lua | 每日一练 (4)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…...
每日一题——接雨水
接雨水问题详解 问题描述 给定一个非负整数数组 height,表示每个宽度为 1 的柱子的高度图。计算按此排列的柱子,下雨之后能接多少雨水。 示例 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释&#…...
java常见面试01
为什么重写 equals 还要重写 hashcode 🌈 核心原因: 当两个对象通过equals()判断为相等时,它们的hashCode()必须返回相同的整数值!这是Java世界的交通规则哦~(交警曼波敬礼.jpg) 🧩 具体场景…...
算法-二叉树篇27-把二叉搜索树转换为累加树
把二叉搜索树转换为累加树 力扣题目链接 题目描述 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提…...
C语言:51单片机 基础知识
一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…...
olmOCR:使用VLM解析PDF
在PDF解析中,目前主流的开源工具包括Minuer、GOT OCR等。主要都是通过飞桨等OCR套件组装的一套pipeline,或者直接通过VLM解析图像。 #一、 olmOCR是使用VLM进行的端到端的PDF文档解析 二、document-anchoring 与上述的不同在于,olmOCR使用…...
数据结构(初阶)(七)----树和二叉树(堆,堆排序)
八,树与二叉树 树 概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 • 有⼀…...
图像分类项目1:基于卷积神经网络的动物图像分类
一、选题背景及动机 在现代社会中,图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用,例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类,可以帮助人们更好地了解动物种类、数量和分布情况,…...
Kali Linux 2024.4版本全局代理(wide Proxy)配置,适用于浏览器、命令行
1. 网络拓扑介绍(不使用虚拟机直接跳到2) 虚拟机:VMware 17 Pro,为本机开启桥接模式。 我的究极套娃网络:手机V2rayNG代理端口为10808,开热点 -> 电脑连接wifi -> 虚拟机中运行kali 2. kali 配置…...
[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2
Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具,能够批量为视频或音频生成字幕,还支持批量将字幕翻译成其他语言。该工具具有跨平台性,无论是 mac 系统还是 windows 系统都能使用。 参考原文&a…...
不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied
近期如果有开发者的 iOS 真机升级到 18.4 beta,大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示,其实从 log 可以很直观看出来,就是 Dart VM 在初始化时,对内核文件「解释运行(JIT)」时…...
介绍 torch-mlir 从 pytorch 生态到 mlir 生态
一、引言 The Torch-MLIR project provides core infrastructure for bridging the PyTorch ecosystem and the MLIR ecosystem. For example, Torch-MLIR enables PyTorch models to be lowered to a few different MLIR dialects. Torch-MLIR does not attempt to provide a…...
upload
(上传一句话木马,用蚁剑链接验证是否成功/传有回显的:<?php phpinfo();?>) 学看代码 #function checkfile(){}:定义了一个名叫checkfile的函数 #var file方法.(获取名为‘upload_file’的元素)[获取哪些&…...
InterHand26M(handposeX-json 格式)数据集-release >> DataBall
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! ---------------------------------------…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
