首先,介绍一下传统的商品协同过滤思路:
- 获取一段周期内用户-商品交互历史数据记录;
- 根据交互历史记录,计算两两商品相似度,得到商品相似度矩阵;
- 根据用户的历史交互商品列表,从商品相似度矩阵中查询每一个商品的相似商品列表,按照相似度排序(出现多次的得分相加),得到最终推荐结果。
转换为spark的思想去考虑,则实现步骤应如下:
- 获取一段周期内用户-商品交互历史RDD,(wid, gid)
- 计算用户交互过的所有商品的两两相似度,得到 ((gid1, gid2), score)
- 根据用户最近交互的n个商品进行推荐,并对推荐结果进行过滤,过滤已交互的商品。
首先是求解相似度矩阵,可以直接使用spark的笛卡尔积算子cartesian,但存在计算冗余,且时间较慢。在这里我们没有直接使用,而是用下图的方式一步步转换得到共现矩阵。
接下来,根据用户商品交互数据进行itemcf推荐,
val resRdd = item_user.join(item_sim) .map(x => ((x._2._1, x._2._2._1), x._2._2._2)) .reduceByKey(_+_) .map(x => (x._1._1, (x._1._2, x._2))) .groupByKey()
根据实际需求选择是否过滤用户交互过的商品,在这里我们对已购商品进行了过滤。
以上就是基于spark的商品协同过滤推荐的全部流程。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)