当前位置: 首页 > news >正文

【机器学习】K-Means算法详解:从原理到实践


鑫宝Code

🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"


文章目录

  • K-Means算法详解:从原理到实践
    • 引言
    • 1. 基本原理
      • 1.1 簇与距离度量
      • 1.2 初始化与迭代
    • 2. 算法流程
    • 3. 参数选择与优化
    • 4. 优缺点分析
      • 优点
      • 缺点
    • 5. 实际应用案例
      • 5.1 客户细分
      • 5.2 文档分类
      • 5.3 图像分割
    • 6. 结语

K-Means算法详解:从原理到实践

在这里插入图片描述

引言

K-Means是一种广泛应用于数据挖掘、机器学习领域的无监督学习算法,主要用于聚类分析。它的核心思想是将数据集划分为K个簇(cluster),每个簇内的数据相似度较高,而不同簇间的数据相似度较低。本文将深入浅出地介绍K-Means算法的基本原理、算法流程、优缺点、参数选择、优化方法以及实际应用案例,帮助读者全面理解和掌握这一经典算法。

1. 基本原理

1.1 簇与距离度量

  • :K-Means的目标是将数据集分割成K个互不相交的子集,每个子集即为一个簇。
  • 距离度量:衡量数据点间相似度的标准,常用欧氏距离。对于高维数据,也可以采用其他距离度量方法,如曼哈顿距离、余弦相似度等。

1.2 初始化与迭代

  • 初始化:随机选择K个数据点作为初始聚类中心。
  • 迭代过程
    1. 分配:将每个数据点分配给最近的聚类中心所在的簇。
    2. 更新:根据每个簇内数据点的均值(对于连续属性)或众数(对于离散属性)重新计算聚类中心。
  • 终止条件:当聚类中心不再发生显著变化或达到预设的最大迭代次数时停止。

2. 算法流程

1. 设定聚类数量K,随机选取K个数据点作为初始质心。
2. 对于数据集中的每个数据点,计算其与所有质心的距离,将其归入最近的质心所代表的簇。
3. 重新计算每个簇的质心,方法是取簇中所有点的均值。
4. 检查质心是否发生变化。如果质心有变化,则返回步骤2;否则,结束,输出最终的簇划分结果。

以下是一个使用Python和scikit-learn库实现K-Means聚类算法的示例代码。这个例子包括了从数据准备、模型训练到结果可视化的基本流程。

首先,请确保已经安装了numpy, matplotlib, 和 scikit-learn 这几个必要的库。如果没有安装,可以通过运行 pip install numpy matplotlib scikit-learn 来安装它们。以下代码仅供参考🐶

# 导入所需库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs# 生成模拟数据集
# make_blobs 用于创建带有标签的数据集,这里我们忽略真实标签,仅用于演示
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# 使用KMeans进行聚类
kmeans = KMeans(n_clusters=4) # 设置聚类数量为4
kmeans.fit(X)# 预测每个样本的簇标签
labels = kmeans.predict(X)# 可视化聚类结果
plt.figure(figsize=(8, 6))
colors = ['r', 'g', 'b', 'y']
for i in range(4):plt.scatter(X[labels == i, 0], X[labels == i, 1], c=colors[i], label=f'Cluster {i+1}')# 绘制聚类中心
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', marker='x', s=200, label='Centroids')plt.title('K-Means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()# 输出每个聚类中心的位置
print("Cluster Centers:")
print(kmeans.cluster_centers_)

这段代码首先生成了一个包含四个明显簇的数据集,然后使用KMeans类对其进行聚类,并通过颜色区分不同的簇。最后,它还绘制了每个簇的中心点。通过调整参数,您可以应用于自己的数据集上进行聚类分析。

3. 参数选择与优化

  • K的选择:肘部法则、轮廓系数、Calinski-Harabasz指数等方法可以帮助确定最优的K值。
  • 初始化方法:除了随机选择,还可以采用K-Means++策略,以提高算法的稳定性和收敛速度。
  • 避免局部最优:多次运行算法并选择最佳聚类结果,或采用Mini-Batch K-Means等变体来探索更多解空间。

4. 优缺点分析

优点

  • 简单直观:易于理解和实现。
  • 效率高:对于大规模数据集尤其有效,时间复杂度为O(nKI),其中n是数据点数量,I是迭代次数。
  • 可解释性强:输出直观,便于分析。

