【深度学习】KMeans中自动K值的确认方法

1  前言

聚类常用于数据探索或挖掘前期,在没有做先验经验的背景下做的探索性分析,也适用于样本量较大情况下的数据预处理等方面工作。例如针对企业整体用户特征,在未得到相关知识或经验之前先根据数据本身特点进行用户分群,然后再针对不同群体做进一步分析;例如将连续数据做离散化,便于做后续分类分析应用。

KMeans是聚类方法中非常常用的方法,并且在正确确定K的情况下,KMeans对类别的划分跟分类算法的差异性非常小,这也意味着KMeans是一个准确率非常接近实际分类的算法。本文将讨论如下基于自动化的方法确立K值。

本案例是《Python数据分析与数据化运营》中“7.11案例-基于自动K值的KMeans广告效果聚类分析”的一部分,其ad_performance.txt和源代码chapter7_code2.py位于“附件-chapter7”中,该附件可以在可从http://www.dataivy.cn/book/python_book.zip或https://pan.baidu.com/s/1kUUBWNX下载。

2  实现思路

K值的确定一直是KMeans算法的关键,而由于KMeans是一个非监督式学习,因此没有所谓的“最佳”K值。但是,从数据本身的特征来讲,最佳K值对应的类别下应该是类内距离最小化并且类间距离最大化。有多个指标可以用来评估这种特征,比如平均轮廓系数、类内距离/类间距离等都可以做此类评估。基于这种思路,我们可以通过枚举法计每个K下的平均轮廓系数值,然后选出平均轮廓系数最大下的K值。

3  核心过程

假设我们已经拥有一份预处理过的数据集,其中的异常值、缺失值、数据标准化等前期工作都已经完成。下面是完成自动K值确定的核心流程:

  
  1. score_list = list()  # 用来存储每个K下模型的平局轮廓系数
  2. silhouette_int = -1  # 初始化的平均轮廓系数阀值
  3. for n_clusters in range(2, 10): # 遍历从2到10几个有限组
  4.    model_kmeans =KMeans(n_clusters=n_clusters, random_state=0) # 建立聚类模型对象
  5.    cluster_labels_tmp =model_kmeans.fit_predict(X)  # 训练聚类模型
  6.    silhouette_tmp =metrics.silhouette_score(X, cluster_labels_tmp) # 得到每个K下的平均轮廓系数
  7.    if silhouette_tmp >silhouette_int:  # 如果平均轮廓系数更高
  8.        best_k =n_clusters  # 将最好的K存储下来
  9.        silhouette_int =silhouette_tmp  # 将最好的平均轮廓得分存储下来
  10.        best_kmeans =model_kmeans  # 将最好的模型存储下来
  11.        cluster_labels_k =cluster_labels_tmp  # 将最好的聚类标签存储下来
  12.   score_list.append([n_clusters, silhouette_tmp])  # 将每次K及其得分追加到列表
  13. print ('{:^60}'.format(‘K value and silhouette summary:’))
  14. print (np.array(score_list)) # 打印输出所有K下的详细得分
  15. print (‘Best K is:{0} with average silhouette of{1}’.format(best_k, silhouette_int.round(4)))

该步骤的主要实现过程如下:

定义初始变量score_list和silhouette_int。score_list用来存储每个K下模型的平局轮廓系数,方便在最终打印输出详细计算结果;silhouette_int的初始值设置为-1,每个K下计算得到的平均轮廓系数如果比该值大,则将其值赋值给silhouette_int。

提示:对于平均轮廓系数而言,其值域分布式[-1,1]。因此silhouette_int的初始值可以设置为-1或比-1更小的值。

使用for循环遍历每个K值,这里的K的范围确定为从2-10.一般而言,用于聚类分析的K值的确定不会太大。如果值太大,那么聚类效果可能不明显,因为大量信息的都会被分散到各个小类之中,会导致数据的碎片化。

通过KMeans(n_clusters=n_clusters, random_state=0)建立KMeans模型对象model_kmeans,设置聚类数为循环中得到的K值,设置固定的初始状态。

对model_kmeans使用fit_predict得到其训练集的聚类标签。该步骤其实无需通过predict获得标签,可以先使用fit方法对模型做训练,然后使用模型对象model_kmeans的label_属性获得其训练集的标签分类。

使用metrics.silhouette_score方法对数据集做平均轮廓系数得分检验,将其得分赋值给silhouette_tmp,输入参数有两个:

  • X:为原始输入的数组或矩阵
  • cluster_labels:训练集对应的聚类标签

接下来做判断,如果计算后的得分大于初始化变量的得分,那么:

  • 将最佳K值存储下来,便于后续输出展示
  • 将最好的平均轮廓得分存储下来,便于跟其他后续得分做比较以及输出展示
  • 将最好的模型存储下来,这样省去了后续再做最优模型下fit(训练)的工作
  • 将最好的聚类标签存储下来,这样方便下面将原始训练集与最终标签合并

每次循环结束后,将当次循环的K值以及对应的评论轮廓得分使用append方法追加到列表。

最后打印输出每个K值下详细信息以及最后K值和最优评论轮廓得分,返回数据如下:

  
  1. K value and silhouette summary:
  2. [[ 2.          0.46692821]
  3. [ 3.          0.54904646]
  4. [ 4.          0.56968547]
  5. [ 5.          0.48186604]
  6. [ 6.          0.45477667]
  7. [ 7.          0.48204261]
  8. [ 8.          0.50447223]
  9. [ 9.          0.52697493]]
  10. Best K is:4 with average silhouette of 0.5697

