首页 > 解决方案 > torch.sum 里面有一个条件

问题描述

我正在尝试创建一个推荐系统,我尝试使用一个函数来计算我的 hit@10,如下所示:

def RecEvaluate(model, g, features, users_eval, movies_eval, neg_sample_size):
    model.eval()
    with torch.no_grad():
        neg_movies_eval = data.neg_valid[users_eval].flatten()
        r, neg_r = model.est_rating(g, features, users_eval, movies_eval, neg_movies_eval)
        hits10 = (torch.sum(neg_r > r, 1) <= 10).numpy()
        print('HITS@10:{:.4f}'.format(np.mean(hits10)))
        return np.mean(hits10)

我特别想了解这条线

hits10 = (torch.sum(neg_r > r, 1) <= 10).numpy()

为了理解起见,我尝试并执行了这段代码作为示例:

neg_r = torch.tensor([[1., 10. ,5., 1., 2., 4.],[0., 7., 8., 10., 6., 2.]])
r = torch.tensor([[1., 9. ,5., 1., 2., 3.]])
#####################################################################
r = r.T
r.shape
neg_r = neg_r.T
neg_r.shape

print(neg_r > r)
print(torch.sum(neg_r > r))
print(torch.sum(neg_r > r, 1))
print(torch.sum(neg_r > r, 1) <= 10)
hits10 = (torch.sum(neg_r > r, 1) <= 10).numpy()
print(hits10)
print('HITS@10:{:.4f}'.format(np.mean(hits10)))

我得到了以下结果:

torch.Size([6, 1])
torch.Size([6, 2])
tensor([[False, False],
        [ True, False],
        [False,  True],
        [False,  True],
        [False,  True],
        [ True, False]])
tensor(5)
tensor([0, 1, 1, 1, 1, 1])
tensor([True, True, True, True, True, True])
[ True  True  True  True  True  True]
HITS@10:1.0000

它是如何工作的?这就是我们计算 Hit@10 的方式吗?最后是否正确?在这种情况下,我们如何计算 ARHRs @ 10?

标签: pytorchmetricsrecommender-systems

解决方案


推荐阅读