缺点

  • 对初始质心敏感:不同的初始质心可能导致完全不同的聚类结果。
  • 需要预先设定K值:实际应用中K的选择往往依赖经验或试错。
  • 假设各簇为凸形状且大小相近:对于非球形簇或大小差异大的数据集表现不佳。
  • 对异常值敏感:异常值可能会严重影响聚类中心的计算。

5. 实际应用案例

5.1 客户细分

电商平台通过分析用户的购买行为、浏览记录等数据,利用K-Means算法对用户进行分群,为不同群体提供个性化推荐和服务,提升用户体验和销售转化率。

5.2 文档分类

在文本挖掘领域,K-Means可以用来对文档集合进行主题分类。通过将文档转换为TF-IDF向量表示,然后应用K-Means算法,可以自动将相似主题的文档归为一类。
在这里插入图片描述

5.3 图像分割

在图像处理中,K-Means可用于图像分割,通过对像素颜色值进行聚类,可以识别出图像中的不同区域,适用于背景去除、图像简化等场景。
在这里插入图片描述

6. 结语

K-Means算法以其简单高效的特点,在众多领域展现了强大的实用价值。然而,针对其存在的局限性,研究人员不断提出改进方法,如二分K-Means、谱聚类等,以适应更复杂的数据结构和应用场景。掌握K-Means不仅是数据科学基础的重要组成部分,也是进一步探索高级聚类技术的基石。希望本文能为读者理解并应用K-Means算法提供有益的指导。

End

相关文章:

【机器学习】K-Means算法详解:从原理到实践

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 K-Means算法详解:从原理到实践引言1. 基本原理1.1 簇与距离度量1.2 …...

解决qiankun项目与子应用样式混乱问题

背景 qiankun项目用的是Vue2Antdesign2,但其中一个子应用用的是Vue3Antdesign4。集成之后发现子应用的样式混乱,渲染的是Antdesign2的样式。 解决 以下步骤在子应用里操作 1. 在main.js引入ConfigProvider ,在app全局注册ConfigProvider …...

黑产当前,如何识别异常图片?

在这个人人都是创作者的年代, UGC 已成为诸多平台的重要组成。 有利益的地方就会有黑产存在, 不少 UGC 平台都被黑产「薅羊毛」搞的心烦意乱, 用户传的图片,怎么就变成视频链接了? 正常运营的平台,为何流量…...

数据模型(models)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 (1)在App中添加数据模型 在app1的models.py中添加如下代码: from django.db import models # 引入django.…...

【CS.AL】算法核心之贪心算法 —— 力扣(LeetCode)743. 网络延迟时间 - Dijkstra算法题解

文章目录 题目描述References 题目描述 743. 网络延迟时间 - 力扣(LeetCode) 有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,其中 times[i] (u, v, w) 表示有一条从节点 u 到节点 v 的时延为 w 的有向边。 现在&#xf…...

25、架构-微服务的驱动力

微服务架构的驱动力可以从多方面探讨,包括灵活性、独立部署、技术异构性、团队效率和系统弹性等。 灵活性和可维护性 灵活性是微服务架构的一个主要优势。通过将单体应用拆分成多个独立的微服务,开发团队可以更容易地管理、维护和更新各个服务。每个微…...

JeecgFlow事件网关概念及案例

事件网关 通常网关基于连线条件决定后续路径,但事件网关有所不同,其基于事件决定后续路径。事件网关的每条外出顺序流都需要连接一个捕获中间事件。 事件网关只有分支行为,流程的走向完全由中间事件决定。可以从多条候选分支中选择事件最先达…...

使用鸿蒙HarmonyOs NEXT 开发 快速开发 简单的购物车页面

目录 资源准备:需要准备三张照片:商品图、向下图标、金钱图标 1.显示效果: 2.源码: 资源准备:需要准备三张照片:商品图、向下图标、金钱图标 1.显示效果: 定义了一个购物车页面的布局&#x…...

iOS 中 attribute((constructor)) 修饰的函数

开发环境声明:此文描述的 attribute((constructor)) 特指使用 Objective-C 开发 iOS、MacOS,Swift 语言不支持这种属性修饰符。 初识 attribute((constructor)) 在 Objective-C 开发中,attribute((constructor)) 是一个 GCC 和 Clang 编译器…...

