传统上,构建推荐系统有两种方法:

(1)基于内容的推荐
(2)协同过滤

第一种方法需要分析每一项的属性。例如,对每位诗人的诗歌作品进行自然语言处理,然后向用户推荐诗人。但是,协同过滤却不需要有关项或用户本身的任何信息,而是根据用户的过去行为进行推荐。

协同过滤

协同过滤(CF)是基于用户过去行为的推荐平均值。协同过滤可分两类:

基于用户:测量目标用户与其他用户之间的相似性
基于项目:测量目标用户评价/交互过的项目与其他项目之间的相似性

协同过滤背后的关键思想是相似的用户共享相同的兴趣,并且喜欢相似的项目。

假设现有m个用户和n个项目,我们用m * n的矩阵来表示用户过去的行为。矩阵中的每个单元格表示用户持有的相关反馈,例如,M {i,j}表示用户i对项目 j的喜欢程度,这种矩阵称为效用矩阵(utility matrix)。

基于用户的协同过滤

基于用户的协同过滤首先需要计算用户之间的相似性。计算相似性有两种办法,皮尔逊相关系数或余弦相似度。设u {i,k}表示用户i和用户k之间的相似度,v {i,j}表示用户i对项目j的评级,如果用户没有评定该项目,则v_ {i,j} =?。

这两种方法可以表示如下:

1、皮尔逊相关系数 (Pearson Correlation)

1.jpg

2、余弦相似度(Cosine Similarity)

3.jpg

这两种方法很常用,但区别在于用皮尔逊相关系数计算的话,向所有元素添加常量不变。

现在,我们可以使用以下等式预测用户对未评级项目的反馈意见:

5.jpg

在以下矩阵中,每行代表一个用户,而列对应于不同的电影,每个单元格代表用户为该电影提供的评级,最后一列为该用户和目标用户之间的相似性。假设用户E是目标用户。

7.jpg

由于用户A和F不共享与用户E共同的任何电影评级,因此他们与用户E的相似性未在中皮尔逊相关系数中定义。因此只需要考虑用户B、C和D。基于皮尔逊相关系数,计算如下:

9.jpg

从上表可以看出,用户D与用户E差异很大,二者之间的皮尔逊相关性为负。用户D对电影Me Before You的评价高于他的评分平均值,而用户E的表现则相反。

11.jpg

基于用户的协同过滤虽然很简单,但它存在几个问题。一个主要问题是用户的偏好会随着时间的推移而改变,这意味着基于其相邻用户预先计算矩阵这种方法可能导致推荐效果不准确。为了解决这个问题,我们可以采用基于项目的协同过滤。

基于项目的协同过滤

基于项目的协同过滤并不计算用户之间的相似性,而是基于用户与目标用户评定的项目之间的相似性来推荐项目。同样,可以使用皮尔逊相关系数或余弦相似度计算相似度。主要区别在于,使用基于项目的协同过滤,我们垂直填补空白,与基于用户的协同过滤的水平方式相反。下表展示了如何为电影Me Before You执行此操作。

13.jpg

这种方法成功地避免了动态的用户偏好带来的问题,因为基于项目的CF更加静态。但是,这种方法仍然存在一些问题。第一个问题是可扩展性。数据计算量随用户和项目的增长而增长。最坏的情况复杂度是O(mn),即m个用户和n个项目。稀疏性是另一个问题。在上表中,虽然只有一个用户对Matrix和Titanic都进行了评级,但它们之间的相似性为1。在极端情况下,我们可能拥有数百万用户,两部截然不同的电影之间的相似性也可能非常高,因为唯一一个对这两部电影评分的用户给了它们相似的评分。