使用Calinski-Harabasz指数确定最佳聚类数目的实战指南

1次阅读
没有评论

共计 2273 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

聚类评估的背景和痛点

在无监督学习中,聚类是一种常用的数据分析技术。然而,确定最佳聚类数目一直是一个具有挑战性的问题。传统方法如肘部法则依赖主观判断,缺乏定量依据,导致不同分析人员可能得出不同结论。这种主观性不仅影响结果的可重复性,也可能导致次优的聚类方案。

使用 Calinski-Harabasz 指数确定最佳聚类数目的实战指南

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 是当前聚类数目

计算步骤:

  1. 计算所有簇的中心点(全局质心)
  2. 计算每个簇的质心
  3. 计算簇间离散度 B(k):各簇质心与全局质心的距离平方和,乘以该簇样本数
  4. 计算簇内离散度 W(k):所有样本与其所属簇质心的距离平方和
  5. 代入公式计算 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 指数的注意事项和最佳实践

  1. 适用场景 :CH 指数最适合凸形簇和方差相近的簇。对于非凸形或不规则簇,可能需要结合其他指标评估。

  2. 数据预处理 :务必对数据进行标准化处理,确保各特征具有相同尺度,否则距离计算会有偏差。

  3. k 值范围 :尝试的 k 值范围应合理,太小会忽略真实结构,太大会导致过拟合。一般从 2 开始,不超过样本数的平方根。

  4. 多次运行 :K-means 等算法受初始质心影响,建议多次运行取平均值。

  5. 结合可视化 :虽然 CH 指数提供了量化评估,但数据可视化仍有助于验证结果合理性。

  6. 异常值处理 :异常值可能显著影响 CH 指数,必要时应先进行异常值检测和处理。

总结和延伸思考

CH 指数是一种高效、直观的聚类评估方法,特别适合作为确定 k 值的初始筛选工具。它的计算复杂度相对较低,适用于中等规模数据集。然而,任何单一指标都有其局限性:

  • 对于密度差异大的簇可能表现不佳
  • 不能很好地识别非凸形簇
  • 随着 k 增加,指数值会自然下降,可能掩盖真实的 ” 局部最优 ”k 值

建议读者在自己的数据集上尝试该方法,同时思考以下问题:

  1. 当 CH 指数曲线没有明显的峰值时,如何解释?
  2. 对于高维数据,CH 指数是否仍然可靠?
  3. 如何结合领域知识来验证 CH 指数推荐的最佳 k 值?

通过实践和思考这些问题,您将更深入地理解聚类评估的复杂性和 CH 指数的适用边界。

正文完
 0
评论(没有评论)