《机器学习》之K-means聚类

news2025/1/15 4:12:17

目录

一、简介

二、K-means聚类实现步骤

1、初始化数据点、确定K值

2、通过距离分配数据点

3、更新簇中心

4、 迭代更新

三、聚类效果评价方式

1、轮廓系数的定义

2、整体轮廓系数

3、使用场景

4、优点

5、缺点

6、代码实现方法

四、K-means聚类代码实现

1、API接口介绍

参数介绍 :

属性介绍:

2、代码示例

例子介绍

代码如下

结果展示 

 五、总结


一、简介

K-means聚类是一种无监督学习算法,用于将数据集划分为K个簇。其目标是将数据点分配到K个簇中,使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。算法通过迭代更新簇中心和分配数据点,直到簇中心稳定。K-means简单高效,但需要预先指定K值,且对初始质心选择和噪声敏感。广泛应用于图像分割、市场细分等领域。

二、K-means聚类实现步骤

K-means的目标是将数据集划分为K个簇,使得每个簇内的数据点尽可能相似(簇内距离最小),而不同簇之间的数据点尽可能不同(簇间距离最大)。通过迭代优化簇中心和数据点的分配,最终达到簇内方差最小化的目标。

 

1、初始化数据点、确定K值

2、通过距离分配数据点

  • 计算每个数据点到所有簇中心的距离(通常使用欧几里得距离)。

  • 将每个数据点分配到距离最近的簇中心所在的簇。

 

3、更新簇中心

对每个簇重新计算簇中心,即该簇中所有数据点的坐标平均值

4、 迭代更新

重复2、3两步骤知道簇中心不在发生显著变化或者达到预期迭代次数为止。

推荐一个网站可以直观的观察到K-means算法的演化过程:https://www.naftaliharris.com/blog/visualizing-k-means-clustering/ 

三、聚类效果评价方式

K-means聚类通过轮廓系数来评判模型聚类效果的好坏。

轮廓系数(Silhouette Coefficient)是一种用于评估聚类效果的指标,衡量数据点在簇内的紧密性和簇间的分离性。它适用于无监督学习中的聚类算法(如K-means、层次聚类等),帮助确定最佳的簇数量(K值)。 

1、轮廓系数的定义

对于每个数据点 ii,轮廓系数 s(i)s(i) 的计算公式为:

其中:

  • a(i):数据点 ii 到同簇其他点的平均距离,反映簇内紧密性。

  • b(i):数据点 ii 到最近其他簇中所有点的平均距离,反映簇间分离性。

轮廓系数的取值范围为 [−1,1]:

  • 接近 1:表示聚类效果好,数据点与同簇点紧密,且远离其他簇。

  • 接近 0:表示数据点处于簇边界,聚类效果不明显。

  • 接近 -1:表示数据点可能被分配到错误的簇。 

2、整体轮廓系数

对整个数据集,轮廓系数是所有数据点轮廓系数的平均值:

其中,N 是数据点的总数。 

3、使用场景

  • 评估聚类效果:通过轮廓系数判断聚类结果的合理性。

  • 选择K值:在K-means等算法中,通过比较不同K值对应的轮廓系数,选择最优的簇数量(通常选择轮廓系数最大的K值)。 

4、优点

  • 直观易懂:取值范围明确,易于解释。

  • 无需真实标签:适用于无监督学习。

  • 综合性强:同时考虑簇内紧密性和簇间分离性。 

5、缺点

  • 计算复杂度高:需要计算所有数据点之间的距离,适合中小规模数据集。

  • 对簇形状敏感:假设簇是凸形的,对非凸形簇效果较差。

6、代码实现方法

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import numpy as np

# 示例数据
X = np.array([[1, 2], [1, 4], [1, 0],
              [10, 2], [10, 4], [10, 0]])

# K-means聚类
kmeans = KMeans(n_clusters=2, random_state=0)
labels = kmeans.fit_predict(X)

# 计算轮廓系数
score = silhouette_score(X, labels)
print("Silhouette Score:", score)

四、K-means聚类代码实现

1、API接口介绍

