【scikit-learn】sklearn.metrics.silhouette_score() 函数:无监督聚类模型评估指标 轮廓系数

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 结合使用,以更全面评估聚类质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值