目录

K-Means 聚类:从原理到实践的完整指南

什么是 K-Means 聚类?

应用场景举例

K-Means 算法的核心原理

K-Means 算法的步骤详解

可视化理解

K-Means 的优缺点分析

优点

缺点

如何选择合适的 K 值?

1. 肘部法(Elbow Method)

2. 轮廓系数(Silhouette Score)

K-Means 的改进算法

总结


一.K-Means 聚类:从原理到实践的完整指南

聚类分析是机器学习中一种重要的无监督学习方法,它能够将相似的数据点自动分组,发现数据中潜在的结构和模式。在众多聚类算法中,K-Means 因其简单、高效和广泛的适用性而成为最受欢迎的算法之一。本文将深入解析 K-Means 聚类算法的原理、实现步骤、优缺点及实际应用案例。

1.什么是 K-Means 聚类?

K-Means 是一种迭代式的聚类算法,其核心思想是将 n 个数据点划分为 k 个不同的簇(Cluster),使得每个簇内的数据点具有较高的相似度,而不同簇之间的数据点差异较大。

"K" 代表我们想要创建的簇的数量,"Means" 则指每个簇的中心点(质心),算法通过计算数据点与质心的距离来决定数据点的归属。

    应用场景举例

    K-Means 在实际生活中有着广泛应用:

    • 客户分群:电商平台根据用户购买行为将客户分为不同群体,进行精准营销
    • 文本聚类:将新闻文章按主题自动分类
    • 图像分割:识别图像中不同的物体区域
    • 异常检测:发现数据中的异常值或离群点
    • 市场细分:根据消费者特征划分不同的市场群体

    2.无监督学习与有监督学习的区别

    • 有监督学习:需要X和Y数据,Y作为监督信号,模型通过Y优化预测结果(如分类、回归)。
    • 无监督学习:仅使用X数据,无Y标签,通过数据内在结构进行聚类(如K-means)。

    3.K-Means 算法的核心原理

    K-Means 算法的工作流程基于以下关键概念:

    1. 簇(Cluster):具有相似特征的数据点集合
    2. 质心(Centroid):每个簇的中心点,是该簇内所有数据点的平均值
    3. 距离度量:通常使用欧氏距离衡量数据点与质心的相似度
    4. 目标函数:最小化所有数据点到其所属簇质心的距离之和(平方误差和)

    4.K-Means 算法的步骤详解

    K-Means 算法通过迭代方式逐步优化聚类结果,具体步骤如下:

    1. 确定 K 值:根据业务需求或数据特点,指定要创建的簇数量 K

    2. 初始化质心:随机选择 K 个数据点作为初始质心

    3. 分配数据点:计算每个数据点到 K 个质心的距离,将数据点分配到距离最近的质心所在的簇

    4. 更新质心:计算每个簇内所有数据点的平均值,作为新的质心

    5. 重复迭代:重复步骤 3 和步骤 4,直到质心不再显著变化或达到预设的最大迭代次数

    6. 输出结果:得到最终的 K 个簇及对应的质心

    可视化理解

    想象在二维平面上有一些散点,K-Means 的过程就像是:

    • 先在平面上随机放 K 个 "种子" 点(初始质心)
    • 每个点都选择离自己最近的种子点 "站队"
    • 每个队伍计算出自己的 "中心位置"(新质心)
    • 所有点根据新的中心位置重新选择队伍
    • 重复以上过程,直到每个队伍的中心位置稳定下来

    5.K-Means的评价指标(轮廓系数)

    • 轮廓系数用于评估聚类效果,公式涉及两个关键指标:
      • a_i:样本点与同簇其他点距离的平均值(簇内距离)。
      • b_i:样本点到其他簇所有点距离的最小平均值(簇间距离)。
    • 单个样本的轮廓系数计算公式为:
      s_i = (b_i - a_i)\max(a_i, b_i)
    • 整体轮廓系数为所有样本轮廓系数的平均值,取值范围为 [-1, 1]
      • 接近 1:聚类效果优秀。
      • 接近 -1:聚类效果差(样本可能被误分到其他簇)。
      • 接近 0:样本位于簇边界。

    6.K-Means 的优缺点分析

    优点

    • 算法简单易懂,实现方便
    • 计算效率高,对大数据集表现良好
    • 聚类结果可解释性强
    • 适用于高维数据

    缺点

    • 需要预先指定 K 值,而最佳 K 值往往不明确
    • 对初始质心的选择敏感,可能导致不同的聚类结果
    • 对噪声和异常值敏感
    • 不太适合发现非凸形状的簇
    • 当簇的大小差异较大时表现不佳

    7.如何选择合适的 K 值?

    选择合适的 K 值是 K-Means 聚类的关键挑战之一。以下是两种常用方法:

    1. 肘部法(Elbow Method)

    肘部法通过绘制 "K 值 - 误差平方和" 曲线来确定最佳 K 值:

    • 计算不同 K 值(如 1 到 10)对应的聚类结果
    • 计算每个 K 值下的误差平方和(SSE),即所有数据点到其簇质心的距离平方之和
    • 绘制 K 值与 SSE 的关系曲线
    • 曲线中 "肘部" 对应的 K 值即为最佳选择,此时 SSE 开始趋于平稳

    2. 轮廓系数(Silhouette Score)

    轮廓系数用于衡量聚类结果的质量:

    • 取值范围为 [-1, 1]
    • 接近 1 表示样本聚类合理
    • 接近 0 表示样本可能位于两个簇的边界
    • 接近 - 1 表示样本可能被分到错误的簇

    选择轮廓系数最高的 K 值作为最佳聚类数量。

    K-Means 的改进算法

    由于基本 K-Means 存在一些局限性,研究者提出了多种改进算法:

    • K-Means++:改进了初始质心的选择方法,使质心尽可能远离,提高聚类效果
    • Mini-Batch K-Means:对大数据集更高效,使用部分样本计算质心
    • Bisecting K-Means:层次化聚类方法,通过不断二分簇来构建聚类结果
    • Kernel K-Means:利用核函数将数据映射到高维空间,能够处理非凸形状的簇

    在 scikit-learn 中,KMeans类默认使用n_init='auto'参数,会根据数据情况自动选择合适的初始质心数量,实际上已经包含了 K-Means++ 的改进。

    总结

    K-Means 聚类是一种简单而强大的无监督学习算法,能够有效地发现数据中的自然分组。尽管它存在需要预先指定 K 值、对初始质心敏感等局限性,但通过合理选择参数和结合其他评估方法,K-Means 仍然是数据分析和挖掘中的重要工具。

    在实际应用中,建议:

    1. 对数据进行标准化处理,消除量纲影响
    2. 结合多种方法确定最佳 K 值
    3. 多次运行算法,避免因初始质心选择不当导致的局部最优
    4. 可视化聚类结果,直观理解数据结构

    二.案例实现(酒类数据聚类)

    1.K-Means参数

    源码如下

    • n_clusters:指定聚类中心数量(K值)。
    • init:初始化质心方法(默认 k-means++,优于随机初始化)。
    • n_init:初始化质心的次数(默认10次,避免因初始质心选择不佳影响结果)。
    • max_iter:单次K-Means算法的最大迭代次数(默认300)。

    2.读取数据

    数据特征:卡路里、氮浓度、酒精浓度、价格。data.txt部分内容如下:

    第一列的name与训练无关不要读取

    import pandas as pd
    import numpy as np
    beer = pd.read_table('data.txt',sep=' ')#注意sep划分数据
    X=beer.iloc[:,1:]

    2.遍历K值,计算轮廓系数选择最优K(本例K=2最佳)。

    from sklearn.cluster import KMeans
    from sklearn import metrics
    scores=[]
    k=range(2,10)
    for i in k:km=KMeans(n_clusters=i)km.fit(X)labels=km.labels_score=metrics.silhouette_score(X,labels)scores.append(score)
    best_k=k[np.argmax(scores)]
    print('best_k=',best_k)

    3.训练模型并输出聚类标签。

    km=KMeans(n_clusters=best_k)
    km.fit(X)
    labels=km.labels_
    beer['cluster']=labels
    beer.sort_values('cluster',inplace=True)
    print('轮廓系数: ',metrics.silhouette_score(beer.iloc[:,1:5],beer.cluster))

    4.完整代码

    import pandas as pd
    import numpy as np
    beer = pd.read_table('data.txt',sep=' ')#注意sep划分数据
    X=beer.iloc[:,1:]from sklearn.cluster import KMeans
    from sklearn import metrics
    scores=[]
    k=range(2,10)
    for i in k:km=KMeans(n_clusters=i)km.fit(X)labels=km.labels_score=metrics.silhouette_score(X,labels)scores.append(score)
    best_k=k[np.argmax(scores)]
    print('best_k=',best_k)
    km=KMeans(n_clusters=best_k)
    km.fit(X)
    labels=km.labels_
    beer['cluster']=labels
    beer.sort_values('cluster',inplace=True)
    print('轮廓系数: ',metrics.silhouette_score(beer.iloc[:,1:5],beer.cluster))

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

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    RabbitMQ面试精讲 Day 16:生产者优化策略与实践

    【RabbitMQ面试精讲 Day 16】生产者优化策略与实践 开篇 欢迎来到"RabbitMQ面试精讲"系列第16天,今天我们聚焦RabbitMQ生产者优化策略与实践。在消息队列系统中,生产者的性能表现直接影响整个系统的吞吐量和可靠性。掌握生产者优化技巧不仅能…

    Android 系统的安全 和 三星安全的区别

    维度Android(AOSP 通用)Samsung(Knox 强化)本质差异一句话信任根标准 Verified Boot(公钥由谷歌或 OEM 托管)额外在 自家 SoC 里烧录 Knox 密钥 熔丝位,一旦解锁即触发 Knox 0x1 熔断&#xff…

    开源大模型实战:GPT-OSS本地部署与全面测评

    文章目录一、引言二、安装Ollama三、Linux部署GPT-OSS-20B模型四、模型测试4.1 AI幻觉检测题题目1:虚假历史事件题目2:不存在的科学概念题目3:虚构的地理信息题目4:错误的数学常识题目5:虚假的生物学事实4.2 算法题测试…

    【无标题】命名管道(Named Pipe)是一种在操作系统中用于**进程间通信(IPC)** 的机制

    命名管道(Named Pipe)是一种在操作系统中用于进程间通信(IPC) 的机制,它允许不相关的进程(甚至不同用户的进程)通过一个可见的文件系统路径进行数据交换。与匿名管道(仅存在于内存&a…

    Baumer相机如何通过YoloV8深度学习模型实现危险区域人员的实时检测识别(C#代码UI界面版)

    《------往期经典推荐------》 AI应用软件开发实战专栏【链接】 序号 项目名称 项目名称 1 1.工业相机 + YOLOv8 实现人物检测识别:(C#代码,UI界面版) 2.工业相机 + YOLOv8 实现PCB的缺陷检测:(C#代码,UI界面版) 2 3.工业相机 + YOLOv8 实现动物分类识别:(C#代码,U…

    本文章分享一个本地录音和实时传输录音给app的功能(杰理)

    我用的是杰理手表sdk,该功能学会就可自行在任何杰里sdk上做,库函数大致一样,学会运用这个方向就好。1.我们要验证这个喇叭和麦是否正常最简单的的办法,就是直接万用表测试,直接接正负极,看看是否通路&#…

    Netty-Rest搭建笔记

    0.相关知识Component、Repository、ServiceRepository //Scope设置bean的作用范围 Scope("singleton")//单例 prototype每次创建都会给一个新实例。 public class BookDaoImpl implements BookDao { //生命周期public void save() {System.out.println("book d…

    工作笔记-----lwip网络任务初始化问题排查

    工作笔记-----基于FreeRTOS的lwIP网络任务初始化问题排查 Author:明月清了个风Date: 2025/8/10PS:新项目中在STMF7开发板上基于freeRTOS和lwIP开发网口相关任务,开发过程中遇到了网口无法连接的问题,进行了一系列的排查…

    Kotlin动态代理池+无头浏览器协程化实战

    我看到了很多作者展示了Kotlin在爬虫领域的各种高级用法。我需要从中提取出最"牛叉"的操作,也就是那些充分利用Kotlin语言特性,使爬虫开发更高效、更强大的技巧。 我准备用几个主要部分来组织内容,每个部分会突出Kotlin特有的"…

    PDF编辑工具,免费OCR识别表单

    软件介绍 今天推荐一款功能全面的PDF编辑工具——PDF XChange Editor,支持文本、图片编辑及OCR识别,还能一键提取表单信息,满足多样化PDF处理需求。 软件优势 该软件完全免费,下载后双击图标即可直接运行,无需安装&…

    OpenEnler等Linux系统中安装git工具的方法

    在欧拉系统中安装 Git使用 yum 包管理器安装(推荐,适用于欧拉等基于 RPM 的系统):# 切换到 root 用户(若当前不是) su - root# 安装 Git yum install -y git验证安装是否成功:git --version若输…

    UE5 第三人称视角如何设置camera移动旋转

    “奇怪,这blog不支持md格式吗”## 第1步:设置玩家Pawn 创建一个蓝图类,继承自 Pawn,在游戏模式(Game Mode)中,将这个Pawn设置为默认 在组件面板中,添加一个 Spring Arm 组件 在组件面…

    OpenCV 入门教程:开启计算机视觉之旅

    目录 一、引言​ 二、OpenCV 简介 ​(一)什么是 OpenCV (二)OpenCV 的特点与优势 (三)OpenCV 的应用领域 三、环境搭建 (一)安装 OpenCV 库​ 四、OpenCV 基础操作 &#xf…

    C++高频知识点(十九)

    文章目录91. TCP断开连接的时候为什么必须4次而不是3次?92. 为什么要区分用户态和内核态?93. 说说编写socket套接字的步骤1. 服务器端编写步骤1.1 创建套接字1.2 绑定套接字1.3 监听连接1.4 接受连接1.5 数据传输1.6 关闭套接字2. 客户端编写步骤2.1 创建…

    一个基于 epoll 实现的多路复用 TCP 服务器程序,相比 select 和 poll 具有更高的效率

    /*5 - 使用epoll实现多路复用 */ #include <stdio.h> // 标准输入输出函数库 #include <stdlib.h> // 标准库函数&#xff0c;包含exit等 #include <string.h> // 字符串处理函数 #include <unistd.h> // Unix标准函…

    元数据管理与数据治理平台:Apache Atlas 通知和业务元数据 Notifications And Business Metadata

    文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。Apache Atlas 框架是一套可扩展的核心基础治理服务&#xff0c;使企业能够有效、高效地满足 Hadoop 中的合规性要求&#xff0c;并支持与整个企…

    rem:CSS中的相对长度单位

    &#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

    【10】C#实战篇——C# 调用 C++ dll(C++ 导出函数、C++导出类)

    文章目录1 导出C 类函数 、导出 C函数1.1 .h文件1.2 .cpp 文件1.3 C# 调用2 C与C#数据类型对应3 保姆级教程&#xff08;项目搭建、代码、调用&#xff0c;图文并茂&#xff09;1 导出C 类函数 、导出 C函数 C 生成动态库.dll 详细教程&#xff1a; C 生成动态库.dll 及 C调用…

    Flutter 与 Android NDK 集成实战:实现高性能原生功能

    Flutter 与 NDK 集成实现 Flutter 可以通过 Platform Channels 与原生代码&#xff08;包括使用 NDK 编写的 C/C 代码&#xff09;进行交互。以下是实现 Flutter 与 NDK 集成的步骤&#xff1a; 基本步骤 1. 创建 Flutter 项目 flutter create flutter_ndk_example cd flutter_…

    elementui cascader 远程加载请求使用 选择单项等

    背景&#xff1a;小程序与后端使用自定义表单渲染视图。发现若没有全选&#xff08;如&#xff1a;省市县全部选择&#xff0c;指定的市3级&#xff09;在pc端就会无法渲染出已经选择的区县名称。 解决方案&#xff1a;参考官方文档&#xff0c;设置属性可独立勾选element ui c…