上述结果显示了不同K下的平均轮廓得分。就经验看,如果平均轮廓得分值小于0,意味着聚类效果不佳;如果值大约0且小于0.5,那么说明聚类效果一般;如果值大于0.5,则说明聚类效果比较好。本案例在K=4时,得分为0.5697,说明效果较好。

对于上述得到的结果,将最优K值下得到的KMeans模型的结果,可以通过各类别的类内、外数据的对比以及配合雷达图或极坐标图做分析解释。

KMeans中自动K值的确认方法

各聚类类别显著特征对比

4  引申思考

注意,即使在数据上聚类特征最明显,也并不意味着聚类结果就是有效的,因为这里的聚类结果用来分析使用,不同类别间需要具有明显的差异性特征并且类别间的样本量需要大体分布均衡。而确定最佳K值时却没有考虑到这些“业务性”因素。

案例中通过平均轮廓系数的方法得到的最佳K值不一定在业务上具有明显的解读和应用价值。如果最佳K值的解读无效怎么办?有两种思路:

  • 扩大K值范围,例如将K的范围调整为[2,12],然后再次运算看更大范围内得到的K值是否更加有效并且能符合业务解读和应用需求。
  • 得到平均轮廓系数“次要好”(而不是最好)的K值,再对其结果做分析。

对于不同类别的典型特征的对比,除了使用雷达图直观的显示外,还可以使用多个柱形图的形式,将每个类别对应特征的值做柱形图统计,这样也是一个非常直观的对比方法。具体参考下图:

KMeans中自动K值的确认方法

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

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

相关文章

Pinia仓库统一管理

pinia独立维护 在src/stores文件夹下创建index.js文件,将main.js中关于pinia的语句放到index.js中 index.js文件内容: import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstate const pinia createPi…

基于javaweb的宠物服务商城系统设计与开发

摘 要 最近几年以来,宠物在人们的日常生活中所占的地位越来越重要了,它们不仅仅是我们的朋友,也成为了我们家庭中的一份子。21世纪,信息技术飞速发展,计算机行业日新月异,极大地带动了信息的流动&#xff…

新建的springboot项目中application.xml没有绿色小叶子(不可用)

经常有朋友会遇到新建了一个springboot项目,发现为啥我创建的application.xml配置文件不是绿色的??? 下面教大家如何解决,这也是博主在做测试的时候遇到的: 将当前位置application.xml删掉,重新…

智慧环保:视频监控平台EasyCVR与AI智能分析在环保领域的应用

人工智能(AI)视频分析技术在环保领域有着广泛的应用,通过智能识别和跟踪技术,AI视频分析可以实时监测空气质量、水质和噪音等环境指标,帮助环保部门及时发现污染源并进行有效治理,提高监测、管理和保护环境…

深入学习redis-基于Jedis通过客户端操作Redis

目录 redis客户端(JAVA) 配置 引入依赖 建立连接 常用命令实现 get/set exists/del keys expire和ttl type 字符串(String) mget和mset getrange和setrange append incr和decr 列表(list) …

明确技术和质量管理工作的主管领导、技术和质量管理机构的负责人。技术和质量管理机构负责人应当具备中级及以上测绘专业技术职称

明确技术和质量管理工作的主管领导、技术和质量管理机构的负责人。技术和质量管理机构负责人应当具备中级及以上测绘专业技术职称 1.技术和质量管理工作主管领导、技术和质量机构负责人的任命文件 2.技术和质量机构负责人的专业技术职称

Go 从编译到执行

一、Go运行编译简介 Go语言(也称为Golang)自从2009年由Google发布以来,已成为现代软件开发中不可或缺的一部分。设计者Rob Pike, Ken Thompson和Robert Griesemer致力于解决多核处理器、网络系统和大型代码库所引发的现实世界编程问题。我们…

猜-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息: 题目:猜 作者:harry 提示: 解题附件:flag格式key{图中人物名字全拼} 解题思路: 这......头都没有,让我guess???详细信息看…

如何使用vs2022通过excel.exe生成VC、C++能够使用的头文件

我们在开发MFC、VC、C项目时,有时候需要操作excel文件的读写,我们一般常用方式是调用微软的excel驱动方式调用,但调用驱动前,我们需要生成我们C能够调用到的头文件,一般常用文件有: #include "CAppli…

FastDFS文件系统本地部署结合Nginx与内网穿透实现远程访问本地服务器

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

【算法每日一练]-图论(保姆级教程篇9 最小生成树 ,并查集篇)#道路修建 #兽径管理

目录 题目:道路修建 思路: 题目:兽径管理 思路: 题目:道路修建 思路: “让这些点全部连在一起的最小代价”很明显是最小生成树。绝对不能kruskal,存边一定会超内存。所以只能prim。 但是…

AI搜索相关性在网站和APP上的应用

设定场景:您在寻找一件新衣服,所以在浏览最喜欢的网店。您跳到搜索栏上,输入您要找的东西。您期待出现什么结果? 高度准确、相关和即时的结果。 无论在什么网站上搜索,寻找什么,甚至在打错字或使用了错误的…