分享协同过滤思想简介 什么是协同过滤?( 四 )


文章插图
的相似度 。
通过上面这些步骤, 公式1中的分子和分母基本都很容易计算出来了, 我们通过下图的代码(下面的broadcast即是

分享协同过滤思想简介 什么是协同过滤?

文章插图
), 就可以计算出每组

分享协同过滤思想简介 什么是协同过滤?

文章插图
对的相似度, 最终得到的RDD为:

分享协同过滤思想简介 什么是协同过滤?

文章插图
, 其中Sim为sid1和sid2的相似度 。

分享协同过滤思想简介 什么是协同过滤?

文章插图
图6:计算每组

分享协同过滤思想简介 什么是协同过滤?

文章插图
的相似度
有了上面的准备, 下面我们来说明一下怎么计算每个标的物的topK最相似的标的物 。
具体的计算过程可以用如下的Spark Transformation来实现 。 其中第三步的TopK需要我们自己实现一个函数, 求

分享协同过滤思想简介 什么是协同过滤?

文章插图
这样的列表中评分最大的TopK个元素, 实现也是非常容易的, 这里不赘述 。

分享协同过滤思想简介 什么是协同过滤?

文章插图
如果我们把每个标的物最相似的K个标的物及相似度看成一个列向量的话, 那么我们计算出的标的物相似度其实可以看作如下矩阵, 该矩阵每列K个非零元素 。

分享协同过滤思想简介 什么是协同过滤?

文章插图
图7:标的物相似度矩阵
到此为止, 我们通过Spark提供的一些Transformation操作及一些工程实现上的技巧计算出了每个标的物topK最相似的标的物 。 该计算方法可以横向拓展, 所以再大的用户数和标的物数都可以轻松应对, 最多可能需要多加一些服务器 。
2.为用户生成推荐
有了1中计算出的标的物topK最相似的标的物, 下面我们来说明一下怎么为用户生成个性化推荐 。 生成个性化推荐有两种工程实现策略, 一种是看成矩阵的乘积, 另外一种是根据第二节2中”基于标的物的协同过滤“中的公式来计算, 这两种方法本质上是一样的, 只是工程实现上不一样 。 下面我们分别讲解这两种实现方案 。
(1) 通过矩阵相乘为用户生成推荐上面图2中的矩阵是用户行为矩阵, 第i行第j列的元素代表了用户i对标的物j的偏好/评分, 我们将该矩阵记为

分享协同过滤思想简介 什么是协同过滤?

文章插图
, 其中n是用户数, m是标的物数 。 图7中的矩阵是标的物之间的相似度矩阵, 我们将它记为

分享协同过滤思想简介 什么是协同过滤?

文章插图
, 这是一个方阵 。

分享协同过滤思想简介 什么是协同过滤?

文章插图


分享协同过滤思想简介 什么是协同过滤?

文章插图
其实都是稀疏矩阵, 我们通过计算这两个矩阵的乘积(Spark上是可以直接计算两个稀疏矩阵的乘积的), 最终的结果矩阵就可以方便用来为用户推荐了:

分享协同过滤思想简介 什么是协同过滤?

文章插图
。 其中的第i行

分享协同过滤思想简介 什么是协同过滤?

文章插图
代表的是用户i对每个标的物的偏好得分, 我们从这个列表中过滤掉用户操作过的标的物, 然后按照得分从高到低降序排列取topN就是最终给用户的推荐 。
(2) 通计算公式为用户生成推荐标的物相似度矩阵

分享协同过滤思想简介 什么是协同过滤?

文章插图
是稀疏矩阵, 最多

分享协同过滤思想简介 什么是协同过滤?

文章插图
个非零元素(因为每个标的物只保留K个最相似的标的物), 一般K取几十或者上百规模的数值, m如果是十万或者百万量级, 存储空间在1G左右(例如, 如果m=100万, K=100, 相似度为双精度浮点数, 那么

分享协同过滤思想简介 什么是协同过滤?

文章插图
非零元素占用的空间为100万*100*8Byte=763M), 完全可以通过广播的形式将

分享协同过滤思想简介 什么是协同过滤?

文章插图
broadcast到每个Spark计算节点中 。 我们先将相似矩阵转化为下图的Map结构, 再广播出去, 方便利用公式计算相似度 。

推荐阅读