详解机器学习经典模型(原理及应用)——K-Means

一、K-Means算法概念

        K-Means 算法是一种经典的聚类分析方法,属于无监督学习的一种。它的目标是将数据集中的样本划分为预定数量的簇,使得簇内的样本尽可能相似,而簇间的样本尽可能不同。K-Means在业务中也有诸多用途,比如在进行探索性数据分析的过程中,我们会使用K-Means简单看看数据分布,从而辅助后面的建模判断等等。

二、K-Means算法流程

1、选择K值

        K是预先指定的簇数量,它是算法的输入参数,需要根据数据集和需求来确定,也就是说你要预先估计大概可以聚出多少个类簇,然后将K值设定成相对应的数目,训练之后再评估效果。一般我们会选择多个K值,循环训练并输出轮廓系数等指标,从而选定最佳的K值。

2、初始化簇中心

        随机选择 K 个数据点作为初始簇中心(质心),可以使用更复杂的初始化方法,如 K-Means++。这个环节通常使用欧几里得距离来衡量数据点与簇中心之间的距离,对于数据点x和簇中心c:

d(x,c) = \sqrt{\sum_{i=1}^{n}(x_{i}-c_{i})^{2}}

        其中,x_{i}是数据点x的第i个特征,c_{i}是簇中心c的第i个特征,n是特征的数量。

3、分配数据点到最近的簇

        对于数据集中的每个数据点,计算它与每个簇中心的距离,并将其分配给最近的簇。分配的决策基于最小化距离:

C(x) = argmin_{k}d(x,c_{k})

        其中,C(x)表示数据点x被分配到的簇,c_{k}是第k个簇的中心。

4、更新簇中心

        一旦所有数据点都被分配,重新计算每个簇的中心,通常是簇内所有数据点的均值。一旦所有数据点都被分配到簇中,每个簇的中心更新为该簇所有数据点的均值。簇中心的更新公式为:

c_{k} = \frac{1}{|S_{k}|}\sum _{x-from-S_{k}}x

        其中,c_{k}是第k个簇的新中心,S_{k}是分配给第k个簇的所有数据点的集合,|S_{k}|是簇k中数据点的数量。

5、迭代过程

        重复步骤 3 和 4,直到簇中心不再发生变化,或者变化小于某个预设的阈值,或者达到最大迭代次数。

6、总成本

        在每次迭代中,可以计算总成本(通常是簇内误差平方和,SSE)来评估模型的性能,这一步相当于损失函数,K-Means训练的优化目标就是最小化SSE:

SSE = \sum_{k=1}^{K}\sum _{x-from-S_{k}}d(x,c_{k})^2

        其中,K是簇的数量。

三、算法应用示例

        这里给出K-Means的示例代码以及可视化结果。

# 导入必要的库
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt# 生成模拟数据集
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# 创建 KMeans 实例,设置簇的数量
kmeans = KMeans(n_clusters=4)# 训练模型
kmeans.fit(X)# 预测聚类结果
y_kmeans = kmeans.predict(X)# 获取簇中心
centers = kmeans.cluster_centers_# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5)
plt.title('KMeans Clustering')
plt.show()

四、总结

        还记得笔者当年毕业秋招的时候,忘记了是哪一家公司的算法笔试题最后一题竟然是手撕K-Means!可见这个算法的含金量!在探索性数据分析、数据可视化等环节经常都会出现它的影子,但具体何时应用需结合其优缺点及任务需求。

1、优点

        (1)简单易懂:K-Means 算法的原理和实现都非常简单,容易理解和解释。

        (2)无需预设类别标签:作为无监督学习算法,K-Means 不需要预先定义的类别标签。

2、缺点

        (1)对初始值敏感:算法的结果可能依赖于初始簇中心的选择,可能导致不同的聚类结果,当然现在已经有许多优化算法用于缓解这个问题了。

        (2)需要预先指定簇数量:用户必须预先指定 K 值,即簇的数量,这需要多次尝试和领域知识。

        (3)对离群点敏感:离群点可能会对簇中心的计算产生较大影响,从而影响聚类质量。

        (4)假设簇是凸形且相似大小:K-Means 算法假设簇是圆形且大小相似(从算法原理可以看出,一个类簇中的所有样本距簇中心的距离都在某一个指定的半径内),如果数据集是非球形的,K-Means算法的效果不一定很好(甚至会很差)。

        (5)计算效率问题:在每次迭代中都需要计算所有数据点到所有簇中心的距离,这在数据量大时会导致计算效率问题(聚类算法通病,计算过程很慢,在使用轮廓系数等指标评估的时候。指标的计算过程也很慢)。

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

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

相关文章

Github + Hexo + Shoka搭建个人博客以及遇到的部分问题

博客预览: 主页: 文章: 博客语言链接: 全部分类 |mmjon 不在能知,乃在能行 Shoka官方博客: Yume Shoka 優萌初華 有夢書架 (lostyu.me) 1、准备 1、github账号 :自行去github官网注册…

睡眠监测系统基于边缘计算和微服务缓存

这篇论文的主要内容是关于基于边缘计算和微服务缓存的睡眠监测系统。以下是详细内容概述: 标题 睡眠监测系统基于边缘计算和微服务缓存 作者 Nico Surantha - 东京市立大学,日本David Jayaatmaja - 雅加达Bina Nusantara大学,印度尼西亚S…

Java面向对象(类和对象)(自己学习整理的资料)

目录 一.面向对象思想 二.类和对象 三:定义类的步骤 四.创建对象 五.用Java代码写一个简单的登录系统 练习 六.关于类的方法 七.类的无参无返回值方法 八.方法的返回值 练习 关于方法调用问题 九.全局变量和局部变量 十.笔记 一.面向对象思想 就只关注参…

