知识图谱表示学习Transe TransD TransR等的评价指标 [email protected]、mean rank的理解
最近学习了知识图谱数值表示方式的学习算法,包括TransE、TransD、TransR等,看到提到的评价指标有[email protected]、mean rank等,一开始对于这些指标并不清楚。在看了一篇Transe的实现之后,明白了其所代表的含义。
表示学习的过程,其实就是实体链接的过程,首先把实体以及关系随机初始化为一定长度的向量,然后基于训练数据,希望通过类似于翻译的方式得到一个更优的向量表示,使 头实体+关系 尽可能的与尾实体的向量表示相近。在完成训练之后,如何测试、如何衡量我们得到的结果的好坏呢。
下面就是[email protected]、mean rank两个指标显身手的时候了。
在测试过程中,对于一对关系及实体,我们将头实体或尾实体替换成任意一种其他的实体(共n-1个,保持另一个实体以及关系不变,只变其中一个实体),这样我们得到了(n-1)个新的关系三元组,然后我们对这些三元组计算实体关系距离,将这n-1个三元组按照距离从小到大排列。
接下来就是计算[email protected]、mean rank了,在这个排好序的n-1元素中,我们从第一个开始遍历,看从第一个到第十个是否能够遇到真实的实体,如果遇到了就将([email protected] +1),这就是[email protected]的意义,表示我们的算法能够正确表示三元组关系的能力(在[email protected]里 不要求第一个才是对的,能做到前十的能力就可以了)
而对于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)) #这个是计算平均第几个命中
上一篇: C# 摇杆设备连接,获取键值
下一篇: 如何并行运行程序