一、聚类如何评估
聚类效果的评估可以通过多种指标来进行,这些指标通常分为内部评估指标和外部评估指标。聚类评估指标的选择依赖于具体的数据和业务需求。例如,如果数据的类别标签未知,则应使用内部评估指标;如果类别标签已知,则可以使用外部评估指标。在实际应用中,可以同时计算多个指标来评估聚类效果。
二、常见聚类评估指标
1、内部评估指标
内部评估指标大都通过比较类间差异和类内差异来判断聚类效果的好坏,只是不同指标的计算方式不一样。
(1)轮廓系数
轮廓系数(Silhouette Coefficient)结合了聚类的凝聚度和分离度两个因素,取值范围是[-1, 1],值越大表示聚类效果越好。对于给定的样本点i,轮廓系数的计算涉及到两个部分:
(a)凝聚度(Cohesion):计算样本点i与其所在簇中其他点的平均距离,记为a(i)。a(i)越小,表示样本点与其簇内的其他点越紧密。
(b)分离度(Separation):计算样本点i与最近的其他簇中所有点的平均距离,这里的“最近的其他簇”是通过比较样本i到除其所在簇之外的所有其他簇中样本的平均距离的最小值得到的,记为b(i)。b(i)越大,表示样本点与其最近的其他簇分离得越好。
由上,样本点i的轮廓系数s(i)计算公式为:
其中,当a(i)<b(i)时,s(i)接近1,表示聚类效果好;当a(i)=b(i)时,s(i)为0,表示聚类效果一般;当a(i)>b(i)时,s(i)接近-1,表示聚类效果差。所有样本点的轮廓系数的平均值即为聚类结果的总体轮廓系数,显然,当数据量大的时候,轮廓系数的计算非常耗时。
(2)Calinski-Harabasz 指数(CH)
Calinski-Harabasz 指数(CH)通过比较簇内散度和簇间散度的比值来评估聚类的好坏,取值范围是[-1, 1],值越大表示聚类效果越好。Calinski-Harabasz 指数基于以下原理:
(a)簇内紧密度:好的聚类应该具有较小的簇内距离,即同一簇内的数据点应该彼此接近。
(b)簇间分离度:好的聚类应该具有较大的簇间距离,即不同簇的数据点应该彼此远离。
由上,计算公式为:
其中,B(K)是类间散度的总和,计算所有簇质心与数据集中心之间的距离平方和;W(K)是类内散度的总和,计算每个簇内数据点与簇质心之间的距离平方和;k是簇的数量;n是数据点的总数。当聚类数量k较大时,CH指数可能会失去意义,因为类内散度会变得非常小,导致CH值异常增大。
(3)Davies-Bouldin Index(DB)
Davies-Bouldin Index(DB)基于聚类内部的紧密度和聚类之间的分离度来进行评估。DB指数取值范围是0到正无穷,值越小表示聚类效果越好,即聚类内部的数据点更紧密,而不同聚类之间更分散。DB指数的计算涉及到以下概念:
(a)类内距离平均值():对于每个聚类,计算其内部所有数据点到聚类中心的平均距离。
(b)聚类中心之间的距离():对于每一对聚类,计算它们中心点之间的距离。
(c)相似度比值():对于每一对聚类i和j,计算它们之间的相似度,公式为。
由此,DB指数的计算公式为:
其中,k是聚类的数量。这个公式表示对于每个聚类i,找到与其最相似的聚类j(即最大的聚类j),然后计算所有这些最相似聚类对的的平均值。
2、外部评估指标
外部评估指标依赖真实标签,必须要有真实标签才能进行计算。
(1)Adjusted Rand Index (ARI)
Adjusted Rand Index (ARI) 通过比较聚类结果与真实标签之间的相似性来衡量聚类的质量。ARI 考虑了随机聚类的期望效果,因此即使在随机聚类的情况下,其值也接近于零。ARI的取值范围是[−1,1],值越接近1,表示聚类结果与真实标签越一致,即聚类效果越好;值为0表示聚类结果与随机聚类相似;值为负数则表示聚类结果比随机聚类还差。
其中,E(RI)是RI的期望值,max(RI)是RI的最大可能值,a是在聚类结果和真实标签中都在同一类别的数据对数量,b是在真实标签中在同一类别但在聚类结果中不在的数据对数量,c是在真实标签中不在同一类别但在聚类结果中在的数据对数量,d是在聚类结果和真实标签中都不在同一类别的数据对数量。
(2)纯度(Purity)
纯度(Purity)衡量的是聚类结果与实际数据标签的一致性。纯度的计算基于这样一个假设:一个簇中最多的类别可以代表该簇。因此,纯度计算的是所有簇中“正确分类”的样本数占总样本数的比例。纯度的取值范围是[0, 1]。值越接近1,表示聚类结果与真实标签的一致性越高,即聚类效果越好;值越接近0,表示聚类效果越差,计算公式如下:
其中,是第k个簇,是真实的第j个类别,N是样本总数,是簇与真实类别交集中的样本数。具体来说,对于每个簇,找到其中样本数最多的类别并计算属于这个类别的样本数,将所有簇中的样本数最大值相加,最后将总和除以样本总数N。
三、python应用
from sklearn.metrics import silhouette_score, calinski_harabasz_score, davies_bouldin_score, adjusted_rand_score
from sklearn.metrics import confusion_matrix
from sklearn import metrics
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# 生成模拟数据
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 执行KMeans聚类
kmeans = KMeans(n_clusters=4, random_state=0).fit(X)
y_pred = kmeans.labels_
# 计算轮廓系数
silhouette_avg = silhouette_score(X, y_pred)
print(f"轮廓系数: {silhouette_avg}")
# 计算CH指数
ch_score = calinski_harabasz_score(X, y_pred)
print(f"CH指数: {ch_score}")
# 计算DB指数
db_score = davies_bouldin_score(X, y_pred)
print(f"DB指数: {db_score}")
# 计算ARI
ari_score = adjusted_rand_score(y_true, y_pred)
print(f"ARI: {ari_score}")
# 计算纯度
conf_mat = confusion_matrix(y_true, y_pred)
sum_diag = np.trace(conf_mat)
sum_off_diag = np.sum(conf_mat) - sum_diag
purity_score = sum_diag / np.sum(conf_mat)
print(f"纯度: {purity_score}")
四、总结
聚类在大部分的时候都是在无标签数据上进行的,因此对于不需要真实标签的聚类内部评估指标的掌握应当更为牢固,且每个指标有其特点,应当根据实际情况进行判断,例如CH指数和DB指数都适用于需要衡量聚类算法性能的情况,特别是当数据集的簇结构明显时,而轮廓系数对于簇结构非凸的数据,可能不会给出准确的聚类评估。当数据集有标签时,笔者更推荐使用分类方法而非聚类。