class sklearn.cluster.KMeans(n_clusters=8, 
init=’kmeans++’, 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: 类中心的个数,就是要聚成几类。【默认8个】

  • init初始化的方法,默认为'k-means++'

    (1)'k-means++': 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛.

    (2) ‘random’:  随机从训练数据中选取初始质心。

    (3) 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

  •  n_init: 整形,缺省值=10用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
  • max_iter :执行一次k-means算法所进行的最大迭代数。

  • Tol: 与inertia结合来确定收敛条件。

  • precompute_distances三个可选值,‘auto’,True 或者 False预计算距离,计算速度更快但占用更多内存。

    (1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。

    (2)True:总是预先计算距离。

    (3)False:永远不预先计算距离。

  • random_state :随机种子
  • copy_x:布尔型,默认值=True,当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据 上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

  • algorithm:'auto','full' or 'elkan'.默认为'auto'
    full:采用经典的EM算法
    elkan:通过使用三角不等式从而更有效,但不支持稀疏数据
    auto:数据稀疏选择full模式,数据稠密选择elkan模式

     
属性介绍:
  • cluster_centers_: 一个n-clusters*n_features的矩阵,表示聚类中心的坐标

  • Labels_:每个点的分类标签。

  • inertia_:float形每个点到其簇的质心的距离之和。

  • n_iter_ : int迭代次数。

2、代码示例

例子介绍

以一个啤酒数据集为例子,根据不同啤酒的不同指标对啤酒进行聚类

代码如下
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics
# 数据预处理
beer = pd.read_table(r'../data/beer.txt',sep=' ',encoding='utf-8',engine='python')
x = beer[["calories","sodium","alcohol","cost"]]
scores = []
index = []
# 交叉验证找到最适合的k值
for k in range(2,10):
    labels = KMeans(n_clusters=k).fit(x).labels_
    score = metrics.silhouette_score(x,labels)
    scores.append(score)
    index.append(k)
print(scores)
a = np.argmax(scores)
K = index[a] # 最适合的k值
# k值与轮廓系数的可视化
plt.plot(list(range(2,10)),scores)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
# 训练、计算轮廓系数
km = KMeans(n_clusters=K).fit(x)
beer['cluster'] = km.labels_
score_silhouette  = metrics.silhouette_score(x,beer.cluster)
print('轮廓系数:',score_silhouette)
结果展示 

 

 五、总结

K-means聚类是一种简单而强大的聚类算法,尽管存在一些局限性,但通过合理选择参数和改进方法,仍能在许多实际应用中取得良好效果。对于数据科学家和机器学习从业者来说,掌握K-means聚类是理解无监督学习的重要一步。无论是探索性数据分析还是实际业务场景,K-means都是一种值得信赖的工具。

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

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

相关文章

Wireshark抓包教程(2024最新版个人笔记)

改内容是个人的学习笔记 Wireshark抓包教程(2024最新版)_哔哩哔哩_bilibili 该课程笔记1-16 wireshark基础 什么是抓包工具:用来抓取数据包的一个软件 wireshark的功能:用来网络故障排查;用来学习网络技术 wireshark下…

Web开发(一)HTML5

Web开发(一)HTML5 写在前面 参考黑马程序员前端Web教程做的笔记,主要是想后面自己搭建网页玩。 这部分是前端HTML5CSS3移动web视频教程的HTML5部分。主要涉及到HTML的基础语法。 HTML基础 标签定义 HTML定义 HTML(HyperText Markup Lan…

RabbitMQ 的工作模式

目录 工作模式 Simple(简单模式) Work Queue(工作队列) Publish/Subscribe(发布/订阅) Exchange(交换机) Routing(路由模式) Topics(通配…

备战蓝桥杯:树的存储与遍历(dfs和bfs)

树的概念 树的逻辑结构是树形结构,和我们之前的线性结构又不太一样了,是一种一对多的关系 树的结点分为根节点,叶子结点(没有分支的结点) 以及分支结点 从上往下看,每个结点都有0个或多个后继 从下往上…

超大规模分类(三):KNN softmax

传统的分类损失计算输入数据和每个类别中心的距离,来优化模型的训练。KNN softmax通过选择和输入数据最相关的top-K个类别,仅计算输入数据和top-K个类别中心的距离,以减小计算量。 KNN softmax首次诞生于达摩院机器智能技术实验室发表的SIGKD…

ubuntu官方软件包网站 字体设置

在https://ubuntu.pkgs.org/22.04/ubuntu-universe-amd64/xl2tpd_1.3.16-1_amd64.deb.html搜索找到需要的软件后,点击,下滑, 即可在Links和Download找到相关链接,下载即可, 但是找不到ros的安装包, 字体设…

项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试

前言 在嵌入式设备的OTA场景测试和其他断电上电测试过程中,有的场景发生在夜晚或者随时可能发生,这个时候不可能24h人工盯着,需要自动化抓取串口日志处罚断电上电操作。 下面的python脚本可以实现自动抓取串口指定关键词,然后触发…

电脑分辨率调到为多少最佳?电脑分辨率最佳设置

电脑分辨率是指电脑屏幕上显示的像素点的数量,通常用水平和垂直方向的像素点数来表示,例如19201080。像素点越多,显示的内容就越清晰,但也会占用更多的系统资源和电力。那么多电脑分辨率多少最佳?以及电脑分辨率如何调…

代码随想录算法【Day20】

Day20 二叉搜索树 235. 二叉搜索树的最近公共祖先 理解只要当前节点的值在p和q节点的值的中间,那这个值就是最近的公共祖先,绝对不是次近的,这个题就好做了。 递归法 二叉搜索树本身是有序的,所以不涉及到前中后序的遍历 cl…

【SpringBoot】@Value 没有注入预期的值

问题复现 在装配对象成员属性时,我们常常会使用 Autowired 来装配。但是,有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同,使用 Autowired 一般都不会设置属性值,而 Value 必须指定一个字符串值,因为其…

车联网安全 -- 数字证书到底证明了什么?

在车联网安全--TLS握手过程详解里面,我们了解到握手时,Server会向Client发送Server Certificate,用于证明自己的身份合法,为什么会有这一步呢? 我们回顾一下数字签名的过程: Bob将使用自己的公钥对“Hello…

Elasticsarch:使用全文搜索在 ES|QL 中进行过滤 - 8.17

8.17 在 ES|QL 中引入了 match 和 qstr 函数,可用于执行全文过滤。本文介绍了它们的作用、使用方法、与现有文本过滤方法的区别、当前的限制以及未来的改进。 ES|QL 现在包含全文函数,可用于使用文本查询过滤数据。我们将回顾可用的文本过滤方法&#xf…

【HTML+CSS+JS+VUE】web前端教程-31-css3新特性

圆角 div{width: 100px;height: 100px;background-color: saddlebrown;border-radius: 5px;}阴影 div{width: 200px;height: 100px;background-color: saddlebrown;margin: 0 auto;box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);}

Spring Boot 项目自定义加解密实现配置文件的加密

在Spring Boot项目中, 可以结合Jasypt 快速实现对配置文件中的部分属性进行加密。 完整的介绍参照: Spring Boot Jasypt 实现application.yml 属性加密的快速示例 但是作为一个技术强迫症,总是想着从底层开始实现属性的加解密,…

若依前后端分离项目部署(使用docker)

文章目录 一、搭建后端1.1 搭建流程:1.2 后端零件:1.2.1 mysql容器创建:1.2.2 redis容器创建:1.2.3 Dockerfile内容:1.2.4 构建项目镜像:1.2.5 创建后端容器: 二、前端搭建:2.1 搭建流程&#x…

Vue2+OpenLayers使用Overlay实现点击获取当前经纬度信息(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 关键参数: 实现思路: 核心代码: 完整代码: 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 覆盖物(Overlay&#xf…

Oracle 终止正在执行的SQL

目录 一. 背景二. 操作简介三. 投入数据四. 效果展示 一. 背景 项目中要求进行性能测试,需要向指定的表中投入几百万条数据。 在数据投入的过程中发现投入的数据不对,需要紧急停止SQL的执行。 二. 操作简介 👉需要DBA权限👈 ⏹…

Oopsie【hack the box】

Oopsie 解题流程 文件上传 首先开启机器后,我们先使用 nmap -sC -SV来扫描一下IP地址: -sC:使用 Nmap 的默认脚本扫描(通常是 NSE 脚本,Nmap Scripting Engine)。这个选项会自动执行一系列常见的脚本&am…

V少JS基础班之第四弹

一、 前言 第四弹内容是操作符。 本章结束。第一个月的内容就完成了, 是一个节点。 下个月我们就要开始函数的学习了。 我们学习完函数之后。很多概念就可以跟大家补充说明了。 OK,那我们就开始本周的操作符学习 本系列为一周一更,计划历时6…

【STM32-学习笔记-7-】USART串口通信

文章目录 USART串口通信Ⅰ、硬件电路Ⅱ、常见的电平标准Ⅲ、串口参数及时序Ⅳ、STM32的USART简介数据帧起始位侦测数据采样波特率发生器 Ⅴ、USART函数介绍Ⅵ、USART_InitTypeDef结构体参数1、USART_BaudRate2、USART_WordLength3、USART_StopBits4、USART_Parity5、USART_Mode…