基于项目和基于内容的协作过滤有什么区别?

时间:2013-05-04 08:22:07

标签: mahout recommendation-engine mahout-recommender

我很困惑基于项目的推荐是什么,如“Mahout in Action”一书中所述。书中有算法:

for every item i that u has no preference for yet
  for every item j that u has a preference for
    compute a similarity s between i and j
    add u's preference for j, weighted by s, to a running average
return the top items, ranked by weighted average

如何计算物品之间的相似度?如果使用内容,是不是基于内容的推荐?

2 个答案:

答案 0 :(得分:98)

基于项目的协作过滤

基于用户项目排名的原始基于项目的推荐是完全(例如,用户评价具有3星的电影,或者用户“喜欢”视频)。当您计算项目之间的相似性时,除了所有用户的评分历史之外,您不应该知道任何其他内容。因此,项目之间的相似性是基于评级而不是项目内容的元数据来计算的。

让我举个例子。假设您只能访问以下某些评级数据:

user 1 likes: movie, cooking
user 2 likes: movie, biking, hiking
user 3 likes: biking, cooking
user 4 likes: hiking

现在假设您想为用户4提出建议。

首先为项目创建倒排索引,您将得到:

movie:     user 1, user 2
cooking:   user 1, user 3
biking:    user 2, user 3
hiking:    user 2, user 4

由于这是二进制评级(喜欢与否),我们可以使用类似Jaccard Similarity的相似性度量来计算项目相似度。

                                 |user1|
similarity(movie, cooking) = --------------- = 1/3
                               |user1,2,3|

在分子中,user1是电影和烹饪都有的唯一元素。在分母中,电影和烹饪的结合有3个不同的用户(用户1,2,3)。 |.|这里表示集合的大小。所以我们知道电影和烹饪之间的相似性在我们的情况下是1/3。您只对所有可能的项目对(i,j)执行相同的操作。

完成所有对的相似度计算后,您需要为用户4提出建议。

  • 查看similarity(hiking, x)的相似性得分,其中x是您可能拥有的任何其他标签。

如果您需要为用户3提出建议,您可以汇总其列表中每个项目的相似度得分。例如,

score(movie)  = Similarity(biking, movie) + Similarity(cooking, movie)
score(hiking) = Similarity(biking, hiking) + Similarity(cooking, hiking) 

基于内容的推荐

基于内容的要点是我们必须知道用户和项目的内容。通常,您使用共享属性空间的内容构建用户配置文件和项目配置文件。例如,对于电影,您可以用它中的电影明星和类型来表示它(例如使用二进制编码)。对于用户简档,您可以基于用户喜欢某些电影明星/流派等来做同样的事情。然后,可以使用例如余弦相似度来计算用户和项目的相似性。

这是一个具体的例子:

假设这是我们的用户配置文件(使用二进制编码,0表示不喜欢,1表示类似),其中包含用户对5个电影明星和5个电影类型的偏好:

         Movie stars 0 - 4    Movie Genres
user 1:    0 0 0 1 1          1 1 1 0 0
user 2:    1 1 0 0 0          0 0 0 1 1
user 3:    0 0 0 1 1          1 1 1 1 0

假设这是我们的电影资料:

         Movie stars 0 - 4    Movie Genres
movie1:    0 0 0 0 1          1 1 0 0 0
movie2:    1 1 1 0 0          0 0 1 0 1
movie3:    0 0 1 0 1          1 0 1 0 1

为了计算电影对用户的好坏,我们使用cosine similarity

                                 dot-product(user1, movie1)
similarity(user 1, movie1) = --------------------------------- 
                                   ||user1|| x ||movie1||

                              0x0+0x0+0x0+1x0+1x1+1x1+1x1+1x0+0x0+0x0
                           = -----------------------------------------
                                         sqrt(5) x sqrt(3)

                           = 3 / (sqrt(5) x sqrt(3)) = 0.77460

类似地:

similarity(user 2, movie2) = 3 / (sqrt(4) x sqrt(5)) = 0.67082 
similarity(user 3, movie3) = 3 / (sqrt(6) x sqrt(5)) = 0.54772

如果您想为用户i提供一条建议,只需选择j最高的电影similarity(i, j)

希望这会有所帮助。

答案 1 :(得分:5)

“基于项目”实际上意味着“基于项目相似性”。您可以在此处添加您喜欢的任何相似性指标。是的,如果它基于内容,例如与术语向量的余弦相似性,您也可以将其称为“基于内容的”。