推荐算法之用户推荐(UserCF)和物品推荐(ItemCF)对比
http://www.tuicool.com/articles/nQzIZ3
byxiaoming· 2014 年 2 月 26 日
一、定义
-
UserCF:推荐那些和他有共同兴趣爱好的用户喜欢的物品
-
ItemCF:推荐那些和他之前喜欢的物品类似的物品
根据用户推荐重点是反应和用户兴趣相似的小群体的热点,根据物品推荐着重与用户过去的历史兴趣,即:
- UserCF是某个群体内的物品热门程度
- ItemCF是反应本人的兴趣爱好,更加个性化
二、新闻类网站采用UserCF的原因:
- 用户大都喜欢热门新闻,特别细粒度的个性化可忽略不计
- 个性化新闻推荐更强调热点,热门程度和实效性是推荐的重点,个性化重要性则可降低
- ItemCF需要维护一张物品相关度的表,当物品量更新速度太快时,此表的维护在技术上有难度。新闻类网站对于新用户可直接推荐热门新闻即可
- 对于电商、音乐、图书等网站而言,ItemCF的优势更大:
- 用户的兴趣比较固定和持久;
- 不需要太过考虑流行度,只需要帮用户发现他研究领域相关物品即可
- 技术角度考量
- UserCF需要维护一个用户相似度矩阵
- ItemCF需要维护一个物品相似度矩阵
三、优缺点对比
项目 | UserCF | ItemCF |
性能 | 适用于用户较少的场合,如果用户过多,计算用户相似度矩阵的代价交大 | 适用于物品数明显小于用户数的场合,如果物品很多,计算物品相似度矩阵的代价交大 |
领域 | 实效性要求高,用户个性化兴趣要求不高 | 长尾物品丰富,用户个性化需求强烈 |
实时性 | 用户有新行为,不一定需要推荐结果立即变化 | 用户有新行为,一定会导致推荐结果的实时变化 |
冷启动 | 在新用户对少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度是离线计算的 新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给其他用户 |
新用户只要对一个物品产生行为,就能推荐相关物品给他,但无法在不离线更新物品相似度表的情况下将新物品推荐给用户 |
推荐理由 | 很难提供 | 可以根据用户历史行为归纳推荐理由 |
UserCF和ItemCF是协同过滤中最为古老的两种算法,早在20多年前就有学着提出来,由于简单,很多网站都应用。以我现在的阅读论文经验来说,youtobe等各大网站应用的算法,概括点说就是在数据清洗阶段不同,数据组织成矩阵存储之后,差不多都是有user-based和item-based的影子。我忘了和谁聊天了,似乎是面试官还是朋友说,数据挖掘,推荐引擎什么的其实也就那样,只不过外行的看起来很高深而已,做了才知道,弄来弄去不过如此。EMC一个博士在面试我的时候也提及了类似的观点,我实现的观点也觉得,只要把如果计算相似度的逻辑搞清楚了,其余剩下的没什么难度。User- based认为一个人会喜欢和他有相同爱好的人喜欢的东西,即人以群分,我在豆瓣上关注的人都是我喜欢的人,他们喜欢的东西我也喜欢,而Item-based认为一个人会喜欢和他以前喜欢的东西相似的东西,我喜欢文艺片,豆瓣会给我推荐文艺片。这两个假设都有其合理性。在网上看网友的博客指出,根据网友的测试,用UserCF和ItemCF做出的推荐列表中,只有50%是一样的,还有50%完全不同。但是这两个算法确有相似的精度。所以说,这两个算法是很互补的。这句话在很多书中也见过,但是没有做过测试检验。一下是网友的见解,粘贴过来:
我一直认为这两个算法是推荐系统的根本,因为无论我们是用矩阵,还是用概率模型,我们都非常的依赖于前面说的两种假设。如果用户的行为不符合那两种假设,推荐系统就没必要存在了。因此我一直希望能够找出这两种算法的本质区别。他们有相似的精度,但是coverage相差很大,ItemCF coverage很大而UserCF很小。我还测试了很多其他指标,不过要从这些表象的指标差异找出这两个算法的本质区别还是非常困难。不过上周我基本发现了这两个算法推荐机理的本质区别。
我们做如下假设。每个用户兴趣爱好都是广泛的,他们可能喜欢好几个领域的东西。不过每个用户肯定也有一个主要的领域,对这个领域会比其他领域更加关心。给定一个用户,假设他喜欢3个领域A,B,C,同时A是他喜欢的主要领域。这个时候我们来看UserCF和ItemCF倾向于做出什么推荐。
结果如下,如果用UserCF, 它会将A,B,C三个领域中比较热门的东西推荐给用户【这个可以理解,算法会寻找同是喜欢这3个领域的用户,然后将这3个领域中最相似的物品进行推荐】。而如果用ItemCF,它会基本上只推荐A领域的东西给用户【A领域在用户偏好中占大部分,对应item-item相似度占比率大,被推荐概率大】。因为UserCF只推荐热门的,所以UserCF在推荐长尾上能力不足。而ItemCF只推荐A领域给用户,这样他有限的推荐列表中就可能包含了一定数量的不热门item,所以ItemCF推荐长尾的能力比较强。不过ItemCF的推荐对某一个用户而言,显然多样性不足。但是对整个系统而言,因为不同的用户的主要兴趣点不同,所以系统的coverage会很大。【终于明白了覆盖率大的含义】
显然上面的两种推荐都有其合理性,但都不是最好的选择,因此他们的精度也会有损失。最好的选择是,如果我们给这个用户推荐30个item,我们既不是每个领域挑选10个最热门的给他,也不是推荐30个A领域的给他,而是比如推荐15个A领域的给他,剩下的15个从B,C中选择。【这个在实际应用中就不是很容易做到了,如何将用户兴趣分类?使用图论,连接矩阵将用户兴趣偏好识别?与其这样,还不如先将数据进行社区聚类,将数据根据图划分为几个小团体,针对小团体做推荐,这样就比如将只有上面提及的3中兴趣爱好的人组成的社区里面进行推荐。至于算法,小团体里大家都差不多,对应偏好矩阵稠密度较高,2个算法差距应该不大吧,具体有待考究】
认识到这一点,可以给我们设计高精度的算法指明一个方向。就是当一个系统对个人推荐的多样性不足时,我们增加个人推荐的多样性可以提高精度。而当一个系统的整体多样性不足(比如只推荐popular的),我们增加整体的多样性同样可以提高精度。