知识图谱表示学习Transe TransD TransR等的评价指标 hit@10、mean rank的理解

最近学习了知识图谱数值表示方式的学习算法,包括TransE、TransD、TransR等,看到提到的评价指标有hit@10、mean rank等,一开始对于这些指标并不清楚。在看了一篇Transe的实现之后,明白了其所代表的含义。

表示学习的过程,其实就是实体链接的过程,首先把实体以及关系随机初始化为一定长度的向量,然后基于训练数据,希望通过类似于翻译的方式得到一个更优的向量表示,使 头实体+关系 尽可能的与尾实体的向量表示相近。在完成训练之后,如何测试、如何衡量我们得到的结果的好坏呢。

下面就是hit@10、mean rank两个指标显身手的时候了。

在测试过程中,对于一对关系及实体,我们将头实体或尾实体替换成任意一种其他的实体(共n-1个,保持另一个实体以及关系不变,只变其中一个实体),这样我们得到了(n-1)个新的关系三元组,然后我们对这些三元组计算实体关系距离,将这n-1个三元组按照距离从小到大排列。

接下来就是计算hit@10、mean rank了,在这个排好序的n-1元素中,我们从第一个开始遍历,看从第一个到第十个是否能够遇到真实的实体,如果遇到了就将(hit@10 +1),这就是hit@10的意义,表示我们的算法能够正确表示三元组关系的能力(在hit@10里  不要求第一个才是对的,能做到前十的能力就可以了)

而对于mean rank是计算在测试集里,平均到第多少个才能匹配到正确的结果。

如果还有疑惑,看了下面的代码会更清晰

        rank_head_sorted = sorted(rank_head_dict.items(),key = operator.itemgetter(1))
        rank_tail_sorted = sorted(rank_tail_dict.items(),key = operator.itemgetter(1))

            #rank_sum and hits
            for i in range(len(rank_head_sorted)):
                if triple[0] == rank_head_sorted[i][0][0]:
                    if i<10:
                        hits += 1 #如果不到十次就命中了
                    rank_sum = rank_sum + i + 1 #统计总命中次数,mean rank就是对这个总数计算平均值
                    break

            for i in range(len(rank_tail_sorted)):
                if triple[1] == rank_tail_sorted[i][0][1]:
                    if i<10:
                        hits += 1
                    rank_sum = rank_sum + i + 1
                    break
            step += 1
            if step % 5000 == 0:
                print("step ", step, " ,hits ",hits," ,rank_sum ",rank_sum)
                print()

        self.hits10 = hits / (2*len(self.test_triple))  #这个是计算的前十个命中的概率
        self.mean_rank = rank_sum / (2*len(self.test_triple)) #这个是计算平均第几个命中

 

你可能感兴趣的:(知识图谱,知识图谱)