【精选优质专栏推荐】
- 《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']然后重新运行其余部分。在聚类之前尝试不同的特征选择,并检查轮廓系数分析的结果在不同聚类数量的选择下是否保持一致或发生变化。
总结
本文提供了对聚类算法中一种标准聚类质量指标——轮廓系数的简洁且实用的理解,并展示了如何使用它来批判性地分析聚类结果。