Trans系列中的hits@10、Mean rank

1、Mean rank

首先 对于每个 testing triple,以预测tail entity为例,我们将(h,r,t)中的t用知识图谱中的每个实体来代替,然后通过fr(h,t)函数来计算分数,这样我们可以得到一系列的分数,之后按照 升序将这些分数排列。

f函数值是越小越好,那么在上个排列中,排的越前越好。

现在重点来了,我们去看每个 testing triple中正确答案也就是真实的t到底能在上述序列中排多少位,比如说t1排100,t2排200,t3排60.......,之后对这些排名求平均,Mean rank就得到了。

 

2、hits@10

还是按照上述进行f函数值排列,然后去看每个testing triple正确答案是否排在序列的前十,如果在的话就计数+1,最终  排在前十的个数/总个数   就是Hit@10

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,需要安装TransE、TransH、TransR、TransD等知识图谱嵌入模型的Python包,可以使用pip install命令安装相应的包。 以下是TransE知识图谱嵌入模型的Python实现代码: ```python import numpy as np import tensorflow as tf class TransE: def __init__(self, entity_num, relation_num, dim, margin, learning_rate): self.entity_num = entity_num self.relation_num = relation_num self.dim = dim self.margin = margin self.learning_rate = learning_rate self.ent_embeddings = tf.get_variable(name="ent_embeddings", shape=[self.entity_num, self.dim], initializer=tf.contrib.layers.xavier_initializer(uniform=False)) self.rel_embeddings = tf.get_variable(name="rel_embeddings", shape=[self.relation_num, self.dim], initializer=tf.contrib.layers.xavier_initializer(uniform=False)) self.ent_input = tf.placeholder(dtype=tf.int32, shape=[None]) self.rel_input = tf.placeholder(dtype=tf.int32, shape=[None]) self.ent_output = tf.placeholder(dtype=tf.int32, shape=[None]) self.pos_h = tf.nn.embedding_lookup(self.ent_embeddings, self.ent_input) self.pos_t = tf.nn.embedding_lookup(self.ent_embeddings, self.ent_output) self.pos_r = tf.nn.embedding_lookup(self.rel_embeddings, self.rel_input) self.neg_h = tf.placeholder(dtype=tf.int32, shape=[None]) self.neg_t = tf.placeholder(dtype=tf.int32, shape=[None]) self.neg_pos_h = tf.nn.embedding_lookup(self.ent_embeddings, self.neg_h) self.neg_pos_t = tf.nn.embedding_lookup(self.ent_embeddings, self.neg_t) self.predict = tf.reduce_sum(tf.abs(self.pos_h + self.pos_r - self.pos_t), axis=1, keepdims=True) self.loss = tf.reduce_sum(tf.maximum(self.predict - tf.reduce_sum(tf.abs(self.neg_pos_h + self.pos_r - self.pos_t), axis=1, keepdims=True) + self.margin, 0)) self.train_op = tf.train.GradientDescentOptimizer(self.learning_rate).minimize(self.loss) self.sess = tf.Session() self.sess.run(tf.global_variables_initializer()) def train(self, batch_h, batch_t, batch_r, batch_nh, batch_nt): _, loss = self.sess.run([self.train_op, self.loss], feed_dict={ self.ent_input: batch_h, self.rel_input: batch_r, self.ent_output: batch_t, self.neg_h: batch_nh, self.neg_t: batch_nt }) return loss def test(self, h, t, r): return self.sess.run(self.predict, feed_dict={ self.ent_input: h, self.rel_input: r, self.ent_output: t }) ``` 其,entity_num表示实体的数量,relation_num表示关系的数量,dim表示嵌入维度,margin表示损失函数的边际值,learning_rate表示学习率。 TransE模型的实体和关系都被嵌入到dim维空间,损失函数通过最小化正样本和负样本之间的距离来学习嵌入向量。 batch_h、batch_t和batch_r分别表示一批训练数据的头实体、尾实体和关系,batch_nh和batch_nt分别表示一批负样本的头实体和尾实体。 使用以下代码可以创建一个TransE模型的实例并进行训练: ```python model = TransE(entity_num, relation_num, dim, margin, learning_rate) for epoch in range(num_epochs): for i in range(num_batches): batch_h, batch_t, batch_r, batch_nh, batch_nt = generate_batch(batch_size) loss = model.train(batch_h, batch_t, batch_r, batch_nh, batch_nt) print("Epoch:", epoch, "Loss:", loss) ``` 其,generate_batch函数用于生成一个batch的训练数据和负样本。训练过程,每个epoch会迭代num_batches次,每次迭代使用一个batch的数据进行训练。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值