sklearn.metrics.silhouette_score
silhouette_score
(轮廓系数)是 sklearn.metrics
提供的一个 无监督聚类模型评估指标,用于衡量 聚类结果的紧密性和分离性,其取值范围为 [-1, 1]。
1. silhouette_score
计算原理
轮廓系数衡量每个样本的 平均轮廓系数,公式如下:
s
(
i
)
=
b
(
i
)
−
a
(
i
)
max
(
a
(
i
)
,
b
(
i
)
)
s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))}
s(i)=max(a(i),b(i))b(i)−a(i)
其中:
- s ( i ) s(i) s(i):样本 i i i 的轮廓系数
- a ( i ) a(i) a(i):样本 i i i 到 同簇内其他样本的平均距离(簇内相似度)
- b ( i ) b(i) b(i):样本 i i i 到 最近的其他簇的平均距离(簇间分离度)
解释
- s ( i ) s(i) s(i) 接近 1:表示样本 i i i 处于合适的簇中,簇内距离较小,簇间距离较大。
- s ( i ) s(i) s(i) 接近 0:表示样本 i i i 可能位于两个簇的边界,聚类效果不明显。
- s ( i ) s(i) s(i) 小于 0:表示样本 i i i 可能被错误地归类,属于错误的簇。
最终,silhouette_score
是所有样本轮廓系数的平均值,范围在 [-1, 1] 之间:
- 接近 1:说明 聚类效果好(紧密且分离良好)。
- 接近 0:说明 聚类不明显(可能簇之间有重叠)。
- 接近 -1:说明 样本被错误分类。
2. silhouette_score
代码示例
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成数据
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=1.0, random_state=42)
# 训练 K-Means 模型
kmeans = KMeans(n_clusters=3, random_state=42)
y_pred = kmeans.fit_predict(X)
# 计算轮廓系数
silhouette_avg = silhouette_score(X, y_pred)
print(f"Silhouette Score: {silhouette_avg:.2f}")
输出
Silhouette Score: 0.72
解释
Silhouette Score = 0.72
,说明 聚类效果较好,簇之间分离良好。
(1) 计算不同聚类数目的 silhouette_score
for n_clusters in [2, 3, 4, 5]:
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
y_pred = kmeans.fit_predict(X)
score = silhouette_score(X, y_pred)
print(f"聚类数 {n_clusters}, Silhouette Score: {score:.2f}")
示例输出
聚类数 2, Silhouette Score: 0.68
聚类数 3, Silhouette Score: 0.72
聚类数 4, Silhouette Score: 0.55
聚类数 5, Silhouette Score: 0.50
解释
- 最佳的
silhouette_score
出现在n_clusters = 3
,说明数据的最佳聚类数是 3。
3. silhouette_score
的参数
silhouette_score(X, labels, metric='euclidean', sample_size=None, random_state=None)
参数 | 说明 |
---|---|
X | 特征矩阵 |
labels | 聚类标签 |
metric | 距离度量方法(默认为 euclidean ,可选 manhattan , cosine 等) |
sample_size | 计算轮廓系数时使用的样本数量(默认 None ,即使用所有样本) |
random_state | 适用于 sample_size 不为空时,控制随机采样 |
4. silhouette_score
适用场景
- 无监督聚类模型评估(如 K-Means、DBSCAN、层次聚类)。
- 确定最佳聚类数目(通过不同
n_clusters
计算silhouette_score
)。 - 检测聚类是否存在重叠(值越低,说明聚类效果越差)。
5. silhouette_score
vs. 其他聚类评估指标
指标 | 计算方式 | 适用场景 |
---|---|---|
silhouette_score | 计算样本到簇中心的距离 | 适用于 无监督聚类,评估聚类质量 |
adjusted_rand_score (ARI) | 基于样本对一致性,调整随机性影响 | 适用于 有真实标签 的聚类评估 |
normalized_mutual_info_score (NMI) | 计算聚类和真实类别的互信息 | 适用于 不同类别数的聚类对比 |
davies_bouldin_score | 计算簇间和簇内的距离比率 | 适用于 无监督聚类,但易受数据分布影响 |
calinski_harabasz_score | 计算簇内紧密度与簇间分离度的比率 | 适用于 高维聚类评估 |
示例:
from sklearn.metrics import adjusted_rand_score, normalized_mutual_info_score, davies_bouldin_score
ari = adjusted_rand_score(y_true, y_pred)
nmi = normalized_mutual_info_score(y_true, y_pred)
dbi = davies_bouldin_score(X, y_pred)
print(f"ARI: {ari:.2f}")
print(f"NMI: {nmi:.2f}")
print(f"Davies-Bouldin Index: {dbi:.2f}")
6. 结论
silhouette_score
衡量 聚类结果的紧密性和分离性,适用于 无监督聚类任务。- 适用于 确定最佳聚类数,值越接近 1,说明聚类效果越好。
- 可与 ARI、NMI、Davies-Bouldin Score 结合使用,以更全面评估聚类质量。