【问题标题】:What's difference between item-based and content-based collaborative filtering?基于项目和基于内容的协同过滤有什么区别?
【发布时间】:2013-04-28 15:23:02
【问题描述】:

我对基于项目的推荐是什么感到困惑,如“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

如何计算项目之间的相似度?如果使用内容,不就是基于内容的推荐吗?

【问题讨论】:

    标签: mahout recommendation-engine mahout-recommender


    【解决方案1】:

    “基于项目”实际上意味着“基于项目相似性”。您可以在此处放置您喜欢的任何相似性指标。是的,如果它是基于内容的,比如词向量的余弦相似度,你也可以称之为“基于内容的”。

    【讨论】:

    • 很荣幸得到您的答复。并且为了比较两种推荐方法的效果,我使用RMSRecommenderEvaluator进行评估。虽然参数相同,但不能保证训练数据相同并评估数据。如何将它们与相同的数据进行比较?
    • 你的意思是因为随机训练集不同?在执行其他任何操作之前尝试调用RandomUtils.useTestSeed()
    • 但是我想运行几个测试用例,我希望结果不同。
    • 我认为您将不得不稍微修改代码以保存并重用相同的训练集。但是多次运行随机测试并比较方法可能同样好。
    • 是的,我多次运行RecommenderEvaluator,对结果进行排序。这是我期望得到的。但是为什么不设计一个API来改变RandomWrapper中的STANDARD_SEED,从而改变随机效用呢?
    【解决方案2】:

    基于项目的协同过滤

    最初的基于项目的推荐完全基于用户项目排名(例如,用户给电影评分 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 推荐一部影片,只需选择jsimilarity(i, j) 最高的电影即可。

    希望这会有所帮助。

    【讨论】:

    • Cooking 有 2 个不同的用户?
    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2016-04-19
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多