2013-05-04 97 views
20

我疑惑基于项目的建议是“在行动象夫”之间有什么区别。还有书中的算法:什么是协同过滤基于项目的推荐和基于内容的推荐

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 

什么可以计算项目之间的相似度?如果使用内容,是不是基于内容的建议?

回答

91

基于项目的协同过滤

原来的基于项目的建议是基于用户 - 项目排名完全(例如,额定电影有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| 

在分子中,用户1是唯一的元件,其电影和烹饪既有。在分母中,电影和烹饪联合有3个不同的用户(user1,2,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

来改变种子RandomUtils.useTestSeed(),感谢你的帖子,它非常详细。 – cstur4 2013-05-14 12:21:32

+0

烹饪有2个不同的用户? – 2014-05-06 04:38:48

4

“基于项目”的意思是“基于项目相似性”。你可以在这里放置你喜欢的任何相似性度量。是的,如果它基于内容,就像术语矢量上的余弦相似度那样,您也可以将其称为“基于内容”。

+1

非常荣幸能够得到您的答案。为了比较两种推荐方法的效果,我使用RMSRecommenderEvaluator进行评估。虽然参数相同,但不能保证相同的训练数据和评估数据。我可以将它们与相同的数据进行比较吗? – cstur4 2013-05-04 09:25:45

+0

你的意思是因为随机训练集是不同的?在其他任何执行之前尝试调用'RandomUtils.useTestSeed()'。 – 2013-05-04 10:36:13

+0

但我想运行几个测试用例,并且我希望结果不同。 – cstur4 2013-05-04 12:38:44