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

机器学习之KMeans算法

文章目录

    • 引言
    • 1. KMeans算法简介
    • 2. KMeans算法的数学原理
    • 3. KMeans算法的步骤
      • 3.1 初始化簇中心
      • 3.2 分配数据点
      • 3.3 更新簇中心
      • 3.4 停止条件
    • 4. KMeans算法的优缺点
      • 4.1 优点
      • 4.2 缺点
    • 5. KMeans算法的应用场景
      • 5.1 图像分割
      • 5.2 市场细分
      • 5.3 文档聚类
      • 5.4 异常检测
    • 6. Python实现KMeans算法
    • 7. 总结

引言

KMeans算法是机器学习中最经典的无监督学习算法之一,广泛应用于数据聚类任务。它的核心思想是通过迭代将数据集划分为K个簇,使得每个数据点属于离它最近的簇中心。由于其简单、高效且易于实现,KMeans算法在图像分割、市场细分、文档聚类等领域得到了广泛应用。

本文将详细介绍KMeans算法的原理、实现步骤、优缺点以及实际应用场景,并提供一个Python实现的示例。

1. KMeans算法简介

KMeans算法是一种基于距离的聚类算法,旨在将数据集划分为K个簇(cluster),使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。KMeans算法的核心思想是通过最小化簇内数据点与簇中心(centroid)之间的距离来实现聚类。

KMeans算法的名称中的“K”表示用户指定的簇的数量,而“Means”表示簇的中心是通过计算簇内数据点的均值得到的。

2. KMeans算法的数学原理

KMeans算法的目标是最小化簇内数据点与簇中心之间的平方误差(Sum of Squared Errors, SSE)。SSE的定义如下:

S S E = ∑ i = 1 K ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 SSE = \sum_{i=1}^{K} \sum_{x \in C_i} ||x - \mu_i||^2 SSE=i=1KxCi∣∣xμi2

其中:

  • ( K ) 是簇的数量。
  • ( Ci ) 表示第 ( i ) 个簇。
  • ( x ) 是簇 ( Ci ) 中的一个数据点。
  • ( ui ) 是簇 ( Ci ) 的中心(均值)。

KMeans算法通过迭代优化SSE,使得每个数据点都被分配到离它最近的簇中心,同时更新簇中心为簇内数据点的均值。

3. KMeans算法的步骤

KMeans算法的具体步骤如下:

  1. 初始化:随机选择K个数据点作为初始簇中心。
  2. 分配数据点:将每个数据点分配到离它最近的簇中心,形成K个簇。
  3. 更新簇中心:计算每个簇的均值,并将该均值作为新的簇中心。
  4. 迭代:重复步骤2和步骤3,直到簇中心不再发生变化或达到最大迭代次数。

3.1 初始化簇中心

KMeans算法的初始簇中心选择对最终结果有很大影响。常见的初始化方法有:

  • 随机选择K个数据点作为初始簇中心。
  • 使用KMeans++算法进行初始化,该方法通过优化初始簇中心的选择,减少算法陷入局部最优的概率。

3.2 分配数据点

在每次迭代中,KMeans算法会计算每个数据点到所有簇中心的距离,并将其分配到离它最近的簇中心。常用的距离度量方法有欧氏距离、曼哈顿距离等。

3.3 更新簇中心

在分配完所有数据点后,KMeans算法会重新计算每个簇的中心。新的簇中心是该簇内所有数据点的均值。

3.4 停止条件

KMeans算法的迭代停止条件通常有以下几种:

  • 簇中心不再发生变化。
  • 达到最大迭代次数。
  • SSE的变化小于某个阈值。

4. KMeans算法的优缺点

4.1 优点

  • 简单高效:KMeans算法的原理简单,易于实现,计算效率高,尤其适用于大规模数据集。
  • 可扩展性强:KMeans算法可以轻松扩展到高维数据。
  • 广泛应用:KMeans算法在图像处理、市场细分、文档聚类等领域有广泛应用。

4.2 缺点

  • 需要预先指定K值:KMeans算法需要用户预先指定簇的数量K,而K值的选择通常依赖于经验或领域知识。
  • 对初始簇中心敏感:KMeans算法的结果受初始簇中心的影响较大,可能会陷入局部最优。
  • 对噪声和异常值敏感:KMeans算法对噪声和异常值较为敏感,可能会影响聚类结果。
  • 仅适用于凸形簇:KMeans算法假设簇是凸形的,对于非凸形簇或形状复杂的簇,KMeans算法的效果较差。

5. KMeans算法的应用场景

KMeans算法在许多领域都有广泛的应用,以下是一些典型的应用场景:

5.1 图像分割

KMeans算法可以用于图像分割,将图像中的像素点聚类为不同的颜色区域,从而实现图像的分割和压缩。

5.2 市场细分

