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吗?