原生js实现图片预览控件,支持丝滑拖拽,滚轮放缩,放缩聚焦

手撸源代码如下&#xff1a;注释应该很详细了&#xff0c;拿去直用 可以放到在线编辑器测试&#xff0c;记得修改图片路径 菜鸟教程在线编辑器 <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" conten…...

C语言入门课程学习笔记9:指针

C语言入门课程学习笔记9 第41课 - 指针&#xff1a;一种特殊的变量实验-指针的使用小结 第42课 - 深入理解指针与地址实验-指针的类型实验实验小结 第43课 - 指针与数组&#xff08;上&#xff09;实验小结 第44课 - 指针与数组&#xff08;下&#xff09;实验实验小结 第45课 …...

借助 Cloudflare D1 和 Drizzle 在 Astro 上实现全栈

使用 Cloudflare D1 和 Drizzle ORM 将后端添加到 Astro 项目的分步指南 文章目录 安装 Astro添加 Cloudflare 适配器部署到 Pages安装 wrangler 并登录创建 D1 数据库创建 wrangler.toml 文件将 .wrangler 添加到 .gitignore更新 astro.config.ts安装 Drizzle 依赖项创建 driz…...

SUSE linux 15的网络管理

1 手工配置网络 wicked提供了一种新的网络配置框架。自SUSE 12起&#xff0c;SUSE使用了新的网络管理工具wicked&#xff0c;这个是区别与其他常见发行版的。常见的发行版目前大多使用的是NetworkManager服务进行网络管理。 1.1 wicked网络配置 传统网络接口管理面临的挑战之…...

海康威视-下载的录像视频浏览器播放问题

目录 1、播放异常比对 2、视频编码检查 2.1、正常视频解析 2.2、海康视频解析 2.3、比对工具 3、转码 3.1、maven依赖 3.2、实现代码 4、验证 在前面的文章&#xff08;海康威视-按时间下载录像文件_海康威视 sdk 下载录像 大小0-CSDN博客&#xff09;中&#xff0c;通…...

养殖自动化管理系统:开启智慧养殖新篇章

在现代农业的快速演进中&#xff0c;养殖业正经历一场前所未有的技术革命。养殖自动化管理系统&#xff0c;作为这场变革的前沿科技&#xff0c;正逐步成为推动行业高效、环保、可持续发展的关键力量。本文将深入探讨自动化养殖系统如何通过精准管理、智能监控、数据驱动决策&a…...

SmartEDA革新来袭:融合Multisim与Proteus精髓,引领电子设计新纪元!

在电子设计领域&#xff0c;每一次技术的革新都如同春风化雨&#xff0c;滋润着设计师们的心田。今天&#xff0c;我们迎来了一个划时代的电子设计自动化&#xff08;EDA&#xff09;工具——SmartEDA&#xff0c;它不仅融合了业界知名的Multisim和Proteus的精华&#xff0c;更…...

【FFmpeg】AVFormatContext结构体

【FFmpeg】AVFormatContext结构体 1.AVFormatContext结构体1.2 const struct AVInputFormat *iformat1.3 const struct AVOutputFormat *oformat 参考&#xff1a; FFMPEG结构体分析&#xff1a;AVFormatContext 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FF…...

【SpringSecurity】认证与鉴权框架SpringSecurity——授权

目录 权限系统的必要性常见的权限管理框架SpringSecurity授权基本流程准备脚本限制访问资源所需权限菜单实体类和Mapper封装权限信息封装认证/鉴权失败处理认证失败封装鉴权失败封装配置SpringSecurity 过滤器跨域处理接口添加鉴权hasAuthority/hasAnyAuthorityhasRole/​ hasA…...

深入解析FTP:原理、架构与搭建方式

在当今互联网世界中&#xff0c;文件传输是日常工作和生活中不可或缺的一部分。FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;作为一种老而弥坚的协议&#xff0c;一直在文件传输领域发挥着重要作用。本文将从技术人的角度&#xff0c;详细分析F…...

Springboot与RestTemplate

RestTemplate是Spring提供的用于访问Rest服务的客户端&#xff0c;RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 一、使用Get进行访问 1、获取json格式 使用 getForEntity() API 发起 GET 请求&#xff1a; RestTemplate restTemplate…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...