《sklearn机器学习——聚类性能指标》Calinski-Harabaz 指数
Calinski-Harabaz 指数
简介
Calinski-Harabaz指数,也被称为方差比准则(Variance Ratio Criterion),是一种用于评估聚类结果质量的指标。它通过计算簇间离散度与簇内离散度之比来衡量聚类的有效性。简而言之,Calinski-Harabaz指数越高,说明数据集中的簇越明显,即簇内的样本相似度高,而簇间的差异性大。
其计算公式为:
[ CH(k) = \frac{B(k)/(k-1)}{W(k)/(n-k)} ]
其中:
- ( B(k) ) 是簇间离散度矩阵的迹。
- ( W(k) ) 是簇内离散度矩阵的迹。
- ( k ) 表示簇的数量。
- ( n ) 表示样本总数。
优点
- 简单易用:Calinski-Harabaz指数的计算方法相对简单,易于实现。
- 解释性强:得分越高表示聚类效果越好,这使得该指数在理解上比较直观。
- 不需要真实标签:与其他一些需要真实标签的评价指标不同,Calinski-Harabaz指数可以在没有真实标签的情况下使用。
缺点
- 对簇形状敏感:Calinski-Harabaz指数倾向于选择球形且大小相等的簇,对于其他形状的簇可能不是最优选择。
- 不适用于复杂数据结构:对于具有复杂几何形状或密度变化的数据集,该指数可能无法准确反映真实的聚类效果。
- 偏向于较大簇数量:在某些情况下,Calinski-Harabaz指数可能会偏向于更多的簇数量,即使这些簇的实际意义不大。
使用场景
- 当你希望快速评估不同的聚类算法或者同一算法下不同参数设置的效果时,可以考虑使用Calinski-Harabaz指数。
- 在探索性数据分析阶段,特别是在不知道最佳簇数量的情况下,Calinski-Harabaz指数可以帮助识别出簇数量的合理范围。
- 对于那些簇形状接近圆形、大小均匀分布的数据集,Calinski-Harabaz指数可以作为一个有效的评估标准。
需要注意的是,在应用Calinski-Harabaz指数时,应该考虑到它的局限性,并结合具体的应用背景和其他评价指标一起使用,以获得更加全面和准确的评估结果。
sklearn.metrics.calinski_harabaz_score函数
函数参数
-
X : array-like, shape (n_samples, n_features)
- 数据集,其中
n_samples
是样本数量,n_features
是特征数量。
- 数据集,其中
-
labels : array-like, shape (n_samples,)
- 每个样本所属簇的标签数组。
labels[i]
表示第i
个样本所属的簇编号。
- 每个样本所属簇的标签数组。
返回值
- score : float
- 返回 Calinski-Harabaz 得分。得分越高,表示聚类效果越好。
内部数学形式
Calinski-Harabaz 分数(CH分数)是通过下面的公式计算得出的:
CH=B(k)/(k−1)W(k)/(n−k)CH = \frac{B(k) / (k - 1)}{W(k) / (n - k)}CH=W(k)/(n−k)B(k)/(k−1)
这里,
- ( B(k) ) 是簇间离散度矩阵的迹,定义为簇中心与整体数据集中心之间的距离平方和乘以每个簇中的样本数。
- ( W(k) ) 是簇内离散度矩阵的迹,定义为所有簇内样本到其相应簇中心的距离平方和。
- ( k ) 是簇的数量。
- ( n ) 是样本总数。
简单来说,( B(k) ) 衡量的是簇之间分离程度,而 ( W(k) ) 衡量的是簇内部的紧密程度。CH 分数越高,说明簇间的分离度越高,同时簇内的紧密度也越理想。
使用示例
from sklearn.metrics import calinski_harabasz_score
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import numpy as np# 1. 生成示例数据
# 创建一个包含3个簇的合成数据集
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=0.9, center_box=(-10.0, 10.0), shuffle=True, random_state=42)# 2. 执行聚类
# 使用K-Means算法,指定聚类数量为3
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
cluster_labels = kmeans.fit_predict(X)# 3. 计算Calinski-Harabasz指数
ch_score = calinski_harabasz_score(X, cluster_labels)# 4. 输出结果
print(f"Calinski-Harabasz 指数: {ch_score:.2f}")
输出
Calinski-Harabasz 指数: 6402.60
代码说明
make_blobs
: 生成一个具有预设簇结构的二维数据集,便于演示。KMeans
: 使用 K-Means 算法进行聚类。n_init=10
确保算法运行10次并选择最优结果。calinski_harabasz_score(X, cluster_labels)
:X
: 输入的数据特征矩阵。cluster_labels
: 聚类算法产生的标签。- 该函数计算并返回 Calinski-Harabasz 指数。
- 输出: 打印出计算得到的指数值。