Python 如何确定K-Means聚类的簇数

article/2025/10/1 13:39:46

背景

“人以类聚,物以群分”,在大千世界中总有那么一些人,性格爱好、行为习惯比较相近,我们就会把他们归为一类人,这就是我们人脑自动进行的一个聚类(归类)。
在数据分析中,我们也经常拿数据来进行K-Means聚类,用来进行一些分析,K-Means聚类可能大家都会,但是如何科学的决策聚类簇数,这一直是聚类的一大难题。今天就来分享一下,自己工作中在确定聚类簇数时要到的方法。

方法

可以确定聚类簇数的方法
  • Adjusted Rand index 调整兰德系数
  • Mutual Information based scores 互信息
  • Homogeneity, completeness and V-measure 同质性、完整性、两者的调和平均
  • Silhouette Coefficient 轮廓系数
  • Calinski-Harabaz Index
  • SSE 簇里误差平方和
自己使用的方法,手肘法则SSE 和 轮廓系数 相结合
  • SSE 簇里误差平方和

SSE利用计算误方差和,来实现对不同K值的选取后,每个K值对应簇内的点到中心点的距离误差平方和,理论上SSE的值越小,代表聚类效果越好,通过数据测试,SSE的值会逐渐趋向一个最小值。

  • Silhouette Coefficient 轮廓系数

好的聚类:内密外疏,同一个聚类内部的样本要足够密集,不同聚类之间样本要足够疏远。

轮廓系数计算规则:
针对样本空间中的一个特定样本,计算它与所在簇中其它样本的平均距离a,以及该样本与距离最近的另一个聚类中所有样本的平均距离b,该样本的轮廓系数为

单个样本点的轮廓系数
详细分解
对于其中的一个点 i 来说:
计算 a(i) = average(i向量到所有它属于的簇中其它点的距离)
计算 b(i) = min (i向量到各个非本身所在簇的所有点的平均距离)
分解步骤

然后将整个样本空间中所有样本的轮廓系数取算数平均值,作为聚类划分的性能指标轮廓系数

轮廓系数的区间为:[-1, 1]。 -1代表分类效果差,1代表分类效果好。0代表聚类重叠,没有很好的划分聚类

应用、代码

以鸢尾花数据集为案例

from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import sklearn.metrics as sm
import pandas as pd%matplotlib inline
import matplotlib.pyplot as plt#中文乱码的处理  显示负号
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
plt.rcParams['axes.unicode_minus']=False# 载入鸢尾花数据集
iris = datasets.load_iris()data=pd.DataFrame(iris['data'],columns=iris['feature_names'])std = StandardScaler()
data_std=std.fit_transform(data)SSE = []
k_SSE = []
#簇的数量
for n_clusters in range(1,11):cls = KMeans(n_clusters).fit(data_std)score = cls.inertia_SSE.append(score)k_SSE.append(n_clusters)silhouette_score = []
k_sil = []
#簇的数量
for n_clusters in range(2,11):cls = KMeans(n_clusters).fit(data_std)pred_y=cls.labels_#轮廓系数score =sm.silhouette_score(data_std, pred_y)silhouette_score.append(score)k_sil.append(n_clusters)fig, ax1 = plt.subplots(figsize=(10, 6))ax1.scatter(k_SSE, SSE)
ax1.plot(k_SSE, SSE)
ax1.set_xlabel("k",fontdict={'fontsize':15})
ax1.set_ylabel("SSE",fontdict={'fontsize':15})
ax1.set_xticks(range(11))
for x,y in zip(k_SSE,SSE):plt.text(x, y,x)ax2 = ax1.twinx()
ax2.scatter(k, silhouette_score,marker='^',c='red')
ax2.plot(k, silhouette_score,c='red')
ax2.set_ylabel("silhouette_score",fontdict={'fontsize':15},)
for x,y in zip(k_sil,silhouette_score):plt.text(x, y,x)plt.show()
iris 聚类

结合SSE与轮廓系数,当k=3时比较适合,可以确定聚类的簇数为3

而鸢尾花数据集里面真实的分类就是3类

iris['target_names']
#array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

历史相关文章

  • 利用熵值法确定指标权重---原理及Python实现
  • 罗兰贝格图--Python等高线图(平滑处理)

以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注微信公众号,不定期分享干货


http://chatgpt.dhexx.cn/article/U3daE341.shtml

相关文章

【机器学习】聚类代码练习

本课程是中国大学慕课《机器学习》的“聚类”章节的课后代码。 课程地址&#xff1a; https://www.icourse163.org/course/WZU-1464096179 课程完整代码&#xff1a; https://github.com/fengdu78/WZU-machine-learning-course 代码修改并注释&#xff1a;黄海广&#xff0c;ha…

