news 2026/10/30 19:54:36

基于轮廓系数的 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/10/30 21:07:22

2025程序员转行大模型全攻略:百万年薪岗位揭秘,零基础突围

本文解析2025年大模型领域的爆发机遇,指出市场需求激增、薪资远超传统岗位、政策资本双重驱动。文章为程序员提供四大黄金岗位选择、三大转型策略和六个月学习路线图,强调技能嫁接、技术栈组合和微项目实践。同时提醒避开盲目死磕数学、忽视垂直领域知识…

作者头像 李华
网站建设 2026/10/30 7:42:49

讲透2025AI营销,只此一人

2025年,AI浪潮以前所未有的速度席卷商业世界,营销领域首当其冲。从高层管理者到一线执行,几乎所有营销从业者都陷入了一种普遍的“AI焦虑”:一方面,大家深知拥抱AI营销是不可逆转的趋势,是构建未来竞争力的…

作者头像 李华
网站建设 2026/10/31 4:45:37

堆转储 探索

一、什么是堆转储(Heap Dump)?堆转储(Heap Dump) 是 JVM 在某一时刻 整个堆内存的快照,以 .hprof 文件形式保存。它包含:所有存活对象的实例对象的类信息对象之间的引用关系对象占用的内存大小&…

作者头像 李华
网站建设 2026/10/31 3:41:53

WPS办公自动化新篇章:VBA插件7.1全面解析与实战指南

WPS办公自动化新篇章:VBA插件7.1全面解析与实战指南 【免费下载链接】最新版VBA插件7.1支持WPS 本仓库提供最新版VBA插件7.1的下载资源,该插件专为WPS设计,能够帮助用户在WPS中高效使用VBA功能 项目地址: https://gitcode.com/open-source-…

作者头像 李华
网站建设 2026/10/30 17:02:52

构建高性能量子计算容器的7个关键技术点(稀缺实战经验曝光)

第一章:量子计算容器化的核心挑战将量子计算与容器化技术结合,是推动量子应用工程化部署的关键路径。然而,由于量子计算本身的特殊性,其在容器化过程中面临诸多技术障碍,涉及资源管理、环境隔离和硬件交互等多个层面。…

作者头像 李华
网站建设 2026/10/30 20:14:26

测试资源分配的挑战与机遇

在软件测试领域,资源分配始终是项目成功的关键因素。传统方法依赖人工经验,往往面临测试环境、人力和时间资源的浪费,导致覆盖率不足或成本超支。随着人工智能和机器学习技术的兴起,智能优化为测试资源分配提供了新思路。本文旨在…

作者头像 李华