Python 计算两个聚类结果的聚类精度
假设我有两个聚类结果,如下所示:Python 计算两个聚类结果的聚类精度,python,cluster-analysis,Python,Cluster Analysis,假设我有两个聚类结果,如下所示: clustering = [[8, 9, 10, 11], [14, 13, 4, 7, 6, 12, 5, 15], [1, 2, 0, 3]] correct_clustering = [[2, 8, 10, 0, 15], [12, 13, 9, 14], [11, 3, 5, 1, 4, 6, 7]] 如何将聚类中包含的结果与正确聚类中包含的结果进行比较。我想要一些介于0和1之间的数字。我在考虑计算在同一个簇中正确聚集在一起的对的分数。但是想不出一个编
clustering = [[8, 9, 10, 11], [14, 13, 4, 7, 6, 12, 5, 15], [1, 2, 0, 3]]
correct_clustering = [[2, 8, 10, 0, 15], [12, 13, 9, 14], [11, 3, 5, 1, 4, 6, 7]]
如何将
聚类
中包含的结果与正确聚类
中包含的结果进行比较。我想要一些介于0和1之间的数字。我在考虑计算在同一个簇中正确聚集在一起的对的分数。但是想不出一个编程的方法来解决这个问题。您可以使用sklearn
中的调整后的评分:
from sklearn.metrics import adjusted_rand_score
clustering = sorted((i, num) for num, lst in enumerate(clustering) for i in lst)
clustering = [i for _, i in clustering]
# [2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]
correct_clustering = sorted((i, num) for num, lst in enumerate(correct_clustering) for i in lst)
correct_clustering = [i for _, i in correct_clustering]
# [0, 2, 0, 2, 2, 2, 2, 2, 0, 1, 0, 2, 1, 1, 1, 0]
ari = adjusted_rand_score(correct_clustering, clustering)
# -0.012738853503184737
该函数返回介于1和-1之间的值,因此要获得介于0和1之间的值,需要重新缩放:
ari_scaled = (ari + 1) / 2
# 0.49363057324840764
最佳实践措施实际上是基于成对计数
特别是,调整后的兰德指数(ARI)是这里的标准衡量标准
实际上,您不需要计算对,但是可以使用二项式,简单地(n*(n-1))>>2
计算集合中的对数
对于每个集群和每个集群交叉点,您都需要这个
所有交点的结果都是聚合的,很容易看出这对簇的排列(以及簇标签)是不变的。兰德指数是预测两个对象a、b是在同一簇中还是在不同簇中的准确性。ARI通过调整偶然性来改善这一点:在一个非常不平衡的问题中,随机结果可以获得较高的准确度,但在ARI中,平均得分接近0。使用兰德指数:
import numpy as np
from scipy.special import comb
def rand_index_score(clusters, classes):
tp_plus_fp = comb(np.bincount(clusters), 2).sum()
tp_plus_fn = comb(np.bincount(classes), 2).sum()
A = np.c_[(clusters, classes)]
tp = sum(comb(np.bincount(A[A[:, 0] == i, 1]), 2).sum()
for i in set(clusters))
fp = tp_plus_fp - tp
fn = tp_plus_fn - tp
tn = comb(len(A), 2) - tp - fp - fn
return (tp + tn) / (tp + fp + fn + tn)
clusters = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
classes = [0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 2, 1, 0, 2, 2, 2, 0]
rand_index_score(clusters, classes)
0.6764705882352942
这正是我想要的,非常感谢!这不是正确的方法。因为没有理由假设集群的排序方式相同。查阅文献,了解为什么通常的衡量标准是ARI。@Anony Mouse你是对的。您可以演示如何在Python中为多个集群实现ARI吗?