FDA辅料数据库在线免费查询-药用辅料

在药物制剂的研制过程中,需要确定这些药用辅料的安全用量。而美国食品药品监督管理局(FDA)的辅料数据库(IID)提供了其制剂研发中的关键参考资源,使得更多的医药研发相关人员及企业单位节省试验环节及时间成…

快速学会一个算法,BERT

今天给大家介绍一个强大的算法模型,BERT BERT(Bidirectional Encoder Representations from Transformers)是一种基于 Transformer 架构的深度学习模型,主要用于处理自然语言处理(NLP)问题。 BERT 由 Goo…

星辰计划-深入理解kafka的消息存储和索引设计

消息存储 提到存储不得不说消息的读写,那么kafka他是如何读写数据的呢? 读取消息 1.通过debug(如何debug) 我们可以得到下面的调用栈,最终通过FileRecords来读取保存的数据 写入消息 1.通过debug(如何debug) 我们可以得到下面的调用栈&am…

模型django封装uvicorn服务器部署实战

Uvicorn 是一个轻量级的 ASGI 服务器,它基于 uvloop 和 httptools 这两个高性能的异步库。Uvicorn 提供了快速的启动时间和低延迟的响应,非常适合用于生产环境。 Django: 是一个开源且强大的Web框架,适用于快速开发和部署Python …

深度学习——线性回归

房价预测 线性模型 单层神经网络 损失函数的均方误差 训练数据 参数学习 显示解 偏导数少了负号 最优解y旁边的X少了转置符号 梯度下降 学习率选择 小批量随机梯度下降 批量规模的选择 总结

LeetCode 909. 蛇梯棋

LeetCode 909. 蛇梯棋 给你一个大小为 n x n 的整数矩阵 board ,方格按从 1 到 n2 编号,编号遵循 转行交替方式 ,从左下角开始 (即,从 board[n - 1][0] 开始)的每一行改变方向。 你一开始位于棋盘上的方格 …

Linux:八种重定向详解(万字长文警告)

相关阅读Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 本文将讨论Linux中的重定向相关问题,在阅读本文前,强烈建议先学习文件描述符的相关内容Linux:文件描述符详解。 重定向分为两类&#x…

个性化大语言模型:PPlug——让AI更懂你

在当今数字化转型的时代,大型语言模型(LLMs)已经成为了不可或缺的工具,它们在自然语言理解、生成和推理方面展现了非凡的能力。然而,这些模型普遍采用的是“一刀切”的方式,即对于相同的输入给予所有用户相…

MySQL的乐观锁、悲观锁机制及实现

乐观锁 乐观锁的实现参考了这篇文章,里面还将了乐观锁的时间戳实现方式: 跳转 概述 乐观锁是一种并发控制策略,它假设多个事务不会发生冲突,在执行操作时不加锁,非常乐观,只需每次进行提交时利用标识进行…

ansible批量安装postgresql软件

本文为杭州云贝教育 刘老师 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 随着分布式系统和大规模应用的普及,自动化部署和管理变得越来越重要。Ansible 是一种流行的自动化工具,它…

DAY80服务攻防-中间件安全HW2023-WPS 分析WeblogicJettyJenkinsCVE

知识点 1、中间件-Jetty-CVE&信息泄漏 2、中间件-Jenkins-CVE&RCE执行 3、中间件-Weblogic-CVE&反序列化&RCE 4、应用WPS-HW2023-RCE&复现&上线CS 中间件-Jetty-CVE&信息泄漏 Jetty是一个开源的servlet容器,它为基于Java的Web容器…

分布式光伏监控系统 在鄂尔多斯市鄂托克旗某煤矿项目中的应用

摘 要:分布式光伏发电就是将太阳能光伏板分散布置在各个区域,通过小规模、模块化的方式实现电能的并网或独立使用,这种发电方式具有就近发电、就近并网、就近转换、就近使用的特点。近年来,技术和政策支持推动了光伏组件的成本持续…

sed(1):强大的文本处理命令

一、命令简介 ​sed​(stream editor)是一个强大的文本处理工具,它能够执行基本的文本转换,如替换、删除、插入和修改文本行的特定部分。sed​ 命令通常用于对文本文件进行批量编辑,也可以用于处理来自管道的输入。 …

煤矿井下钻场目标检测数据集 5类 voc格式

煤矿井下钻场目标检测数据集 本数据集包含了来自不同钻场和环境背景条件下的70948张图片,涵盖了夹持器、钻机卡盘、煤矿工人、矿井安全帽和钻杆等五类目标,并提供了PASCAL VOC格式的标注文件。 摘要 煤矿井下钻场打钻是解决瓦斯灾害、水害、隐蔽地质灾害…

9.24-k8s服务发布

Ingress 使用域名发布 K8S 服务 部署项目 一、先部署mariadb [rootk8s-master ~]# mkdir aaa [rootk8s-master ~]# cd aaa/ [rootk8s-master aaa]# # 先部署mariadb [rootk8s-master aaa]# # configmap [rootk8s-master aaa]# vim mariadb-configmap.yaml apiVersion: v1 ki…

灵当CRM multipleUpload.php 文件上传致RCE漏洞复现

0x01 产品描述: 灵当CRM是一款专为中小企业量身定制的智能客户关系管理工具,由上海灵当信息科技有限公司开发和运营。该系统广泛应用于多个行业,包括金融、教育、医疗、IT服务及房地产等领域,旨在满足企业对客户个性化管理的需求&…

使用yum为centos系统安装软件以及使用(包含阿里云yum源配置)

centos系统配置阿里云yum源 因为centos7官方停止维护,自带yum源用不了了,所以可以更换成阿里云yum源 方法: 使用root权限执行以下语句 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo CentOS…