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


假设有两个标的物

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

文章插图
, 它们对应的向量(即图2中矩阵的列向量, 分别是第i列和第j列)如下, 其中n是用户数 。

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

文章插图

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

文章插图
那么

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

文章插图
的相似度计算, 我们可以细化如下:

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

文章插图
公式1:计算

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

文章插图
相似度
我们仔细看一下上述公式, 公式的分子就是下图矩阵中对应的i列和j列中同一行中的两个元素(红色矩形中的一对元素)相乘, 并且将所有行上第i列和第j列的元素相乘得到的乘积相加(这里其实只需要考虑同一行对应的i列和j列的元素都非零的情况, 如果只要第i列和第j列中有一个为零, 乘积也为零) 。 公式中分母是第i行与第i行按照上面类似的方法相乘再相加后开根号的值, 再乘以第j行与第j行按照上面类似的方法相乘再相加后开根号的值 。
图3:计算两个列向量的cosine余弦可以拆解为简单的加减乘及开根号运算
有了上面的简单分析, 就容易分布式计算相似度了 。 下面我们就来讲解, 在Spark上怎么简单地计算每个标的物的topK相似度 。 在Spark上计算相似度, 最主要的目标是怎么将上面巨大的计算量(前面已经提到在互联网公司, 往往用户数和标的物数都是非常巨大的)通过分布式技术实现, 这样就可以利用多台服务器的计算能力, 解决大计算问题 。
首先将所有用户操作过的标的物”收集“起来, 形成一个用户行为RDD, 具体的数据格式如下:

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

文章插图
其中uid是用户唯一识别编码, sid是标的物唯一识别编码, R是用户对标的物的评分(即矩阵中的元素) 。
对于

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

文章插图
中的某个用户来说, 他操作过的标的物

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

文章插图


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

文章插图
, 一定在该用户所在的行对应的列i和列j的元素非零, 根据上面计算

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

文章插图
相似度的公式, 需要将该用户对应的

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

文章插图
的评分乘起来 。 这个过程可以用下面的图4来说明 。
图4:对用户U来说, 将他所有操作过的标的物做笛卡尔积
当所有用户都按照图4的方式转化为标的物对及得分(图4中右边的

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

文章插图
)时, 我们就可以对标的物对Group(聚合), 将相同的对合并, 对应的得分相加, 最终得到的RDD为:

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

文章插图
这样, 公式1中分子就计算出来了(上式中的Score即是公式1中的分子) 。 现在我们需要计算分母, 这非常简单, 只要从上面的RDD中将标的物sid1等于标的物sid2的列过滤出来就可以了, 通过下图的操作, 我们可以得到一个map

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

文章插图

图5:从

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

文章插图
中过滤出

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

文章插图
的元素, 用于计算公式1中的分母

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

文章插图
最多含有标的物的数量(m)个的元素, 相对来说不大, 我们可以将

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

文章插图
广播(broadcast)出去 。

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

文章插图
方便我们按照公式1除以分母, 最终得到

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

推荐阅读