轮廓系数和 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