聚类算法本质上是无监督学习方法。然而,在本例中,为合成的聚类分配了类别标签,这使得可以使用利用这些“监督”真实信息的评估指标来量化所产生聚类的质量。例如,V-measure(完整性和同质性的调和平均值)、Rand指数(衡量数据点对根据聚类算法结果和真实类别分配一致分组的频率)、调整后的Rand指数(ARI,一种机会调整的Rand指数,使得随机聚类分配的预期ARI为0.0)、互信息(MI,一个信息论度量,量化两个标签的依赖性)等。
定义了一系列指标来评估聚类算法的性能。这些指标包括:
首先定义了一个函数,用于创建均匀分布的随机标签。然后,使用这个函数创建了一组固定的真实标签(labels_a),并在n_clusters变化时,对几组随机的“预测”标签(labels_b)进行评分,以评估给定指标在给定n_clusters下的变异性。
from sklearn import metrics
score_funcs = [
("V-measure", metrics.v_measure_score),
("Rand index", metrics.rand_score),
("ARI", metrics.adjusted_rand_score),
("MI", metrics.mutual_info_score),
("NMI", metrics.normalized_mutual_info_score),
("AMI", metrics.adjusted_mutual_info_score),
]
在这个例子中,将类别数量(真实聚类数量)设置为n_classes=10。聚类数量在n_clusters_range提供的值之间变化。
import numpy as np
rng = np.random.RandomState(0)
def random_labels(n_samples, n_classes):
return rng.randint(low=0, high=n_classes, size=n_samples)
def fixed_classes_uniform_labelings_scores(score_func, n_samples, n_clusters_range, n_classes, n_runs=5):
scores = np.zeros((len(n_clusters_range), n_runs))
labels_a = random_labels(n_samples=n_samples, n_classes=n_classes)
for i, n_clusters in enumerate(n_clusters_range):
for j in range(n_runs):
labels_b = random_labels(n_samples=n_samples, n_classes=n_clusters)
scores[i, j] = score_func(labels_a, labels_b)
return scores
在第一个实验中,发现Rand指数在n_clusters > n_classes时趋于饱和。其他未调整的指标,如V-Measure,显示出聚类数量和样本数量之间的线性依赖关系。而调整后的机会指标,如ARI和AMI,显示出围绕0.0的均值分数的一些随机变化,与样本和聚类的数量无关。
在本节中,定义了一个类似的函数,使用多个指标来评分两个均匀分布的随机标签。在这种情况下,类别数量和分配的聚类数量对于n_clusters_range中的每个可能值都是匹配的。
def uniform_labelings_scores(score_func, n_samples, n_clusters_range, n_runs=5):
scores = np.zeros((len(n_clusters_range), n_runs))
for i, n_clusters in enumerate(n_clusters_range):
for j in range(n_runs):
labels_a = random_labels(n_samples=n_samples, n_classes=n_clusters)
labels_b = random_labels(n_samples=n_samples, n_classes=n_clusters)
scores[i, j] = score_func(labels_a, labels_b)
return scores
在这个例子中,使用n_samples=100来展示拥有与样本数量相似或相等的聚类数量的效果。
n_samples = 100
n_clusters_range = np.linspace(2, n_samples, 10).astype(int)
观察到与第一个实验相似的结果:调整后的机会指标保持在接近零的水平,而其他指标随着更细粒度的标签分配而趋向于变大。随机标签的平均V-measure随着聚类数量接近用于计算该度量的总样本数量而显著增加。此外,原始的互信息没有上限,其尺度取决于聚类问题的维度和真实类别的基数。这就是为什么曲线会超出图表的原因。
因此,只有调整后的机会指标可以安全地用作共识指数,以评估给定k值下各种重叠子样本数据集的聚类算法的平均稳定性。未调整的聚类评估指标可能会产生误导,因为它们对于细粒度的标签分配输出大值,人们可能会认为标签捕获了有意义的组,而它们可能完全是随机的。特别是,这种未调整的指标不应用来比较输出不同聚类数量的不同聚类算法的结果。