机器学习(八):K-Means聚类原理与实战

声明:未经允许禁止转载与抄袭。

前言

k k k均值( k k k-means)聚类算法是一种经典的无监督聚类算法,本文将深入解析其理论原理,并在真是数据集上进行算法实践,话不多说,请看下文。

算法原理

给定样本集 D = { x 1 , x 2 , … , x m } D=\left\{\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_m\right\} D={x1,x2,,xm},其中每个样本 x i \mathbf{x}_i xi都由一个向量表示,例如以周志华老师西瓜书中的西瓜数据集为例,每个样本都包含两个属性密度和含糖量,这两个属性值组成的向量便是该样本的向量表示。

k k k均值算法旨在将样本集 D D D划分为 k k k个簇,即 C = { C 1 , C 2 , … , C k } C=\left\{C_1,C_2,\ldots,C_k\right\} C={C1,C2,,Ck},使得每个样本都被划分到与其距离最小的簇中。用数学来刻画就是, k k k均值算法希望能够最小化所划分的 k k k个簇的平方误差,即:
argmin C ∑ i = 1 k ∑ x ∈ C i ∥ x − μ i ∥ 2 2 \text{argmin}_{C} \sum_{i=1}^k \sum_{\mathbf{x} \in C_i}\left\|\mathbf{x}-\mathbf{\mu}_i\right\|_2^2 argminCi=1kxCixμi22

其中 μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \boldsymbol{\mu}_i=\frac{1}{\left|C_i\right|} \sum_{\mathbf{x} \in C_{\boldsymbol{i}}} \mathbf{x} μi=Ci1xCix 表示簇 C i C_i Ci 的均值向量, x \mathbf{x} x表示簇 C i C_i Ci中的样本。

k k k均值算法事先设定数据集 D D D要划分为 k k k个簇,初始化时,会先从数据集 D D D中随机挑选 k k k个样本作为各个簇的初始均值向量(簇中心)。然后遍历所有样本,分别计算各个样本与各个簇中心的距离,并将样本划分到与距离最小的簇中。待到所有样本都划分完毕后,将各个簇样本向量的均值向量作为新的簇均值向量,重复上述的步骤,直到上一轮所有的簇中心均值向量与本轮计算的结果相同为止。该算法的具体算法流程如下:

kmeans-algo

需要注意的是,实际计算过程中为避免计算时间过长,该算法的终止条件不可能这样严苛。西瓜书中给出了两种方案:

  • 设置一个最大轮数。
  • 设置均值向量的变化阈值,若新簇中心与旧簇中心之间的距离不超过该阈值即可,而不是严格不变。

对于 k k k均值聚类算法而言,数据集的预处理和 k k k值的选取同样十分重要,可以参考博客【机器学习】K-means(非常详细),限于篇幅原因,本文就不详细展开。

算法实践

本文在鸢尾花数据集上进行 k k k均值聚簇算法的实践。

基于最大轮数终止 k k k均值聚类算法实现如下所示,两个向量之间的距离计算本文采用了余弦距离

import numpy as np
from scipy.spatial.distance import cdistclass KMeansModel:def rand_pick(self, x, k):"""随机选取k个簇中心"""n = x.shape[0]indices = np.random.choice(n, k, replace=False)return x[indices]def calculate_distance(self, x, centers):"""计算簇中心与数据样本之间的余弦距离centers: 簇中心数据 (k, d)x: 样本 (N, d)"""return cdist(x, centers, metric="cosine")def get_centers(self, k, x, y):"""根据计算结果重新计算簇中心y: 根据距离将数据集划分的标签数组 (N)"""centers = np.zeros((k, x.shape[1]))for label in range(k):centers[label] = np.mean(x[y == label], axis=0)return centersdef get_label(self, dis):"""根据距离矩阵将每个样本划分到距离最小的簇中心"""return np.argmin(dis, axis=-1)def cluster(self, x, k, times):"""进行KMeans聚类x: 数据样本 (N, d)k: 类别数tims: 迭代次数"""# 随机选取k个作为初始簇中心centers = self.rand_pick(x, k)for _ in range(times):# 计算各个样本到簇中心的距离dis = self.calculate_distance(x, centers)# 根据距离矩阵将样本进行划分y = self.get_label(dis)# 重新计算新的簇中心centers = self.get_centers(k, x, y)return y

在鸢尾花数据集上,设置的实验参数为 k = 3 k=3 k=3 t i m e s = 500 times=500 times=500,即将整个数据集聚为 3 3 3个簇,算法迭代 500 500 500轮终止。

算法额外对比了基于sklearn库实现的 k k k均值聚簇算法的效果,为更直观的展示,本文对数据集进行PCA降维,下图从左到右分别是真实标签、本文模型的聚类结果、基于sklearn算法的聚类结果。从结果可以看出,本文实现的模型在鸢尾花数据集上效果还是不错的。

kmeans-vis

结语

以上便是本文的全部内容,如果感觉不错可以支持一下,若有任何问题敬请批评指正。

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

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

相关文章

判断矩阵A和矩阵B是否相似?

【例题1】 (1)方法1 (2)方法2 (3)方法3 好题\(^o^)/~ 【注意】当二次多项式有重根时,即判别式为零,此时二次多项式是完全平方。

