如图所示,将用户与电影使用one-hot编码,同时提取历史评分矩阵,用户职业进行one-hot编码,性别也是。召回阶段,简单粗暴的基于规则进行匹配item,具体详见github。
2.2 ranking阶段实现FM模型,通过FM模型训练参数得到召回数据中用户对召回物品的评分并进行排序。算法实现代码如下。
# 定义FM模型 class FM_model(torch.nn.Module): """FM Model""" def __init__(self, n, k): super(FM_model, self).__init__() self.n = n self.k = k self.linear = torch.nn.Linear(self.n, 1, bias=True) self.v = torch.nn.Parameter(torch.rand(self.n, self.k)) def fm_layer(self, x): # w_i * x_i 线性部分 linear_part = self.linear(x) print(linear_part.shape) # pairwise interactions part 1 inter_part1 = torch.mm(x, self.v) # pairwise interactions part 2 inter_part2 = torch.mm(torch.pow(x, 2), torch.pow(self.v, 2)) inter_part = 0.5 * torch.sum(torch.sub(torch.pow(inter_part1, 2), inter_part2), dim=1).reshape(-1, 1) output = linear_part + inter_part return output def forward(self, x): output = self.fm_layer(x) return output详细代码,请前往github查看FM算法实现
3.小结在本文中,我们介绍了FM模型。FM将SVM的通用性和因式分解模型的优势结合在一起。与SVM相比,FM能够在数据极其稀疏的情况下估计模型参数,并且时间复杂度与分解维数k和特征量n线性相关,速度较快,是推荐系统中召回与排序的利器。为了方便大家学习,作者特意针对MovieLens数据集走了一遍预处理、召回、排序的流程,希望能够帮助大家理解该算法,如果还有不明白的建议直接阅读论文,论文地址:因子分解机,召回和排序的利器,速度快效果好Factorization Machines