使用Calinski-Harabasz指数确定最佳聚类数:原理与Python实战

1次阅读
没有评论

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

image.webp

1. 聚类评估指标概览

在无监督学习的聚类分析中,确定最佳聚类数 (k) 是核心挑战。常见的评估方法可分为三类:

使用 Calinski-Harabasz 指数确定最佳聚类数:原理与 Python 实战

  • 内部指标:仅利用样本间距离计算(如 CH 指数、轮廓系数)
  • 外部指标:需真实标签对比(如调整兰德指数)
  • 稳定性指标:通过数据扰动评估一致性

我们重点对比三种内部指标的特点:

  1. Calinski-Harabasz(CH)指数:适合球形簇,计算速度最快
  2. 轮廓系数:适应任意形状簇,但计算复杂度高
  3. 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 数据集)

  1. 数据预处理:虽然 iris 特征量纲相近,但标准化仍是好习惯

    from sklearn.preprocessing import StandardScaler
    X_scaled = StandardScaler().fit_transform(X)

  2. K 值搜索:尝试 k = 2 到 7 的聚类效果

  3. 结果解读

  4. 当 k = 3 时 CH 值达到峰值(约 560)
  5. 与 iris 真实类别数一致
  6. k>3 后 CH 值持续下降,说明过度聚类

5. 适用条件与常见陷阱

适用场景

  • 假设数据呈 凸分布(如球形、椭球形簇)
  • 各簇密度相近且大小均匀

典型误用

  1. 非凸簇结构:如环形分布会给出错误 k 值
  2. 忽略标准化:量纲差异会导致距离计算失真
  3. 多峰值 CH 曲线:需结合业务判断次优解

6. 避坑指南

  1. 数据预处理
  2. 必须做标准化(Z-score 或 MinMax)
  3. 高维数据考虑 PCA 降维

  4. 多峰值决策

  5. 检查 k 对应聚类结果的可解释性
  6. 结合轮廓系数等指标交叉验证

  7. 噪声点处理

  8. CH 值对噪声敏感,可先使用 DBSCAN 去噪
  9. 或用鲁棒性更强的指标如 DBCV

7. 思考题延伸

当数据存在噪声点时:
偏差表现 :噪声会导致 W(k) 异常增大,CH 值被低估
改进方案
1. 使用密度聚类预处理
2. 采用噪声感知的加权 CH 计算
3. 换用基于密度的评估指标

通过本文,您应该已经掌握:
– CH 指数的计算原理与数学含义
– 完整的 Python 实现方案
– 实际应用中的注意事项

下一步可以尝试在 UCI 的其他数据集上实践,观察不同分布数据下的 CH 指标表现。

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