Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将集群与地面真相进行比较_Python_Cluster Analysis_Hierarchical Clustering - Fatal编程技术网

Python 将集群与地面真相进行比较

Python 将集群与地面真相进行比较,python,cluster-analysis,hierarchical-clustering,Python,Cluster Analysis,Hierarchical Clustering,在比较HAC聚类结果与手动标记文档的基本事实时,我遇到了一个问题 整个数据集由9k份文档组成,而基本事实为100份;最后一个允许使用多标签,而集群过程仅将文档分配给一个集群。 它们都被加载到一个数据帧中 集群 id label 0 1 1 4 2 9 .... 9k 3 基本事实 id label1 label2 label3 ... labeln 0

在比较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-措施或纯度


我不确定,为什么在你们的“基本事实”中有许多不同的标签,但也许你们可以对这些标签进行多数投票,以观察一个基本事实

你的基本真相有n列。这是因为n个人,他们手动标记他们吗?谢谢你的回答。我的教授给我的基本事实贴上了标签,他说每个文档的主题都是关于该领域的知识(实时系统文档),假设文档可以属于多个主题。你如何看待一个混淆矩阵的分析?如果你想到一个混淆矩阵,那么我会建议F测度(或者F1分数),因为这是精确和回忆之间的关系。但是因为我的GT是由100个文档组成的,所以我必须只考虑那些来自DataSet的文档吗?好吧,这对我来说还不清楚。你可以用你对其他真相进行聚类的相同方法对基本真相进行聚类。然后,您可以根据此测试集评估您的方法的集群性能。尽管如此,您需要确定n列中的哪一列是正确的。我试图解释:我有一个9k文档的语料库,在这个语料库上我与Kmeans进行了集群会话。之后,我手动阅读了100份文件,我说:“好的,这篇文章讲的是‘实时调度’,另一篇讲的是‘数据库’和‘抢占式调度’,等等。。。在那之后,我运行上面的所有代码来检查我说过的有多少文档必须放在一起,实际上在某个集群中放在一起。