在市场分析中,KMeans算法可以根据客户的消费行为、 demographics等特征将客户划分为不同的群体,帮助企业制定针对性的营销策略。

5.3 文档聚类

在自然语言处理中,KMeans算法可以用于文档聚类,将相似的文档归类到同一簇中,从而实现文档的自动分类和组织。

5.4 异常检测

KMeans算法可以用于异常检测,通过将数据点聚类,识别出远离簇中心的异常点。

6. Python实现KMeans算法

下面是一个使用Python实现KMeans算法的示例代码:

import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics#读取文件
beer = pd.read_table("data.txt",sep=' ',encoding='utf8',engine='python')
#传入变量(列名)
x = beer[["calories","sodium","alcohol","cost"]]"""根据分成不同的簇,自动计算轮廓系数得分"""scores = []
for k in range(2,10):#寻找合适的K值labels = KMeans(n_clusters=k).fit(x).labels_ #从左到右依次进行计算, labels_ 获取每个样本的聚类标签score = metrics.silhouette_score(x,labels)#轮廓系数取值范围为[-1, 1]:# 接近 1:表示聚类效果好,样本距离自己簇的中心较近,距离其他簇的中心较远。# 接近 0:表示聚类效果较差,样本可能处于两个簇的边界。# 接近 -1:表示聚类效果很差,样本可能被分配到了错误的簇。scores.append(score)
print(scores)#绘制得分结果
import matplotlib.pyplot as pltplt.plot(list(range(2,10)),scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Sihouette Score")
plt.show()#聚类
km = KMeans(n_clusters=2).fit(x) #k值为2【分为2类】
beer['cluster'] = km.labels_
#将聚类结果(km.labels_)存储到beer数据集的cluster列中。cluster 是新创建的列,用于存储每个样本的簇标签。
#labels_ 是 K-Means 模型的一个属性,返回每个样本的聚类标签。
#例如,如果数据 x 有 100 个样本,km.labels_ 将返回一个长度为 100 的数组,数组中的每个值表示对应样本所属的簇(0 或 1,因为 K=2)。#对聚类结果进行划分
"""
采用轮廓系数评分
x:数据集  scaled_cluster:聚类结果
score:非标准化聚类结果的轮廓系数
"""
score = metrics.silhouette_score(x,beer.cluster)
print(score)

7. 总结

KMeans算法是机器学习中最常用的聚类算法之一,具有简单、高效、易于实现的特点。尽管KMeans算法有一些局限性,如对初始簇中心敏感、需要预先指定K值等,但通过合理的初始化和参数选择,KMeans算法仍然在许多实际应用中表现出色。

通过本文的介绍,相信大家对KMeans算法的原理、实现步骤和应用场景有了更深入的理解。希望本文能为你在实际项目中使用KMeans算法提供帮助。

相关文章:

机器学习之KMeans算法

文章目录 引言1. KMeans算法简介2. KMeans算法的数学原理3. KMeans算法的步骤3.1 初始化簇中心3.2 分配数据点3.3 更新簇中心3.4 停止条件 4. KMeans算法的优缺点4.1 优点4.2 缺点 5. KMeans算法的应用场景5.1 图像分割5.2 市场细分5.3 文档聚类5.4 异常检测 6. Python实现KMea…...

深度学习技术与应用的未来展望:从基础理论到实际实现

深度学习作为人工智能领域的核心技术之一,近年来引起了极大的关注。它不仅在学术界带来了革命性的进展,也在工业界展现出了广泛的应用前景。从图像识别到自然语言处理,再到强化学习和生成对抗网络(GAN),深度…...

FastStoneCapture下载安装教程(附安装包)专业截图工具

文章目录 前言FastStoneCapture下载FastStoneCapture安装步骤FastStoneCapture使用步骤 前言 在日常工作与学习里,高效截图工具至关重要。本教程将为你呈现FastStoneCapture下载安装教程,助你轻松拥有。 FastStoneCapture下载 FastStone Capture 是一款…...

基于AWS Endpoint Security的合规性保障

设计AWS云架构方案实现基于AWS Endpoint Security(EPS)的合规性保障,使用EPS持续收集终端设备的安全状态数据(如补丁版本、密码策略),并通过CloudWatch生成合规性报告。企业可利用这些数据满足GDPR、HIPAA等法规对终端设备的安全审…...

26考研——图_图的遍历(6)

408答疑 文章目录 三、图的遍历图的遍历概述图的遍历算法的重要性图的遍历与树的遍历的区别图的遍历过程中的注意事项避免重复访问遍历算法的分类遍历结果的不唯一性 广度优先搜索广度优先搜索(BFS)概述BFS 的特点广度优先遍历的过程示例图遍历过程 BFS …...

C++类与对象的第一个简单的实战练习-3.24笔记

在哔哩哔哩学习的这个老师的C面向对象高级语言程序设计教程&#xff08;118集全&#xff09;讲的真的很不错 实战一&#xff1a; 情况一&#xff1a;将所有代码写到一个文件main.cpp中 #include<iostream> //不知道包含strcpy的头文件名称是什么,问ai可知 #include<…...

4.1 C#获取目录的3个方法的区别

C#中常用有如下3个获取目录的方式如下 1.Directory.GetCurrentDirectory():获取当前工作目录&#xff0c;工作目录可能被用户或其他代码修改。尽量少用。&#xff08;似乎只要在运行中使用另存为或者打开某个文件夹&#xff0c;当前工作目录就修改&#xff09; 2.Application…...

架构设计之自定义延迟双删缓存注解(上)

架构设计之自定义延迟双删缓存注解(上) 小薛博客官方架构设计之自定义延迟双删缓存注解(上)地址 1、业务场景问题 在多线程并发情况下&#xff0c;假设有两个数据库修改请求&#xff0c;为保证数据库与redis的数据一致性&#xff0c;修改请求的实现中需要修改数据库后&#…...

oracle数据库(数据库启动关闭/sqlplus登录及基本操作/设置字符集/distinct去重)

目录 1. Oracle数据库启动 2. Oracle数据库关闭 3. sqlplus登录Oracle数据库 3.1 使用sqlplus登录Oracle数据库 3.2 使用sqlplus登录Oracle数据库 3.3 远程登录 3.4 解锁用户 3.5 修改用户密码 3.6 查看当前语言环境 4. sqlplus基本操作 4.1 显示当前用户 4.2 查看当前用户…...

深入理解智能家居领域中RS485、Modbus、KNX 和 Zigbee协议概念

首先详细介绍一下 RS485 和 Modbus 这两个在工业自动化和数据通讯领域中非常重要的概念。 RS485 1. 定义与特点 RS485 标准&#xff1a;RS485 是一种串行通信标准&#xff0c;也称为TIA-485标准&#xff0c;主要用于数据传输。它规定了物理层的电气特性&#xff0c;与数据格式…...

软考系统架构师论文模版及实例

记住总体原则: 摘要——300字 项目背景与职责——300字左右 选取的架构特点——200字左右 架构在项目中的具体应用过程——1500字左右&#xff08;从每种架构中至少总结三个方面进行描述&#xff0c;例如三个特点在项目中的体现&#xff0c;三个步骤在项目中的应用等&#xff0…...

1、SpringBoot集成MyBatis

&#xff08;1&#xff09;创建SpringBoot项目 &#xff08;2&#xff09;集成MyBatis 导入坐标 <!-- 连接数据库&#xff0c;版本5 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><versi…...

网络编程的概念&作用

网络编程是什么&#xff1f; 想象一下&#xff0c;你和朋友在不同的房间里&#xff0c;你们想互相传递纸条聊天。网络编程就像是编写一套规则&#xff0c;让计算机能够通过网络&#xff08;比如互联网&#xff09;互相传递信息。这些信息可以是文字、图片、视频&#xff0c;甚…...

Linux实操篇-权限管理

目录 传送门前言一、权限管理概念二、权限管理实战1. Linux文件权限模型1.1 文件的三种基本权限1.2 权限的三类主体 2. 查看文件权限3. 修改文件权限3.1 使用符号方式修改权限3.2 使用数字方式修改权限 4. 特殊权限4.1 SUID&#xff08;Set User ID&#xff09;4.2 SGID&#x…...

阿里开源的免费数据集成工具——DataX

企业里真实的数据流转是什么样子的呢&#xff1f; 左侧描述了一个企业真实的样子&#xff0c;我们总是需要把数据从一个地方搬到另一个地方&#xff0c;最后就是搬来搬去搬成了一张张解不开的网。 右侧则表达了使用DataX为中心实现数据的同步。 什么是DataX DataX是一个异构…...

【前端】使用 HTML、CSS 和 JavaScript 创建一个数字时钟和搜索功能的网页

文章目录 ⭐前言⭐一、项目结构⭐二、HTML 结构⭐三、CSS 样式⭐四、JavaScript 功能⭐五、运行效果⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数…...

地理信息可视化技术大全【WebGIS 教程一】

前言&#xff1a; 在当今数据驱动的时代&#xff0c;地理信息技术&#xff08;GIS&#xff09;和空间数据可视化已成为科学研究、商业决策和智慧城市建设的重要工具。随着Web技术的快速发展&#xff0c;基于浏览器端的地图渲染和地理信息处理能力显著增强&#xff0c;各类开源与…...

SLAM十四讲【四】相机与图像

SLAM十四讲【四】相机与图像 SLAM十四讲【一】基本概念 SLAM十四讲【二】三维空间刚体运动 SLAM十四讲【三】李群与李代数 SLAM十四讲【四】相机与图像 SLAM十四讲【五】线性优化 SLAM十四讲【六】视觉里程计 SLAM十四讲【七】回环检测 SLAM十四讲【八】建图 文章目录 SLAM十四…...

深入理解Java享元模式及其线程安全实践

引言 在软件系统中&#xff0c;当需要处理海量细粒度对象时&#xff0c;直接创建大量实例可能会导致内存消耗激增和性能下降。享元模式&#xff08;Flyweight Pattern&#xff09;通过共享对象内部状态&#xff0c;成为解决这类问题的经典方案。然而在多线程环境下&#xff0c…...

类和对象-运算符重载-C++

1.加号运算符重载 1.成员函数重载调用 函数的定义部分&#xff08;这里的person是返回值类型&#xff0c;不是说构造函数&#xff09; class person { public:person operator(person& p){person temp;temp.a this->a p.a;temp.b this->b p.b;return temp;}in…...

2000-2019年各省地方财政耕地占用税数据

2000-2019年各省地方财政耕地占用税数据 1、时间&#xff1a;2000-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政耕地占用税 4、范围&#xff1a;31省 5、指标说明&#xff1a;耕地占用税是地方财政的一种税收&…...

从零到一开发一款 DeepSeek 聊天机器人

AI聊天机器人 目标设计方案系统架构技术选型功能模块 实现代码环境配置安装依赖 核心代码API 请求函数主循环函数 功能扩展1. 情感分析2. 多语言支持3. 上下文记忆4. 用户身份识别 总结附录 目标 开发一个智能聊天机器人&#xff0c;旨在为用户提供自然、流畅的对话体验。通过…...

S32K144外设实验(五):FTM周期中断

文章目录 1. 概述1.1 时钟系统1.2 实验目的 2. 代码的配置 1. 概述 1.1 时钟系统 FTM的CPU接口时钟为SYS_CLK&#xff0c;在RUN模式下最高80MHz。模块的时钟结构如下图所示。 从上图中可以看出&#xff0c;FTM模块的功能时钟为SYS_CLK&#xff0c;计数器的时钟源可以来源于三…...

Android 静态壁纸设置实现方案

提示&#xff1a;Android 平台&#xff0c;静态壁纸实现方案 文章目录 需求&#xff1a;Android 实现壁纸 设置场景 参考资料实现方案直接调用系统 API,WallpaperManager 来实现 wallpaperManager.setResource系统源码分析系统app WallpaperPickerWallpaperPickerActivity ->…...

在计算进程D状态持续时间及等IO的时间遇到的一处问题

一、背景 之前的博客 线程每次iodelay监控及D状态开始和结束监控并做堆栈记录-CSDN博客 里&#xff0c;我们讲到了通过内核模块抓取D状态的进程和等IO事件的方法&#xff0c;里面也用到了通过获取rq的symbol&#xff0c;再去获取rq里的rq_clock_task时间的方法&#xff08;内核…...

Android11-12-13 替换系统默认壁纸

替换默认壁纸&#xff0c;是客需中再普通不过的需求&#xff0c;这里整理作为笔记记录 文章目录 需求场景 关联资料需求实现拓展总结 需求 客制化客户壁纸需求&#xff0c;替换客户定制的壁纸。 场景 手机-平板相关产品&#xff0c;各种广告机、工控、消费级产品&#xff0c…...

Buffer overFolw---Kryo序列化出现缓冲区溢出的问题解决

问题&#xff1a; 由于我的数据量太大&#xff0c;我设置批次为10000万&#xff0c;50w数据大概有400M左右&#xff0c;然后进行spark数据处理时候报错为org.apache.spark.SparkException:Kryo serialization failed:Buffer overFolw.Available:0,rquired 58900977,To …...

什么是索引?为什么要使用B树作为索引数据结构?

MySQL的事务特性 1.原子性:原子性就是这个事件要么执行完,要么没执行,不会存在中间状态,与C中华那个加锁避免多线程竞争是一个道理; 2.一致性:保持事件的操作对象双方某数据之和是不变的,就以转账为例,A转给B100块,那么A的余额多100,B的余额就必须少100; 3.隔离性:隔离就是独…...

【Linux】线程基础

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.背景知识02.线程概念简单使用线程线程调度成本更低 01.背景知识 OS进行内存管理&#xff0c;不是以字节为单位的&#xff0c;而是以内存块为单位的&#xff0c;默认大小为4kb&…...

TCP netstat TIME_WAIT CLOSE_WAIT

TIME_WAIT is different from CLOSE_WAIT, and it’s not necessarily a client-side fault. It happens due to how TCP handles connection termination. Key Differences TCP StateCauseWho is responsible?Fix/OptimizationCLOSE_WAITServer didn’t close() the socket…...