【聚类算法】10种Python聚类算法完整操作示例(建议收藏

点击上方&#xff0c;选择星标&#xff0c;每天给你送干货&#xff01; 来源&#xff1a;海豚数据科学实验室 著作权归作者所有&#xff0c;本文仅作学术分享&#xff0c;若侵权&#xff0c;请联系后台删文处理 聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术&…

理论+实战,一文详解最常使用的10个聚类算法(附代码)

聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术&#xff0c;用于发现数据中的有趣模式&#xff0c;例如基于其行为的客户群。有许多聚类算法可供选择&#xff0c;对于所有情况&#xff0c;没有单一的最佳聚类算法。 相反&#xff0c;最好探索一系列聚类算法以及每…

基于微信小程序的家校通系统-JAVA【数据库设计、源码、开题报告】

第一章 绪 论 1.1选题背景 随着网络时代的到来&#xff0c;互联网的优势和普及时刻影响并改变着人们的生活方式。在信息技术迅速发展的今天&#xff0c;计算机技术已经遍及全球&#xff0c;使社会发生了巨大的变革。 为了不受时间和地点的限制&#xff0c;智能手机用户可以通…

python新闻文本聚类_TextCluster:短文本聚类预处理模块 Short text cluster

推荐Github上一个NLP相关的项目&#xff1a; RandyPen/TextCluster 项目地址&#xff0c;阅读原文可以直达&#xff0c;欢迎参与和Star&#xff1a; https://github.com/RandyPen/TextCluster 这个项目的作者是AINLP交流群里的昭鸣同学&#xff0c;该项目 开源了一个短文本聚…

【组队学习】十一月微信图文索引

十一月微信图文索引 一、组队学习相关 周报&#xff1a; Datawhale组队学习周报&#xff08;第037周&#xff09;Datawhale组队学习周报&#xff08;第038周&#xff09;Datawhale组队学习周报&#xff08;第039周&#xff09;Datawhale组队学习周报&#xff08;第040周&…

k-means聚类算法从入门到精通

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 k-means算法是非监督聚类最常用的一种方法&#xff0c;因其算法简单和很好的适用于大样本数据&#xff0c;广泛应用于不同领域&#xff0c;本文详细总结了k-means聚类算…

LaneAF | 利用Affinity Field聚类进行车道线实例分割

点击上方“计算机视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 论文&#xff1a;https://arxiv.org/abs/2103.12040 开源代码&#xff1a;https://github.com/sel118/LaneAF 0 动机 车道线检测对于辅助驾驶、自动驾驶至关重要。全球范围内多种多样的车道线以及复杂的道…

机器学习 --- 聚类性能评估指标

第1关&#xff1a;外部指标 任务描述 本关任务:填写 python 代码&#xff0c;完成 calc_JC 函数、calc_FM 函数和 calc_Rand 函数分别实现计算 JC系数、FM 指数 和 Rand 指数 。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; JC 系数&#xff1b; FM 指数&…

如何用 DBSCAN 聚类算法做数据分析?

DBSCAN属于无监督学习算法&#xff0c;无监督算法的内涵是观察无标签数据集自动发现隐藏结构和层次&#xff0c;在无标签数据中寻找隐藏规律。 聚类模型在数据分析当中的应用&#xff1a;既可以作为一个单独过程&#xff0c;用于寻找数据内在规律&#xff0c;也可以作为分类等…

激光点云的物体聚类

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 文章导读 本文针对自动驾驶中三维点云的道路目标聚类进行讲解&#xff0c;从聚类算法的原理出发&#xff0c;介绍几种常用的点云障碍物聚类算法&#xff0c;并对比分析算…

K-means聚类算法

实训目标 本实训项目介绍无监督学习中&#xff0c;使用最广泛的 K-means 聚类算法。 先修知识 本实训项目假设&#xff0c;你已经掌握了初步的 Python 程序设计的基础知识。学习者若有一些 numpy 的使用经验&#xff0c;则可更快速地通过实训。 实训知识点 欧几里得距离 估算簇…

一文详解激光点云的物体聚类

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 文章导读 本文针对自动驾驶中三维点云的道路目标聚类进行讲解&#xff0c;从聚类算法的原理出发&#xff0c;介绍几种常用的点云障碍物聚类算法&#xff0c;并对比分析算法的优劣和适用场景&#xff0c;从工程…

[计算机毕业设计]模糊聚类算法

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

51nod-1548:欧姆诺姆和糖果

1548 欧姆诺姆和糖果 题目来源&#xff1a; CodeForces 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 20 难度&#xff1a;3级算法题 收藏 关注 一天&#xff0c;欧姆诺诺姆来到了朋友家里&#xff0c;他发现了许多糖果。有蓝色和红色两种。他知道每颗…

android自动导入包快捷键,Android studio 自动导入(全部)包 import

http://blog.csdn.net/buaaroid/article/details/44979629 1 Android studio 只有import单个包的快捷键:Alt+Enter。没有Eclipse下的快速导入包的快捷键Ctrl+Shift+O。 2 但Android studio设置里有一项Auto Import自动导入功能。设置过程如下: Android studio --> File--&…

舍友打一把游戏的时间,我实现了一个selenium自动化测试并把数据保存到MySQL

文章目录 前言最终效果开发环境selenium元素定位方法页面分析思路分析实现步骤运行结果以下是全部代码 前言 很久没有玩selenium自动化测试了&#xff0c;近日在学习中都是在忙于学习新的知识点&#xff0c;所以呢今天就来写个selenium自动化测试的案例吧。有没有人疑惑&#…

51nod P1381 硬币游戏【数学】

题目 思路 比较简单. 参考代码 #include<iostream> #include<cstdio> using namespace std; int T,n; int main() {scanf("%d",&T);while(T--){scanf("%d",&n);printf("%d\n",2*n);}return 0; }

51nod3061 车

题目 题目链接 解题思路 提一种不需要生成树的解法。 我们将询问挂到点上&#xff0c;使用启发式合并的并查集。当询问的两边合并到一起时&#xff0c;我们就得到了答案。 整体复杂度 O ( n l o g 2 n ) O(nlog_2n) O(nlog2​n)。 代码 #include <cstdio> #include &…

51nod 1279 扔盘子

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279 题目: 有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去)。 盘子有几种命运:1、掉到…