《机器学习》—— K-means 聚类算法

文章目录

  • 一、什么是K-means 聚类算法?
  • 二、聚类效果评价方式——轮廓系数
  • 三、示例:代码实现
  • 四、聚类算法的优缺点

一、什么是K-means 聚类算法?

  • K-Means 是 Python 中非常流行的一个聚类算法,它属于无监督学习算法的一种。在 scikit-learn(一个广泛使用的机器学习库)中,KMeans 类用于执行 K-均值聚类。K-均值聚类是一种将数据点分成 K 个簇的算法,其中每个簇由簇内数据点的均值(即“质心”)定义。
  • 基本原理
    • 初始化:首先,算法随机选择 K 个点作为初始的簇质心(如动图中的X点)。
    • 分配:然后,算法将每个数据点分配到最近的簇质心,形成 K 个簇。
      • 满足条件:所有的数据点到质心的距离(使用欧氏距离)之和是最小的
    • 更新:接着,算法重新计算每个簇的质心,即计算簇内所有点的均值
    • 迭代:重复分配和更新步骤,直到簇质心的位置不再发生显著变化,或者达到预设的迭代次数。
  • 动图解释
    在这里插入图片描述

二、聚类效果评价方式——轮廓系数

  • metrics.silhouette_score 是 Scikit-learn(一个流行的 Python 机器学习库)中用于评估聚类效果好坏的一个指标。它衡量了聚类内样本的相似度与聚类间样本的不相似度,其值范围从 -1 到 1。
  • 原理:
    • Silhouette Score(轮廓系数)结合了凝聚度分离度两种因素。对于单个样本,其轮廓系数定义为:
      在这里插入图片描述
      • a 是样本与同一聚类中其他样本的平均距离(即样本的凝聚度或内聚度)
      • b 是样本与最近聚类中所有样本的平均距离(即样本的分离度
  • 整个数据集的轮廓系数是所有样本轮廓系数的平均值
  • 如何判断聚类效果好坏:
    • 值接近 1 :表示样本远离其他聚类,且聚类内部紧密。这是聚类效果好的标志。
    • 值接近 0 :表示样本位于两个聚类之间
    • 值为负 :表示样本被分配到了错误的聚类中,因为该样本与其聚类内的平均距离大于它与最近聚类中样本的平均距离。

三、示例:代码实现

  • python中的 class sklearn.cluster.KMeans 方法用于实现K-means 聚类算法

  • 它有以下一些参数:

    class sklearn.cluster.KMeans(n_clusters=8, init=’k-means++, n_init=10,max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm=’auto’)
    
  • 其中最重要的便是 n_clusters :

    • n_clusters: 类中心的个数,就是要聚成几类。(默认是8个)
  • 数据集介绍

    • 下面是一份含有20个不同的酒,且每瓶酒都有四个相同属性的数据
    • 通过对四个属性的模型训练,将这些酒进行聚类
    • 数据的第一行为列名,第一列为酒的名字
      在这里插入图片描述
  • 1、读取数据并获取训练数据

    import pandas as pd
    # 注意这里读取文本数据时,需要指定,数据之间是以什么进行分隔的
    data = pd.read_table('data.txt', sep=' ', encoding='utf8', engine='python')
    # 通过传入变量(列名)获取训练数据
    x = data[['calories', 'sodium', 'alcohol', 'cost']]
    
  • 2、循环找到合适的K值(簇数)

    • 循环不同的K值,通过比较轮廓系数的大小确定出最优K值
    from sklearn.cluster import KMeans
    from sklearn import metricsscores = []
    for k in range(2, 10):  # 寻找合适的k值(簇数)labels = KMeans(n_clusters=k).fit(x).labels_  # .labels_ 获取训练后各样本对应的分类标签score = metrics.silhouette_score(x, labels)  # 轮廓系数scores.append(score)  # 将每次循环得到的轮廓系数存放在scores列表中
    print(scores)import numpy as npbest_k = range(2, 10)[np.argmax(scores)]  # 找到scores中最大的值对应的K值
    print("最优k值为:{}".format(best_k))
    
    • 结果:
      在这里插入图片描述
  • 3、可视化不同K值下,轮廓系数的大小

    import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
    # 为了坐标轴负号正常显示。matplotlib默认不支持中文,设置中文字体后,负号会显示异常。需要手动将坐标轴负号设为False才能正常显示负号。
    plt.rcParams['axes.unicode_minus'] = Falseplt.plot(list(range(2, 10)), scores)
    plt.xlabel('K值(簇数)')
    plt.ylabel('轮廓系数')
    plt.show()
    
    • 结果:在这里插入图片描述
  • 4、在最优K值下训练模型,并计算出轮廓系数

    from sklearn.cluster import KMeans
    from sklearn import metricskm = KMeans(n_clusters=2).fit(x)
    data['cluster'] = km.labels_   # 为原数据增加一个新列用于存放训练得出的每个样本的类标签
    score = metrics.silhouette_score(x, data.cluster) # 计算轮廓系数
    print(score)
    
    • 结果:
      在这里插入图片描述
    • 可以看出K-means 聚类算法的效果并不是太好,存在各种因素的影响,有待我们进一步的学习与思考

四、聚类算法的优缺点

  • 优点
    • 无监督学习,不需要事先标记的数据。
    • 能够发现数据中的隐藏模式和结构。
    • 适用于多种数据类型和领域。
  • 缺点
    • 需要选择合适的聚类算法和参数,这往往依赖于数据的特性和问题的需求。
    • 聚类结果可能受到初始条件(如K-means的初始质心选择)的影响。
    • 对于复杂形状和密度的簇,可能需要更复杂的聚类算法或参数调整。

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

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

相关文章

PDF招生简章如何转二维码?

​随着科技的不断发展,招生报名方式也在不断创新。如今,许多学校和企业都采用PDF招生简章来宣传招生。然而,传统的纸质招生简章存在携带不便、易损坏等问题。为了解决这些问题,将PDF招生简章转换为二维码成为了一种趋势。那你知道…

微信小程序开发--详情【开发一次 多端覆盖】

目录 1、准备工作 了解 uni-app : 准备开发工具: 下载 : 安装完成后,打开这个开发者工具: 对微信小程序进行配置: 使用开发工具HBuilderX:: 先安装终端插件 2、初始化一个demo 创建项目&#xff1…

2024广东省职业技能大赛云计算赛项实战——安装ELK日志分析服务

安装ELK日志分析服务 前言 ELK是一个用于处理和分析日志数据的开源技术栈,由三个主要组件组成,E即Elasticsearch,L即Logstash,K即Kibana。 Elasticsearch是一个分布式搜索和分析引擎,用于存储、搜索和分析大量数据&…

OpenCV绘图函数(4)绘制轮廓线的函数drawContours()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数会在图像中绘制轮廓线&#xff0c;如果 thickness ≥ 0&#xff0c;则绘制轮廓线&#xff1b;如果 thickness < 0&#xff0c;则填充由轮…

某系统任意用户创建漏洞

初来人间不知苦&#xff0c;潦倒半生一身无&#xff0c;转身回望来时路&#xff0c;方知生时为何哭。 漏洞描述 某系统存在任意用户创建漏洞&#xff0c;发送特定的请求包攻击者可以创建管理员账户登录后台 漏洞实战 出现漏洞的文件为 userproce.php&#xff0c;出现漏洞的…

基于STM32开发的智能垃圾桶系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化超声波传感器检测与垃圾桶开关控制状态显示与声音提示Wi-Fi通信与满溢通知应用场景 家庭环境的智能垃圾桶管理办公室与公共场所的智能垃圾处理常见问题及解决方案 常见问题解决方案…

POJO、PO、DTO、VO、BO到底是什么?都如何使用?(基础概念+传输示意图+示例代码)带你一次玩转层出不穷的Object

文章目录 前言一、解释关系二、POJO、PO、DTO、VO、DAO、BO1.什么是POJO&#xff08;Plain Old Java Object&#xff09;2.什么是PO&#xff08;Persistent Object&#xff09;3.什么是DTO&#xff08;Data Transfer Object&#xff09;4.什么是VO&#xff08;View Object&…

TCP三次握手过程详解

三次握手过程&#xff1a; 客户端视角&#xff1a; 1.客户端调用connect&#xff0c;开启计时器&#xff0c;发送SYN包&#xff0c;如果重传超时&#xff0c;认为连接失败 2.如果收到服务端的ACK&#xff0c;则进入ESTABLISHED状态 3.清除重传计时器&#xff0c;发送ACK&…

NoSQL数据库-Redis集群详解及案例实现

一、 关系型数据库和 NoSQL 数据库 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL、Oracle、MS SQL Server 和 D…

mac 虚拟机PD19运行E-prime实验遇到E-prime unable to set display mode:0*80004001问题解决

作者&#xff1a;50% unable to set display mode问题 总结&#xff1a; 1. 修改该Experiment的Devices中的Dispaly为640*680&#xff0c;Color Bit Depth设置为32。&#xff08;这个分辨率仅限于学习用&#xff0c;实际实验应该还是在真机上&#xff09; 2. 右键开始菜单中的E…

取模+背包

前言&#xff1a;一开始我想错了&#xff0c;一开始我想的是直接统计每一项模完后的和&#xff0c;我们只要能够取到一半&#xff0c;那么就有解&#xff0c;但是时间复杂度太大了 我们做推导 x y s u m x y sum xysum x − y k ∗ n x - y k * n x−yk∗n 那么我们可…

Mysql语句性能优化

SQL查询过程 查询缓存&#xff1a; 执行查询语句的时候&#xff0c;会先查询缓存&#xff08;MySQL 8.0 版本后移除&#xff0c;因为这个功能不太实用&#xff09;。分析器&#xff1a; 没有命中缓存的话&#xff0c;SQL 语句就会经过分析器&#xff0c;分析器说白了就是要先看…

C程序设计——类型转换

什么是类型转换 当两个不同类型的数据&#xff0c;进行算数运算时&#xff0c;就需要将两个数据转换成同一类型&#xff0c;再运算&#xff0c;这就叫类型转换。 注意&#xff0c;类型转换只是发生在计算过程中&#xff0c;并不更改变量或常量本身的类型。 隐式类型转换 经…

2024年第十五届蓝桥杯图形化省赛真题分享包含答案

Scratch初级:8月24日9:30-11:00 Scratch中级:8月24日14:00-15:30 Python:8月25日9:30-11:00 C++:8月25日14:00-15:30 这次考了哪些内容呢,我们来大概看看(编程题没有答案,编程题有,大家可以评论群留言单选题的答案): <

MATLAB 计算凹凸多边形的面积(85)

MATLAB 计算凹凸多边形的面积(84) 一、算法介绍二、算法实现1.代码一、算法介绍 计算凹凸多边形的面积,并输出计算结果,可视化 二、算法实现 1.代码 % 设置多边形的顶点坐标 % 这里以一个五边形为例 x = [1, 3, 4

Codeforces 1304C - Air Conditioner(1500)

Air Conditioner 题面翻译 一个餐馆中有个空调&#xff0c;每分钟可以选择上调 1 1 1 个单位的温度或下调 1 1 1 个单位的温度&#xff0c;当然你也可以选择不变&#xff0c;初始的温度为 m m m 。 有 n n n 个食客&#xff0c;每个食客会在 t i t_i ti​ 时间点到达&am…

千亿养生茶饮市场待觉醒,如何善用“批量混剪”带火中药茶?

入夏以来&#xff0c;中医养生正强势打开年轻人的市场。 上线24h卖出115万帖&#xff0c;服务器被挤爆&#xff0c;浙江省中医院“乌梅汤2.0”打开了中药代茶饮爆单的序幕。 进入三伏天后&#xff0c;除了爆火的晒背外&#xff0c;中医药地摊纷纷扎在各地夜市里&#xff0c;把脉…

软件设计师全套备考系列文章15 -- 数据库:规范化、控制功能、大数据

软考-- 软件设计师&#xff08;15&#xff09;-- 数据库&#xff1a;规范化、控制功能、大数据 文章目录 软考-- 软件设计师&#xff08;15&#xff09;-- 数据库&#xff1a;规范化、控制功能、大数据前言一、章节考点二、规范化三、数据库的控制功能四、大数据、数据仓库 前言…

Linux之7z命令压缩和解压(三十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

【Java设计模式】非循环访问者模式:简化对象交互

文章目录 【Java设计模式】非循环访问者模式&#xff1a;简化对象交互一、概述二、非循环访问者设计模式的意图三、非循环访问者模式的详细解释及实际示例四、Java中非循环访问者模式的编程示例五、非循环访问者模式类图六、Java中何时使用非循环访问者模式八、非循环访问者模式…