推荐系统最经典的推荐模型协同过滤

协同过滤算法的基本原理

  • 协同过滤就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息。
  • 举个例子如下图
    在这里插入图片描述
  • 图a是四种商品,
  • 图b是用户物品的有向图,绿色为赞,红色为踩。
  • 图c是生成的物品用户行为矩阵,我们需要推测用户X对于电视机这个商品的评价。
  • 图d是用户b,c与X行为对于其他物品行为相似的用户,标记成绿色。
  • 图e是根据用户b,c对于电视机是踩,推断出用户X对于电视机的行为是踩。

计算用户相似度

在共现矩阵中,每个用户对应的行向量其实就可以当作一个用户的 Embedding向量,然后对这些Embedding进行相似度计算。最常见的计算方法有余弦相似度计算,它衡量了用户向量i和用户向量j之间的向量夹角大小。夹角越小,余弦相似度越大,两个用户越相似。计算公式如下:
在这里插入图片描述
除了余弦相似度还有皮尔逊系数,欧氏距离等,请参考此链接

用户评分的预测

  • 在获得Top n个相似用户之后,利用Top n用户生成最终的用户u对物品p的评分是一个比较直接的过程。假设的是“目标用户与其相似用户的喜好是相似的”,根据假设,可以利用相似用户的已有评价对目标用户的偏好进行预测。最常用的方式是,利用用户相似度和相似用户评价的加权平均值,来获得目标用户的评价预测。公式如下:
    在这里插入图片描述
  • 权重wu,s​是用户u和用户s的相似度,Rs,p​是用户s对物品p的评分。在获得用户u对不同物品的评价预测后,最终的推荐列表根据评价预测得分进行排序即可得到。

矩阵分解算法的原理

  • 虽然协同过滤是目前公认的最经典的推荐算法,但是有个最大的问题就是共现矩阵较为稀疏。用户历史行为很少的情况下,寻找相似用户的过程并不准确。
  • 矩阵分解的主要过程就是先分解协同过滤生成的共现矩阵,生成用户和物品的隐向量,再通过用户和物品隐向量间的相似性进行推荐
  • 那这个过程的关键就在于如何分解这个共现矩阵了。就是把一个m x n的共现矩阵,分解成一个m x k的用户矩阵和k x n的物品矩阵相乘的形式如下图:
    在这里插入图片描述
  • 有了用户矩阵和物品矩阵,用户隐向量和物品隐向量就非常好提取了。用户隐向量就是用户矩阵相应的行向量,而物品隐向量就是物品矩阵相应的列向量。
  • 对于矩阵分解算法讲解可以参考此链接

矩阵分解算法的Spark实现

  • 代码如下:

// 建立矩阵分解模型(交替最小二乘法)
val als = new ALS()
  .setMaxIter(5)
  .setRegParam(0.01)
  .setUserCol("userIdInt")
  .setItemCol("movieIdInt")
  .setRatingCol("ratingFloat")


//训练模型
val model = als.fit(training)


//得到物品向量和用户向量
model.itemFactors.show(10, truncate = false)
model.userFactors.show(10, truncate = false)

  • 注意事项:在模型中,需要在模型中指定训练样本中用户ID对应的列userIdInt和物品ID对应的列movieIdInt,并且两个ID列对应的数据类型需要是int类型的。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值