首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于项目的协同过滤和基于内容的协同过滤有什么区别?

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

Stack Overflow用户
提问于 2013-05-04 16:22:07
回答 2查看 27.7K关注 0票数 25

我对基于项目的推荐是什么感到困惑,就像"Mahout in Action“一书中所描述的那样。书中有这样的算法:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-09 02:35:41

基于项目的协同过滤

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

让我给你举个例子。假设您只能访问一些评分数据,如下所示:

代码语言:javascript
复制
user 1 likes: movie, cooking
user 2 likes: movie, biking, hiking
user 3 likes: biking, cooking
user 4 likes: hiking

假设您现在想要为用户4提供推荐。

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

代码语言:javascript
复制
movie:     user 1, user 2
cooking:   user 1, user 3
biking:    user 2, user 3
hiking:    user 2, user 4

由于这是一个二元评级(喜欢或不喜欢),我们可以使用Jaccard Similarity等相似性度量来计算项目相似度。

代码语言:javascript
复制
                                 |user1|
similarity(movie, cooking) = --------------- = 1/3
                               |user1,2,3|

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

在完成所有配对的相似度计算之后,例如,您需要为用户4提供推荐。

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

如果您需要为用户3提供推荐,您可以聚合列表中每个项目的相似度得分。例如,

代码语言:javascript
复制
score(movie)  = Similarity(biking, movie) + Similarity(cooking, movie)
score(hiking) = Similarity(biking, hiking) + Similarity(cooking, hiking) 

基于内容的推荐

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

下面是一个具体的例子:

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

代码语言:javascript
复制
         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

假设这是我们的电影配置文件:

代码语言:javascript
复制
         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

代码语言:javascript
复制
                                 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

类似地:

代码语言:javascript
复制
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一个推荐,只要选择similarity(i, j)最高的电影j即可。

希望这能有所帮助。

票数 112
EN

Stack Overflow用户

发布于 2013-05-04 16:56:41

“基于项目”真正的意思是“基于项目的相似性”。你可以在这里放入任何你喜欢的相似性度量。是的,如果它是基于内容的,比如术语向量上的余弦相似度,你也可以称之为“基于内容的”。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16372191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档