K-means聚类算法的应用以及实现

news2024/9/24 7:24:18

K-means 聚类算法属于无监督学习,它会将相似的对象归到同一个簇中,该算法原理简单,执行效率高,并且容易实现,是解决聚类问题的经典算法。

尽管如此,任何一款算法都不可能做到完美无瑕,K-measn 算法也有自身的不足之处,比如 K-means 需要通过算术平均数来度量距离,因此数据集的为维度属性必须转换为数值类型,同时 K-means 算法使用随机选择的方式来确定 K 的数量和初始化质心 ,因此不同的随机选择会对最终的分簇结果产生一定程度的影响。

算法应用场景

每一种算法都有各自适用的场景,对于 K-means 算法也不例外,它适合于解决而特征维度为数值型的聚类问题。

举个简单的例子,一个赛季结束后,篮球队要对队员的整体表现进行聚类分析,此时每位队员的特征维度都是可以量化的,比如某队员的上场时间、得分数、助攻数、失误数等。

K-means 算法也适用于文本聚类,比如新闻网站会将相同话题的新闻聚集在一起,并自动生成一个个不同话题的新闻专栏,其实这就是利用聚类算法实现的,但是文本的特征维度并非数值类型,因此需要对其进行数值转化操作,将文本数据转换为数学信息,此时可以使用 TF-IDF 加权技术计算单个词的权值。

TF-IDF 是一种用于信息检索与数据挖掘的常用加权技术。TF 是词频(Term Frequency),IDF 是逆文本频率指数(Inverse Document Frequency)。

下表对 K-means 聚类算法的特点做了简单说明:
 

项目内容
优点原理简单,实现容易,运算效率高。
不足需要人为设置簇的个数与随机初始化质心点可能影响聚类的最终效果,同时 K-measn 算法对孤立点(离群点)特别敏感,会对最终的聚类结果产生明显扰动。
应用领域适用于特征维度为数据类型的聚类问题,比如体育赛事等,而对特征维度不是数据类型的需要提前进行转换,比如文本分类等。

Sklearn使用K-means算法

在 Sklearn  机器学习库中,与聚类相关的算法模型都在 cluster 模块下,除 k-measn 外,还有十种聚类最近邻算法,下表对最常用的算法做了简单介绍:
 

类名说明
KMeans 类本节介绍的算法,也是应用最多的聚类算法
MiniBatchKMeans 类该算法是 K-measn算法变形算法,使用 mini-batch(一种采样数据的思想) 来减少一次聚类所需的计算时间,mini-batch 也是深度学习常使用的方法。
DBSCAN 类DBNSCAN 算法是一种比较有代表性的基于密度的聚类算法,它的主要思想是将聚类的类视为被低密度区域分割的高密度区域。与划分聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇。
MeanShift 类MeanShift 算法流程,以任意点作为质心的起点,根据距离均值将质心不断往高密度的地方移动,也即所谓均值漂移,当不满足漂移条件后说明密度已经达到最高,就可以划分成簇。
AffinityPropagation 类AffinityPropagation 算法(简称 AP 算法),该算法是层次聚类的典型应用,聚类实现过程是一个“不断合并同类项”的过程,用类似于归纳法思想来完成聚类。


通过表格不难看出,每一种算法所采用的思想均不相同,但最终都能解决聚类问题,这也是整个聚类算法族的特点之一。

下面我们对Kmeans.Kmeans()的常用参数做简单介绍:
 

参数说明
algorithm字符串参数值,有三种选择:
1) "auto" :默认值,自动根据数据值是否稀疏,来决定使用 "full"还是"elkan",采用默认值即可;
2) "full":表示使用传统的 K-measn 算法;
3) "elkan":表示使用 elkan-Means 算法,该算法可以减少不必要的距离计算,加快计算效率。
n_cluster整型参数,表示分类簇的数量,默认值为 8
max_iter整型参数,表示最大的迭代次数,默认值为 300
n_init整型参数,表示用不同的质心初始化值运行算法的次数,默认值为 10
init字符串参数,有三个可选参数:
1)" k-means++" ,默认值,用一种特殊的方法选定初始质心从而能加速迭代过程的收敛,效果最好;
2) "random" 表示从数据中随机选择 K 个样本作为初始质心点;
3) 提供一个 ndarray 数组,形如 (n_cluster,n_features),以该数组作为初始质心点。
precompute_distance有三个可选值,分别是 "auto", True, False:
1) "auto" :如果样本数乘以聚类数大于 12 million 的话则不予计算距离;
2) True:总是预先计算距离;
3) False:永远不预先计算距离。
tol浮点型参数(float),表示算法收敛的阈值,默认值为 1e-4
n_jobs整型参数,指定计算所用的进程数量,
1) 若值为 -1,则用所有 CPU 进行运算;
2) 若值为 1 ,则不进行并行运算,方便调试;
3) 若值小于 -1,则用到的 CPU 数为(n_cpus+1+n_jobs),因此若为 -2 ,则用到的 CPU 数为总 CPU 数减去1
random_state表示随机数生成器的种子,参数值为整形或 numpy.RandomState 类型
verbose整型参数,默认值为 0,表示不输出日志信息;1 表示每隔一段时间打印一次日志信息;如果大于 1时,打印次数变得频繁。


