news 2026/1/29 18:27:19

基于轮廓系数的 k-means 聚类结果评估与可视化实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于轮廓系数的 k-means 聚类结果评估与可视化实践

【精选优质专栏推荐】

  • 《AI 技术前沿》—— 紧跟 AI 最新趋势与应用
  • 《网络安全新手快速入门(附漏洞挖掘案例)》—— 零基础安全入门必看
  • 《BurpSuite 入门教程(附实战图文)》—— 渗透测试必备工具详解
  • 《网安渗透工具使用教程(全)》—— 一站式工具手册
  • 《CTF 新手入门实战教程》—— 从题目讲解到实战技巧
  • 《前后端项目开发(新手必知必会)》—— 实战驱动快速上手


每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

文章目录

    • 前言
    • 理解轮廓系数指标
    • 企鹅数据集中的轮廓系数分析实战
    • 总结

前言

在本文中,你将学习如何使用轮廓系数分析来评估 k-means 聚类结果,并解释平均得分和每个聚类的得分,以指导模型选择。

我们将讨论的主题包括:

  • 轮廓系数衡量什么以及如何计算

  • 如何使用轮廓系数分析来选择合理的聚类数量

  • 可视化每个样本的轮廓值以诊断聚类质量

机器学习中的聚类模型必须通过其将数据划分为具有不同特征的有意义组的能力来进行评估。评估由 k-means 等迭代算法生成的聚类内部凝聚力和相互分离度的关键指标之一是轮廓系数,它量化一个对象——数据实例 i——与其自身聚类相比于其他聚类的相似程度。

本文重点介绍如何通过轮廓系数分析来评估和解释聚类质量,即基于对轮廓系数的规范使用来分析聚类结构和有效性。轮廓系数分析在市场营销、制药、化学工程等领域的实际分群任务中具有现实意义。

理解轮廓系数指标

对于在被分成 k 个聚类的数据集中给定的数据点或实例 i,其轮廓系数定义为:

在公式中,a(i) 是簇内凝聚度,即 i 与其所属簇中其余点之间的平均距离。与此同时,b(i) 是簇间分离度,即 i 与最近邻簇中点之间的平均距离。

轮廓系数的取值范围为 −1 到 1。较低的 a(i) 和较高的 b(i) 会提升轮廓系数,被解释为更高质量的聚类,即点与其簇的联系更紧密,同时与其他簇的分离更好。总而言之,轮廓系数越高越好。

在实践中,我们通常计算所有实例的平均轮廓系数,以总结某个聚类结果的整体聚类质量。

轮廓系数被广泛用于评估不同数据集和领域中的聚类质量,因为它同时捕获了凝聚度和分离度。它也常被用作选择合适聚类数量 k 的替代方法或补充方法,作为对肘部法的补充——这是应用 k-means 及其变体等迭代方法时的必要步骤。

此外,当你绘制单样本和簇级别的轮廓图时,轮廓系数也可作为一种具有洞察力的可视化工具,其中条形宽度反映簇的大小。下面的示例展示了一个数据集中被划分为三个簇的所有实例的轮廓图,将轮廓值按簇分组,以便与该聚类结果的整体平均轮廓系数进行比较。

从另一方面来看,轮廓系数分析在某些数据集和聚类形状(例如非凸或结构复杂的簇)上可能不太可靠,并且在非常高维的空间中可能会面临挑战。

企鹅数据集中的轮廓系数分析实战

为了演示如何使用轮廓系数分析进行聚类评估,我们将使用著名的 Palmer Archipelago 企鹅数据集。

我们快速浏览准备步骤(加载和预处理),这些步骤在本介绍性聚类分析教程中有详细解释。我们将使用 pandas、scikit-learn、Matplotlib 和 NumPy。

importpandasaspdfromsklearn.preprocessingimportStandardScalerfromsklearn.clusterimportKMeansfromsklearn.metricsimportsilhouette_score,silhouette_samplesimportmatplotlib.pyplotaspltimportnumpyasnp# Load dataset (replace with actual path or URL)penguins=pd.read_csv('https://raw.githubusercontent.com/gakudo-ai/open-datasets/refs/heads/main/penguins.csv')penguins=penguins.dropna()features=['bill_length_mm','bill_depth_mm','flipper_length_mm','body_mass_g']X=penguins[features]# Scale numerical features for more effective clusteringscaler=StandardScaler()X_scaled=scaler.fit_transform(X)

接下来,我们应用 k-means 来寻找数据集中的聚类。我们对多个聚类数量 k(即 n_clusters 参数)重复这一过程,范围从 2 到 6。对于每个设置,我们计算轮廓系数。

range_n_clusters=list(range(2,7))silhouette_avgs=[]forn_clustersinrange_n_clusters:kmeans=KMeans(n_clusters=n_clusters,n_init=10,random_state=42)cluster_labels=kmeans.fit_predict(X_scaled)sil_avg=silhouette_score(X_scaled,cluster_labels)silhouette_avgs.append(sil_avg)print(f"For n_clusters ={n_clusters}, average silhouette_score ={sil_avg:.3f}")

输出结果为:

For n_clusters = 2, average silhouette_score = 0.531
For n_clusters = 3, average silhouette_score = 0.446
For n_clusters = 4, average silhouette_score = 0.419
For n_clusters = 5, average silhouette_score = 0.405
For n_clusters = 6, average silhouette_score = 0.392

