张芷铭的个人博客

轮廓系数和 Calinski-Harabasz 指数用于评估聚类效果,判断数据点是否"内紧外松"。

核心指标对比

指标核心思想公式范围最佳值
轮廓系数综合考察样本与自身簇紧密度 $a$ 和最近其他簇分离度 $b$$s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))}$[-1, 1]接近 1
CH 指数簇间离散度与簇内离散度的比率$CH = \frac{B(k)/(k-1)}{W(k)/(n-k)}$$[0, +\infty)$越大越好

轮廓系数解读

数值范围含义
接近 1$b \gg a$,点离自己簇近,离其他簇远,聚类合理
接近 0$a \approx b$,点处于两簇边界,归属不明确
小于 0$a > b$,点离其他簇更近,可能分配错误

Calinski-Harabasz 指数

该指数越高,意味着簇间差异大、簇内差异小,聚类效果越好。计算效率通常高于轮廓系数。

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from sklearn.metrics import silhouette_score, calinski_harabasz_score

def evaluate_clustering(features, labels):
    # 排除噪声点
    valid_mask = labels >= 0
    valid_features = features[valid_mask]
    valid_labels = labels[valid_mask]

    if len(np.unique(valid_labels)) < 2:
        return {}

    scores = {}
    scores['silhouette_score'] = silhouette_score(valid_features, valid_labels)
    scores['calinski_harabasz_score'] = calinski_harabasz_score(valid_features, valid_labels)

    return scores

代码设计要点:

  • 有效性检查:至少需要两个不同的簇
  • 异常处理:计算失败时返回默认值

应用场景

用途方法
横向比较用同一指标比较不同聚类算法(K-Means、DBSCAN 等)
参数调优尝试不同参数(如 K 值),选择得分最高的配置

实践建议

  • 轮廓系数能反映单个样本聚类情况,结果直观
  • CH 指数计算效率高,适合大规模数据
  • 结合多个指标综合评估,避免单一指标偏差

Comments