最后通过鸢尾花数据集对 K-means 算法进行简单的演示,示例代码如下:

 
  1. import matplotlib.pyplot as plt
  2. import matplotlib
  3. from sklearn.cluster import KMeans
  4. from sklearn.datasets import load_iris
  5. #设置 matplotlib rc配置文件
  6. matplotlib.rcParams['font.sans-serif'] = [u'SimHei'] # 用来设置字体样式以正常显示中文标签
  7. matplotlib.rcParams['axes.unicode_minus'] = False # 设置为 Fasle 来解决负号的乱码问题
  8. # 加载鸢尾花数据集
  9. # 数据的特征分别是 sepal length(花萼长度)、sepal width(花萼宽度)、petal length(花瓣长度)、petal width(花瓣宽度)
  10. iris = load_iris()
  11. X = iris.data[:, :2] # 通过花萼的两个特征(长度和宽度)来聚类
  12. k = 3 # 假设聚类为 3 类,默认分为 8 个 簇
  13. # 构建算法模型
  14. km = KMeans(n_clusters=k) # n_clusters参数表示分成几个簇(此处k=3)
  15. km.fit(X)
  16. # 获取聚类后样本所属簇的对应编号(label_pred)
  17. label_pred = km.labels_ # labels_属性表示每个点的分簇号,会得到一个关于簇编号的数组
  18. centroids = km.cluster_centers_ #cluster_center 属性用来获取簇的质心点,得到一个关于质心的二维数组,形如[[x1,y1],[x2,y2],[x3,x3]]
  19. # 未聚类前的数据分布图
  20. plt.subplot(121)
  21. plt.scatter(X[:, 0], X[:, 1], s=50)
  22. plt.xlabel('花萼长度')
  23. plt.ylabel('花萼宽度')
  24. plt.title("未聚类之前")
  25. # wspace 两个子图之间保留的空间宽度
  26. plt.subplots_adjust(wspace=0.5) # subplots_adjust()用于调整边距和子图间距
  27. # 聚类后的分布图
  28. plt.subplot(122)
  29. # c:表示颜色和色彩序列,此处与 cmap 颜色映射一起使用(cool是颜色映射值)s表示散点的的大小,marker表示标记样式(散点样式)
  30. plt.scatter(X[:, 0], X[:, 1], c=label_pred, s=50, cmap='cool')
  31. # 绘制质心点
  32. plt.scatter(centroids[:,0],centroids[:,1],c='red',marker='o',s=100)
  33. plt.xlabel('花萼长度')
  34. plt.ylabel('花萼宽度')
  35. plt.title("K-Means算法聚类结果")
  36. plt.show()

最终的显示结果如下图所示:
 

k-means聚类算法


通过绘图结果可以看出,在没有“参考答案”的前提下,K-measn 算法完成了样本的分簇任务,其中红色圆点是质心点。

总结

聚类算法博大精深,每一种算法都有自己的实现原理,单拿 K-means 算法来说,就有多种基于它的衍生算法,比如二分 K-means 算法、K-means++ 算法、K-measn|| 算法、Canopy 算法,以及 Mini Batch K-means 算法等,这些算法的出现主要是为了弥补 K-means 算法的不足,比如随机选择初始簇质心点,以及 K 值敏感等问题。

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

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

相关文章

