共计 1940 个字符,预计需要花费 5 分钟才能阅读完成。
1. 聚类评估指标概览
在无监督学习的聚类分析中,确定最佳聚类数 (k) 是核心挑战。常见的评估方法可分为三类:

- 内部指标:仅利用样本间距离计算(如 CH 指数、轮廓系数)
- 外部指标:需真实标签对比(如调整兰德指数)
- 稳定性指标:通过数据扰动评估一致性
我们重点对比三种内部指标的特点:
- Calinski-Harabasz(CH)指数:适合球形簇,计算速度最快
- 轮廓系数:适应任意形状簇,但计算复杂度高
- Davies-Bouldin Index(DBI):对簇密度差异敏感
2. CH 指数数学原理
CH 指数本质是 组间离散度与组内离散度的比值,计算公式为:
CH(k) = [B(k)/(k-1)] / [W(k)/(n-k)]
其中:
– B(k):所有簇中心与全局中心的距离平方和(组间离散)
– W(k):各样本与其簇中心的距离平方和(组内离散)
– n:样本总数
物理意义:值越大说明簇间距离大、簇内距离小,聚类效果越好。
3. Python 代码实现
3.1 sklearn 现成方案
from sklearn.metrics import calinski_harabasz_score
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
# 加载数据
iris = load_iris()
X = iris.data
# 遍历 k 值计算 CH 分数
ch_scores = []
k_range = range(2, 8)
for k in k_range:
kmeans = KMeans(n_clusters=k, random_state=42)
labels = kmeans.fit_predict(X)
score = calinski_harabasz_score(X, labels)
ch_scores.append(score)
# 可视化
import matplotlib.pyplot as plt
plt.plot(k_range, ch_scores, 'bo-')
plt.xlabel('Number of clusters')
plt.ylabel('Calinski-Harabasz Score')
plt.show()
3.2 手动实现版
import numpy as np
def manual_ch_score(X, labels):
n = len(X)
k = len(np.unique(labels))
global_center = np.mean(X, axis=0)
# 计算组内离散度 W(k)
W = 0
for i in range(k):
cluster_points = X[labels == i]
cluster_center = np.mean(cluster_points, axis=0)
W += np.sum((cluster_points - cluster_center)**2)
# 计算组间离散度 B(k)
B = 0
for i in range(k):
cluster_points = X[labels == i]
cluster_center = np.mean(cluster_points, axis=0)
B += len(cluster_points) * np.sum((cluster_center - global_center)**2)
return (B/(k-1)) / (W/(n-k))
4. 实战演示(Iris 数据集)
-
数据预处理:虽然 iris 特征量纲相近,但标准化仍是好习惯
from sklearn.preprocessing import StandardScaler X_scaled = StandardScaler().fit_transform(X) -
K 值搜索:尝试 k = 2 到 7 的聚类效果
-
结果解读:
- 当 k = 3 时 CH 值达到峰值(约 560)
- 与 iris 真实类别数一致
- k>3 后 CH 值持续下降,说明过度聚类
5. 适用条件与常见陷阱
适用场景
- 假设数据呈 凸分布(如球形、椭球形簇)
- 各簇密度相近且大小均匀
典型误用
- 非凸簇结构:如环形分布会给出错误 k 值
- 忽略标准化:量纲差异会导致距离计算失真
- 多峰值 CH 曲线:需结合业务判断次优解
6. 避坑指南
- 数据预处理:
- 必须做标准化(Z-score 或 MinMax)
-
高维数据考虑 PCA 降维
-
多峰值决策:
- 检查 k 对应聚类结果的可解释性
-
结合轮廓系数等指标交叉验证
-
噪声点处理:
- CH 值对噪声敏感,可先使用 DBSCAN 去噪
- 或用鲁棒性更强的指标如 DBCV
7. 思考题延伸
当数据存在噪声点时:
– 偏差表现 :噪声会导致 W(k) 异常增大,CH 值被低估
– 改进方案:
1. 使用密度聚类预处理
2. 采用噪声感知的加权 CH 计算
3. 换用基于密度的评估指标
通过本文,您应该已经掌握:
– CH 指数的计算原理与数学含义
– 完整的 Python 实现方案
– 实际应用中的注意事项
下一步可以尝试在 UCI 的其他数据集上实践,观察不同分布数据下的 CH 指标表现。
正文完
