轮廓系数是评估聚类质量的内部指标,取值范围为[-1,1],值越接近1表示聚类效果越好,接近0说明簇间边界模糊,负值表明样本可能被错误分配;它适用于比较不同聚类算法或参数(如kmeans中n_clusters)的效果,需同时输入特征矩阵x和聚类标签labels,要求至少两个簇且每簇含多于一个样本,常用于辅助选择最优簇数,但不适用于dbscan等密度型聚类的直接评估。

轮廓系数是什么,什么时候该用它
轮廓系数(silhouette_score)是评估聚类质量的常用指标,取值范围在 -1 到 1 之间:越接近 1 表示聚类越合理,接近 0 表示簇间边界模糊,负值说明样本可能被分到了错误的簇。它适合用于已知簇数量、想比较不同聚类算法或不同 n_clusters 设置效果的场景——但不适用于层次聚类结果或密度型聚类(如 DBSCAN)的直接评估,因为后者簇形状不规则,距离假设不成立。
怎么调用 silhouette_score 计算单次聚类得分
必须同时提供原始特征数据和对应聚类标签,不能只传标签。常见错误是误把聚类模型输出的 labels_ 直接当“真值”喂进去——它不是真实标签,只是模型划分结果,silhouette_score 正是基于这些标签和原始数据点间距离计算的。
-
silhouette_score(X, labels)中X必须是二维数组(n_samples × n_features),labels是长度为n_samples的一维整数数组 - 默认使用欧氏距离;若数据量大(>10k 样本),建议设
sample_size=1000加速,否则计算复杂度为 O(n²) - 如果
labels中只有一个簇(所有值相同),会抛出ValueError: Number of clusters must be at least 2
示例:
from sklearn.metrics import silhouette_score from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3, random_state=42).fit(X) score = silhouette_score(X, kmeans.labels_)
如何用 silhouette_score 选最优 n_clusters
轮廓系数本身不决定“最佳簇数”,只是辅助判断工具。实际操作中需遍历多个 n_clusters 值,对每个拟合结果计算得分,再观察变化趋势——但要注意:得分最高不一定代表业务上最合理,尤其当数据天然存在强偏斜或噪声时,最高分可能出现在过拟合的簇数上。
- 建议从
n_clusters=2开始试,上限不超过len(X) // 2,避免单点成簇干扰计算 - 配合
silhouette_samples查看每个样本的局部轮廓值,识别哪些点拖累了整体得分 - 注意标准化影响:未缩放的特征(比如身高 cm 和收入 元混用)会导致距离失真,
silhouette_score结果不可靠
为什么有时得到负的轮廓系数
负值说明至少有部分样本离“隔壁簇”的中心比离自己簇中心还近,典型原因包括:n_clusters 设得过大、数据本身不适合球形簇假设、特征未归一化、或存在明显异常值。
- 检查
labels是否真有多个簇(len(set(labels)) > 1) - 用
StandardScaler或MinMaxScaler预处理X,再重跑聚类和评估 - 可视化前两主成分上的聚类结果,肉眼确认簇是否严重重叠或拉长
- 换用
DBSCAN或AgglomerativeClustering对比——轮廓系数对非凸簇不敏感,容易给出误导性高分
真正难的不是算出一个数字,而是理解这个数字在当前数据分布和业务目标下的意义。比如客户分群中,0.4 的轮廓系数可能比 0.6 更实用,因为前者对应可解释、易运营的三类人群,后者可能是算法强行拆出的五类细微差异群体。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