计算机毕业设计选题推荐-房屋租赁系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【python】python心理健康医学数据分析与逻辑回归预测(源码+数据集+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

php 中 (0 == ‘abc‘) 为真

https://andi.cn/page/621653.html

第129天:内网安全-横向移动WmiSmbCrackMapExecProxyChainsImpacket

这里这个环境继续上一篇文章搭建的环境 案例一: 域横向移动-WMI-自带&命令&套件&插件 首先上线win2008 首先提权到system权限 wmic是windows自带的命令,可以通过135端口进行连接利用,只支持明文方式,优点是不用上传别…

解决IDEA中Maven项目依赖已存在但仍报找不到的错误

问题描述: 如图显示的是lombok存在 这里已经导入lombok依赖包 如图所示依赖包确实已经导入 解决方案: 点击后会重新启动项目,操作后我们重新配置一下maven 设置完后,点击重新引入就行

JAVA实战项目笔记02

一、新增员工 1.接口设计 2.设计数据库的employee表 3.设计DTO DTO:封装前端提交过来的数据 实体类如下:包含更多属性 public class Employee implements Serializable {private static final long serialVersionUID 1L;private Long id;private Str…

vivado OPT_SKIPPED

当跳过候选基元单元的逻辑优化时,OPT_skipped属性 更新单元格以反映跳过的优化。当跳过多个优化时 在同一单元格上,OPT_SKIPPED值包含跳过的优化列表。 架构支持 所有架构。 适用对象 OPT_SKIPPED属性放置在单元格上。 价值观 下表列出了各种OPT_design选…

使用ventoy制作U盘安装centos8

使用ventoy制作U盘安装centos8 参考:https://blog.51cto.com/u_14120/11118656 推荐这个https://www.zhihu.com/question/290783457/answer/3103388484 1、ventoy官网 https://www.ventoy.net/en/download.html 2、下载完成直接制作u盘启动盘 4、将下载iso镜像…

维特根斯坦:所谓天才,就是不放弃实践的勇气

天才并不比任何一个诚实的人有更多的光,但他有一个特殊的透镜,可以将光线聚焦至燃点。 我象一个骑在马上的拙劣骑手一样,骑在生活上。我之所以现在还未被抛下,仅仅归功于马的良好本性。 一个人懂得太多就会发现,要不…

大模型开源教程「动手学大模型应用开发」,从零基础到掌握大模型开发的关键技能!

LLM 正逐步成为信息世界的新革命力量,其通过强大的自然语言理解、自然语言生成能力,为开发者提供了新的、更强大的应用开发选择。随着国内外井喷式的 LLM API 服务开放,如何基于 LLM API 快速、便捷地开发具备更强能力、集成 LLM 的应用&…

营销材料翻译质量对销售渠道的影响

在当今的全球市场中,与不同受众进行有效沟通的能力对于企业的成功至关重要。营销材料的高质量翻译在通过销售渠道塑造客户旅程方面发挥着重要作用,影响着知名度、参与度、转化率和保留率。方法如下: 提高品牌知名度 在销售渠道的顶端&#x…

Android 14 Power键亮灭屏流程

Android14中Power键的事件分发和Android10的是不一样的,这里并没有经过interceptKeyBeforeDispatching方法,而是直接走到了interceptKeyBeforeQueueing方法 PhoneWindowManager中的堆栈如下 07-06 08:59:04.481 1844 1984 D WindowManager: intercep…

鸿蒙(API 12 Beta2版)媒体开发【使用AudioCapturer开发音频录制功能】

如何选择音频录制开发方式 系统提供了多样化的API,来帮助开发者完成音频录制的开发,不同的API适用于不同录音输出格式、音频使用场景或不同开发语言。因此,选择合适的音频录制API,有助于降低开发工作量,实现更佳的音频…

HDFS写入数据的流程图

1.客户端向namenode发送请求,请示写入数据 2.namenode接受请求后,判断这个用户是否有写入权限,如果不具备直接报错;如果有写入权限,接着判断在要写入的目录下是否已经存在这个文件,如果存在,直…

通过python搭建文件传输服务器;支持多台电脑之间互相传输文件(支持局域网或广域网)(应该也能用于虚拟机和宿主机之间)

因为公司网络防火墙限制,所以在公司的电脑之间传输文件还是非常不方便的;所以自己搭建了一个文件传输服务器,用于多台电脑间的文件传输; 先放上最终效果: 文章目录 一、运行环境要求二、环境搭建2.1 安装python2.2 搭建虚拟环境方法1:创建Anaconda虚拟环境方法2:创建pyt…

Java线程池的这几个大坑,你踩过几个?

首先看一个简单的例子:代码可能会抛出空指针异常,但这个异常就会被吞掉。 要优雅解决问题,可以为线程池设置一个全局的异常处理器,使用自定义的线程工厂来设置! java public class CustomThreadFactory implements ThreadFactory { private final Threa…

CTFHUB-web-RCE-综合过滤练习

开启题目 查看网页源代码发现这次网页对 | 、 && 、 || 、 \ 、 / 、; ,都进行了过滤处理 发现换行符 %0a 和回车符 %0d 可以进行测试,在 URL 后面拼接访问 127.0.0.1%0als 用 ls flag_is_here 查看 flag 文件中的内容,发现回显为空…

11-电阻 电容元件的创建

1. 2.格点设置 3.当设置完线条的时候,格点重新设置回100mil 4.更改管脚长度,宽度

vscode安装与配置本地c/c++编译调试环境

目录 (1)安装vscode和常用插件 1.下载安装vscode 2.安装常用插件 (2)本地安装和配置编译器 1.安装编译器 2.vscode配置编译器 第1种:全局配置 第2种:为当前项目个性化配置 (3&#xff…

海量数据处理商用短链接生成器平台 - 9

第二十六章 短链服务-冗余双写架构删除和更新消费者开发实战 第1集 冗余双写架构-更新短链消费者开发实战 简介: 短链服务-更新短链-消费者开发实战 具体步骤见代码 第2集 冗余双写架构-更新短链消费者链路测试 简介: 冗余双写架构-更新短链消费者链…