共计 2273 个字符,预计需要花费 6 分钟才能阅读完成。
聚类评估的背景和痛点
在无监督学习中,聚类是一种常用的数据分析技术。然而,确定最佳聚类数目一直是一个具有挑战性的问题。传统方法如肘部法则依赖主观判断,缺乏定量依据,导致不同分析人员可能得出不同结论。这种主观性不仅影响结果的可重复性,也可能导致次优的聚类方案。

CH 指数与其他评估指标的对比
评估聚类质量的指标主要分为两类:内部评估和外部评估。由于实际应用中往往缺乏真实标签,内部评估指标显得尤为重要。常见的内部评估指标包括:
- 轮廓系数 (Silhouette Coefficient):衡量样本与同簇和其他簇的距离,取值在 - 1 到 1 之间
- DB 指数 (Davies-Bouldin Index):基于簇内离散度和簇间分离度,值越小越好
- CH 指数 (Calinski-Harabasz Index):基于簇间离散度与簇内离散度的比值,值越大越好
相比之下,CH 指数计算效率高,对凸形簇特别有效,且无需像轮廓系数那样计算所有样本对的距离,在处理大数据集时优势明显。
CH 指数的数学原理和计算步骤
CH 指数的计算公式为:
CH(k) = [B(k)/(k-1)] / [W(k)/(n-k)]
其中:
– B(k) 是簇间离散度矩阵的迹
– W(k) 是簇内离散度矩阵的迹
– n 是样本总数
– k 是当前聚类数目
计算步骤:
- 计算所有簇的中心点(全局质心)
- 计算每个簇的质心
- 计算簇间离散度 B(k):各簇质心与全局质心的距离平方和,乘以该簇样本数
- 计算簇内离散度 W(k):所有样本与其所属簇质心的距离平方和
- 代入公式计算 CH 指数
Python 实现代码
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabasz_score
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np
# 生成模拟数据
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)
# 尝试不同的 k 值
k_range = range(2, 10)
ch_scores = []
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)
print(f"k={k}, CH 指数 ={score:.2f}")
# 可视化结果
plt.figure(figsize=(10, 6))
plt.plot(k_range, ch_scores, 'bo-')
plt.xlabel('聚类数目 k')
plt.ylabel('Calinski-Harabasz 指数')
plt.title('不同 k 值对应的 CH 指数')
plt.grid(True)
plt.show()
# 找出最佳 k 值
best_k = k_range[np.argmax(ch_scores)]
print(f"最佳聚类数目为: {best_k}")
实际数据集应用示例
我们使用 Iris 数据集进行实际测试:
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
# 计算不同 k 值的 CH 指数
k_range = range(2, 8)
ch_scores = []
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)
print(f"k={k}, CH 指数 ={score:.2f}")
best_k = k_range[np.argmax(ch_scores)]
print(f"Iris 数据集最佳聚类数目为: {best_k}")
运行结果会显示 CH 指数在 k = 3 时达到最大值,这与 Iris 数据集的实际类别数一致。
使用 CH 指数的注意事项和最佳实践
-
适用场景 :CH 指数最适合凸形簇和方差相近的簇。对于非凸形或不规则簇,可能需要结合其他指标评估。
-
数据预处理 :务必对数据进行标准化处理,确保各特征具有相同尺度,否则距离计算会有偏差。
-
k 值范围 :尝试的 k 值范围应合理,太小会忽略真实结构,太大会导致过拟合。一般从 2 开始,不超过样本数的平方根。
-
多次运行 :K-means 等算法受初始质心影响,建议多次运行取平均值。
-
结合可视化 :虽然 CH 指数提供了量化评估,但数据可视化仍有助于验证结果合理性。
-
异常值处理 :异常值可能显著影响 CH 指数,必要时应先进行异常值检测和处理。
总结和延伸思考
CH 指数是一种高效、直观的聚类评估方法,特别适合作为确定 k 值的初始筛选工具。它的计算复杂度相对较低,适用于中等规模数据集。然而,任何单一指标都有其局限性:
- 对于密度差异大的簇可能表现不佳
- 不能很好地识别非凸形簇
- 随着 k 增加,指数值会自然下降,可能掩盖真实的 ” 局部最优 ”k 值
建议读者在自己的数据集上尝试该方法,同时思考以下问题:
- 当 CH 指数曲线没有明显的峰值时,如何解释?
- 对于高维数据,CH 指数是否仍然可靠?
- 如何结合领域知识来验证 CH 指数推荐的最佳 k 值?
通过实践和思考这些问题,您将更深入地理解聚类评估的复杂性和 CH 指数的适用边界。
