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

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

目录

一、简介

二、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都是一种值得信赖的工具。

相关文章:

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

目录 一、简介 二、K-means聚类实现步骤 1、初始化数据点、确定K值 2、通过距离分配数据点 3、更新簇中心 4、 迭代更新 三、聚类效果评价方式 1、轮廓系数的定义 2、整体轮廓系数 3、使用场景 4、优点 5、缺点 6、代码实现方法 四、K-means聚类代码实现 1、API接…...

日常工作之 Elasticsearch 常用查询语句汇总

日常工作之 Elasticsearch 常用查询语句汇总 查询现有索引创建索引查询索引结构插入数据查询索引数据查看索引磁盘占用信息删除索引查看分词器分词结果指定查询数量指定条件查询数据迁移统计索引数据量更新数据 在使用 es 的过程中,总是会用到 es 的查询语句&#x…...

WeakAuras NES Script(lua)

WeakAuras NES Script 修星脚本字符串 脚本1:NES !WA:2!TMZFWXX1zDxVAs4siiRKiBN4eV(sTRKZ5Z6opYbhQQSoPtsxr(K8ENSJtS50(J3D7wV3UBF7E6hgmKOXdjKsgAvZFaPTtte0mD60XdCmmecDMKruyykDcplAZiGPfWtSsag6myGuOuq89EVDV9wPvKeGBM7U99EFVVVV33VFFB8Z2TJ8azYMlZj7Ur3QDR(…...

JVM 触发类加载的条件有哪些?

目录 一、类加载生命周期 二、主动引用 2.1、创建类的实例 2.2、访问类的静态字段或静态方法 2.3、反射 2.4、初始化类的子类时,先初始化父类 2.5、虚拟机启动时,初始化 main 方法所在的类 2.6、动态语言支持 三、被动引用 3.1、通过子类引用父…...

Android实战经验篇-增加系统分区

系列文章转如下链接: Android Display Graphics系列文章-汇总 Android实战经验篇-系列文章汇总 本文主要包括部分: 一、Android分区说明 1.1 系统分区查看 1.2 分区表修改 1.3 验证新分区 二、源码修改 2.1 generate_extra_images 2.2 fstab 2…...

深入学习 Python 量化编程

深入学习 Python 量化编程 第一章:Python 基础与量化编程环境搭建 1.1 安装必要的库 首先,你需要安装一些在量化编程中常用的 Python 库。可以通过以下命令安装这些库: pip install numpy pandas matplotlib yfinance backtrader scikit-…...

机器学习笔记——特征工程

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本笔记介绍机器学习中常见的特征工程方法、正则化方法和简要介绍强化学习。 文章目录 特征工程(Fzeature Engineering)1. 特征提取&#xff…...

4种革新性AI Agent工作流设计模式全解析

文章目录 导读:AI Agent的四种关键设计模式如下:1. 反思2. 工具使用3. 规划4. 多Agent协作 总结内容简介: 导读: AI Agent是指能够在特定环境中自主执行任务的人工智能系统,不仅接收任务,还自主制定和执行…...

【入门级】计算机网络学习

网络安全:前端开发者必知:Web安全威胁——XSS与CSRF攻击及其防范-CSDN博客 三次握手四次挥手:前端网络—三次握手四次挥手_前端三次握手-CSDN博客 http协议和https协议的区别:前端网络—http协议和https协议的区别-CSDN博客 网…...

安装 Jenkins 后无法访问用户名或密码且忘记这些凭证怎么办?

Jenkins 是一款功能强大的自动化服务器,在持续集成与交付(CI/CD)领域应用广泛。不过,用户在使用过程中,尤其是首次接触该系统或系统重启后,常常会遇到登录方面的问题。要是 Jenkins 突然要求输入用户名和密…...

day08_Kafka

文章目录 day08_Kafka课程笔记一、今日课程内容一、消息队列(了解)**为什么消息队列就像是“数据的快递员”?****实际意义**1、产生背景2、消息队列介绍2.1 常见的消息队列产品2.2 应用场景2.3 消息队列中两种消息模型 二、Kafka的基本介绍1、…...

安装conda 环境

conda create -n my_unet5 python3.8 (必须设置3.8版本) conda activate my_unet5...

【dockerros2】ROS2节点通信:docker容器之间/docker容器与宿主机之间

🌀 一个中大型ROS项目常需要各个人员分别完成特定的功能,而后再组合部署,而各人员完成的功能常常依赖于一定的环境,而我们很难确保这些环境之间不会相互冲突,特别是涉及深度学习环境时。这就给团队项目的部署落地带来了…...

使用外网访问在群晖中搭建思源docker

还是要折腾,之前发现用公网IP可以访问就没有折腾,今天ip变了,用不了了,一搜,发现有方法可以用域名访问,哎,太好了! 原文:分享我在 群晖 docker 部署 思源笔记 步骤 - 链…...

深度学习中的EMA技术:原理、实现与实验分析

深度学习中的EMA技术:原理、实现与实验分析 1. 引言 指数移动平均(Exponential Moving Average, EMA)是深度学习中一种重要的模型参数平滑技术。本文将通过理论分析和实验结果,深入探讨EMA的实现和效果。 深度学习中的EMA技术:原理、实现与…...

win32汇编环境,窗口程序中对按钮控件常用操作的示例

;运行效果 ;win32汇编环境,窗口程序中对按钮控件常用操作的示例 ;常用的操作,例如创建按钮控件,使其无效,改变文本,得到文本等。 ;将代码复制进radasm软件里,直接就可以编译运行。重点部分加备注。 ;>&g…...

CentOS 7.9 通过 yum 安装 Docker

文章目录 前言一、删除已安装的 Docker二、网络设置三、设置 yum 源,并安装依赖四、设置 Docker 仓库五、安装及使用 Docker六、镜像仓库总结 前言 CentOS 7.9 过了维护期,Docker 官方文档没有了相关的安装文档。记录一下,备用! …...

【开源免费】基于Vue和SpringBoot的英语知识应用网站(附论文)

本文项目编号 T 138 ,文末自助获取源码 \color{red}{T138,文末自助获取源码} T138,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

工具推荐:PDFgear——免费且强大的PDF编辑工具 v2.1.12

PDFgear——免费且强大的PDF编辑工具 v2.1.12 软件简介 PDFgear 是一款 完全免费的 PDF 软件,支持 阅读、编辑、转换、合并 以及 跨设备签署 PDF 文件,无需注册即可使用。它提供了丰富的 PDF 处理功能,极大提升了 PDF 文件管理的便捷性和效…...

Web渗透测试之XSS跨站脚本 防御[WAF]绕过手法

目录 XSS防御绕过汇总 参考这篇文章绕过 XSS payload XSS防御绕过汇总 服务端知道有网络攻击或者xss攻 Html...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...