比较具有基本事实的聚类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比较具有基本事实的聚类相关的知识,希望对你有一定的参考价值。

[在将我的HAC聚类结果与手工标记文档的真实性进行比较时,我遇到了问题。

整个数据集由9k个文档组成,而真实数据为100;最后一个允许使用多标签,而聚类过程仅将文档分配给一个聚类。它们都被加载到熊猫数据框中。

集群

id      label
 0          1
 1          4
 2          9
     ....
9k          3

地面真理

id    label1    label2    label3    ...    labeln
 0         0         1         0                1
 1         1         0         1    ...         0
           .....
100        0         0         0    ......      0

一列中的'1'表示具有该ID的文档已分配给该标签(或那些标签)。

簇的数量等于标签的数量(由用户分配),比方说-> 14

现在我正在这样做:

    # computes all possible pairs
    def all_pairs(partition):
        return list(itertools.combinations(partition, 2))

    # main

    indexes = list(map(int, ground_truth['id'].values.tolist()))
    # reduce clusters_file matching only manually analyzed documents:
    reduced_df = clusters.loc[clusters['id'].isin(indexes), :]

    clusters_groups = reduced_df.groupby('label')
    clusters_k = len(clusters_groups)

    for label, df_group in clusters_groups:

        docs_in_cluster = df_group['id'].values.tolist()
        pairs_docs_in_cluster = all_pairs(docs_in_cluster)

        intersection_list = []

        for col in self.ground_truth.columns[1:]:

            # get pairs for this columns/label
            constraints = list(
                map(int, ground_truth.loc[ground_truth[col] == 1, 'id'].values.tolist())
            )
            pairs_constraints = all_pairs(constraints)

            # find sets intersection (of pairs) between current cluster and ground_truth
            intersection = list(set(pairs_constraints) & set(pairs_docs_in_cluster))

            if len(intersection) > 0:
                # concatenate with other labels from ground_truth
                intersection_list += intersection

        ratio = len(intersection_list) / len(pairs_docs_in_cluster) * 100
        print("Cluster: ", label, "[] elements".format(df_group.shape[0]),
              'matched  unique pairs'.format(len(intersection_list)), "--> :.2f %".format(ratio))

而且我得到类似的东西:

Automatic clustering: 8469 elements and k=14 clusters
Ground Truth: 107 elements and m=14 labels
    Cluster:  0 [29] elements matched 111 unique pairs --> 27.34 %
    Cluster:  1 [5] elements matched 1 unique pairs --> 10.00 %
    Cluster:  2 [1] elements matched 0 unique pairs --> 0.00 %
    Cluster:  3 [1] elements matched 0 unique pairs --> 0.00 %
    Cluster:  4 [9] elements matched 5 unique pairs --> 13.89 %
    Cluster:  5 [6] elements matched 2 unique pairs --> 13.33 %
    Cluster:  6 [13] elements matched 27 unique pairs --> 34.62 %
    Cluster:  7 [2] elements matched 0 unique pairs --> 0.00 %
    Cluster:  8 [4] elements matched 3 unique pairs --> 50.00 %
    Cluster:  9 [3] elements matched 0 unique pairs --> 0.00 %
    Cluster:  10 [2] elements matched 0 unique pairs --> 0.00 %
    Cluster:  11 [8] elements matched 2 unique pairs --> 7.14 %
    Cluster:  12 [6] elements matched 10 unique pairs --> 66.67 %
    Cluster:  13 [17] elements matched 29 unique pairs --> 21.32 %

这很糟糕,但是如果我检查了聚类结果,它们看起来并不那么糟糕。因此,我认为我的评估指标(比率计算)是错误的,但我真的看不到我的错误在哪里(如果有的话)。

答案
AMI或(调整后的共同信息)得分被重新调整,使得随机聚类得分为0。NMI(归一化共同信息)用于您拥有不同数量簇的情况,因此通常是集群社区。

两个度量值的范围都在0到1之间,其中0被认为是随机聚类,而1则完全符合基本事实。

还存在其他度量,例如F度量或纯度。

我不确定,为什么您的“基本事实”中存在许多不同的标签,但是您可以对这些标签进行多数表决以观察一个基本事实。

以上是关于比较具有基本事实的聚类的主要内容,如果未能解决你的问题,请参考以下文章

如何分析没有真实标签的聚类的完整性?

转载各种聚类算法的比较

聚类算法--DBSCAN

R语言中不同类型的聚类方法比较

DBSCAN聚类算法

第一节:基于网格的聚类算法概述