这表明在 k = 2 时获得了最高的轮廓系数。这通常意味着数据点的最一致分组,尽管它并不总是与生物学或领域的实际真值一致。

在企鹅数据集中,尽管存在具有不同特征的三种物种,重复的 k-means 聚类和轮廓系数分析表明,在所选特征空间中(这里是四个数值属性),将数据划分成两组可能更一致。这可能是因为轮廓系数反映的是所选特征中的几何可分性,而非类别标签;物种之间特征的重叠可能会让 k-means 倾向于选择比实际物种数量更少的聚类数。

让我们可视化五种配置的轮廓结果:

fig,axes=plt.subplots(1,len(range_n_clusters),figsize=(25,5),sharey=False)fori,n_clustersinenumerate(range_n_clusters):ax=axes[i]kmeans=KMeans(n_clusters=n_clusters,n_init=10,random_state=42)labels=kmeans.fit_predict(X_scaled)sil_vals=silhouette_samples(X_scaled,labels)sil_avg=silhouette_score(X_scaled,labels)y_lower=10forjinrange(n_clusters):ith_sil_vals=sil_vals[labels==j]ith_sil_vals.sort()size_j=ith_sil_vals.shape[0]y_upper=y_lower+size_j color=plt.cm.nipy_spectral(float(j)/n_clusters)ax.fill_betweenx(np.arange(y_lower,y_upper),0,ith_sil_vals,facecolor=color,edgecolor=color,alpha=0.7)ax.text(-0.05,y_lower+0.5*size_j,str(j))y_lower=y_upper+10# separation between clustersax.set_title(f"Silhouette Plot for k ={n_clusters}")ax.axvline(x=sil_avg,color="red",linestyle="--")ax.set_xlabel("Silhouette Coefficient")ifi==0:ax.set_ylabel("Cluster Label")ax.set_xlim([-0.1,1])ax.set_ylim([0,len(X_scaled)+(n_clusters+1)*10])plt.tight_layout()plt.show()

一个明显的观察是,对于 k ≥ 4,平均轮廓系数下降到大约 0.4,而在 k = 2 或 k = 3 时更高。

如果我们为聚类选择不同的(更窄的)属性子集会怎样?例如,只考虑喙长和鳍长。这只需将代码开头附近的特征选择语句替换为:

features=['bill_length_mm','flipper_length_mm']

然后重新运行其余部分。在聚类之前尝试不同的特征选择,并检查轮廓系数分析的结果在不同聚类数量的选择下是否保持一致或发生变化。

总结

本文提供了对聚类算法中一种标准聚类质量指标——轮廓系数的简洁且实用的理解,并展示了如何使用它来批判性地分析聚类结果。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/25 19:44:23

Wazuh+OpenCTI威胁情报集成教程(二)之OpenCTI 平台基础与规则体系

文章目录 背景 一、OpenCTI 核心认知 1. 什么是 OpenCTI? 2. 为什么要用 OpenCTI? 3. 谁适合用 OpenCTI? 二、OpenCTI 核心功能模块(附实操场景) 三、OpenCTI 安装部署(零基础教程) 1. 环境要求(核心参考) 2. 详细安装步骤(Ubuntu 22.04 示例) 四、OpenCTI 实操:10…

作者头像 李华
网站建设 2026/1/28 19:38:21

吐血整理,性能测试-正确定义性能瓶颈分析,一篇通透...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试和功能测…

作者头像 李华
网站建设 2026/1/28 10:57:16

nodeppt演讲者模式深度解析:打造专业级演讲体验

nodeppt演讲者模式深度解析:打造专业级演讲体验 【免费下载链接】nodeppt This is probably the best web presentation tool so far! 项目地址: https://gitcode.com/gh_mirrors/no/nodeppt 还在为演讲时手忙脚乱而烦恼吗?nodeppt的演讲者模式正…

作者头像 李华
网站建设 2026/1/28 17:37:42

终极指南:YouTube Music桌面版如何打造专属音乐空间

终极指南:YouTube Music桌面版如何打造专属音乐空间 【免费下载链接】ytmdesktop A Desktop App for YouTube Music 项目地址: https://gitcode.com/gh_mirrors/yt/ytmdesktop YouTube Music桌面版是一款功能强大的开源音乐播放器,为用户提供超越…

作者头像 李华
网站建设 2026/1/29 7:55:57

Wan2.2-T2V-A14B实现高质量运动过渡的算法机制揭秘

Wan2.2-T2V-A14B 实现高质量运动过渡的算法机制揭秘在短视频日均播放量突破百亿的时代,内容创作者早已不满足于“能出画面”——大家真正想要的是一段会呼吸的视频:人物动作自然流畅、场景转换丝滑无痕、风吹发梢都带着情绪。🎯 可现实呢&…

作者头像 李华
网站建设 2026/1/27 11:17:56

VSCode连接量子设备全攻略(从零到专家级配置方案)

第一章:VSCode 的量子硬件连接配置 在现代量子计算开发中,Visual Studio Code(VSCode)已成为主流集成开发环境之一。通过扩展插件与底层API的结合,开发者可直接在VSCode中编写量子电路并连接真实量子硬件进行执行。 安…

作者头像 李华