【10】搭建k8s集群系列(二进制部署)之安装Dashboard和CoreDNS

一、部署Dashboard 1.1、创建kubernetes-dashboard.yaml文件 完整的yaml配置文件信息如下: # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in …

大数据技术与Scala

集合高级函数 过滤 通过条件筛选集合元素,返回新集合。 映射 对每个元素应用函数,生成新集集合 扁平化 将嵌套集合展平为单层集合。 扁平化映射 先映射后展平,常用于拆分字符串。 分组 按规则将元素分组为Map结构。 归约 …

数据驱动可视化实战:图表狐精准生成图表的完整数据范式

一、数据输入黄金法则 图表狐 - AI图表生成工具,在线数据可视化要求数据描述必须包含三个核心要素: [主体对象] [量化指标] [维度划分] 错误示例 ❌: "展示各部门销售额对比" 正确示例 ✅: "2023年Q1-Q4各部门销售额&a…

苍穹外卖(1)-部分环境配置(git、数据库)

首先配置git 创建好本地仓库之后 把项目弄到远程仓库里去 先进行提交 ,后进行推送 ,然后gitee创建一个仓库 把这个url复制好 推送后会出来一个 点击推送,会让你输入gitee账号密码,输入自己的账号密码,就可以连接远程仓…

Ubunut18.04 离线安装MySQL 5.7.35

一、环境准备 1.1 官方下载MySQL5.7.35 完整包 1.2 上传包 & 解压 上传包名称是:mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle.tar # 切换到上传目录 cd /home/MySQL # 解压: tar -xvf mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle…

Linux(CentOS10) gcc编译

本例子摘自《鸟哥的linux私房菜-基础学习第四版》 21.3 用make进行宏编译 书中的代码在本机器(版本见下)编译出错,改正代码后发布此文章: #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…

MCP+Blender创建电力塔

MCP(Model Context Protocol)与Blender的结合是当前AI与3D建模领域的热门技术,它通过协议化的方式让Claude等AI模型直接控制Blender,实现自动化3D建模。 1. 功能与原理 • 核心能力:用户通过自然语言指令(…

Qt与C++数据类型转换

本文深入探讨Qt与C中相似但不同的数据类型处理技巧。 一、QString与std::string的相互转换 1. QString → std::string 方法1:使用toStdString()(推荐) QString qstr "你好,Qt世界"; std::string str qstr.toStdS…

机器学习+EEG熵进行双相情感障碍诊断的综合评估

摘要 双相情感障碍(BD)是一种常见的精神疾病,特点是躁狂或轻躁狂与抑郁交替发作,其严重程度各异,导致准确及时的诊断具有一定的挑战性。EEG的非线性特征被认为是精神障碍的生物标志物,能够反映大脑的非线性动态。尽管已有研究证明…

企业应用集成全析:架构、实践与展望

企业应用集成全析:架构、实践与展望 一、企业应用集成的基本概念1.1 定义1.2 目标 二、企业应用集成的层次架构2.1 数据集成2.2 应用系统集成2.3 业务流程集成​ 三、企业应用集成的关键技术3.1 中间件技术3.2 Web 服务技术​3.3 企业服务总线(ESB&#…

【STL】list介绍(附与vector的比较)

文章目录 1.关于list2.使用2.1 list的构造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素访问2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…

【Django】教程-12-柱状图

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…

SQL:DDL(数据定义语言)和DML(数据操作语言)

目录 什么是SQL? 1. DDL(Data Definition Language,数据定义语言) 2. DML(Data Manipulation Language,数据操作语言) DDL和DML的区别 什么是SQL? SQL(Structured …

Chrome 135 版本开发者工具(DevTools)更新内容

Chrome 135 版本开发者工具(DevTools)更新内容 一、性能(Performance)面板改进 1. 性能面板中的配置文件和函数调用现已显示来源和脚本链接 Performance > Summary(性能 > 概览)选项卡现在会显示配…

[ctfshow web入门] web23

前置知识 include:包含一个文件,也可以包含一些其他东西,后续用到再解析 substr:对字符串进行切片,第一个参数是字符串,第二第三个参数出从第a个索引开始切n个,索引从0开始计数。 例如&#xf…

vue3 开发电子地图功能

文章目录 一、项目背景二、页面效果三、代码1.ElectronicMap.vue2.TransferDeskRSSIMap.vue3.Map.js4.src/stores/index.js Vuex存储属性 四、注意点本人其他相关文章链接 一、项目背景 项目采用:vue3javaArco DesignSpringBootOpenStreetMap 数据的地图切片服务。…

oracle 存储体系结构

oracle 存储体系结构 参考: Logical Storage Structures (oracle.com)

python-leetcode 66.寻找旋转排序数组中的最小值

题目: 已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组,例如,原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若…

【MATLAB第113期】基于MATLAB的EFAST扩展傅里叶幅度敏感性分析方法(有目标函数)

【MATLAB第113期】基于MATLAB的EFAST扩展傅里叶幅度敏感性分析方法(有目标函数) 一、方法概述 扩展傅里叶幅度敏感性检验(EFAST)是一种基于频域分析的全局敏感性分析方法,能够同时评估模型参数的一阶敏感性&#xff…