Tag Archives: item-based

ItemCF的优势

ItemCF和UserCF是推荐的两个基本算法。UserCF是很早就提出来了,ItemCF是从2001年左右开始流行,从amazon的文章开始,大家都觉得ItemCF好。但是,所有的文章说ItemCF好,都是从复杂度的角度说的,主要是user数大大超过item数,所以算item的相似度比较快速。(比如Netflix数据有40W用户,但只有1.7W电影,计算用户相似度代价是很大的)。不过这个原因始终不能让我觉得信服,因为在有些推荐中,比如文章,新闻的推荐,item数也是很多的,所以单从复杂度的角度,这两个算法在不同的系统中各有优势。 不过最近意识到,ItemCF的优点有两个。在一个非SNS的网站,相关Item本身是很重要的推荐,甚至比对user的推荐更重要。比如在youtube,但你看一个视频的时候,他会告诉你相关的视频。这个推荐的重要性远远超过了youtube首页对用户的综合推荐。在这里,itemCF的相似度成为了用户浏览的重要手段。另一个优点是ItemCF便于做推荐解释,在一个非SNS的网站中,我给你推荐一本书,如果给你的解释是某某和你有相似兴趣的人也看了这本书,你可能不相信因为你不认识那个人。但如果我说是因为这本书和你以前看的某本书相似,你可能就觉得合理了。 当然UserCF也不是一无是处,特别是现在SNS网站的流行,然UserCF又重要了起来,UserCF加上社会网络信息,可以增加用户对推荐解释的信服程度。

关于UserCF和ItemCF的那点事

UserCF和ItemCF是协同过滤中最为古老的两种算法,在top-N的推荐上被广泛应用。这两个算法之所以重要,是因为他们使用了两个不同的推荐系统基本假设。UserCF认为一个人会喜欢和他有相同爱好的人喜欢的东西,而ItemCF认为一个人会喜欢和他以前喜欢的东西相似的东西。这两个假设都有其合理性。根据我的测试,用UserCF和ItemCF做出的推荐列表中,只有50%是一样的,还有50%完全不同。但是这两个算法确有相似的精度。所以说,这两个算法是很互补的。 我一直认为这两个算法是推荐系统的根本,因为无论我们是用矩阵,还是用概率模型,我们都非常的依赖于前面说的两种假设。如果用户的行为不符合那两种假设,推荐系统就没必要存在了。因此我一直希望能够找出这两种算法的本质区别。他们有相似的精度,但是coverage相差很大,ItemCF coverage很大而UserCF很小。我还测试了很多其他指标,不过要从这些表象的指标差异找出这两个算法的本质区别还是非常困难。不过上周我基本发现了这两个算法推荐机理的本质区别。 我们做如下假设。每个用户兴趣爱好都是广泛的,他们可能喜欢好几个领域的东西。不过每个用户肯定也有一个主要的领域,对这个领域会比其他领域更加关心。给定一个用户,假设他喜欢3个领域A,B,C,同时A是他喜欢的主要领域。这个时候我们来看UserCF和ItemCF倾向于做出什么推荐。 结果如下,如果用UserCF, 它会将A,B,C三个领域中比较热门的东西推荐给用户。而如果用ItemCF,它会基本上只推荐A领域的东西给用户。因为UserCF只推荐热门的,所以UserCF在推荐长尾上能力不足。而ItemCF只推荐A领域给用户,这样他有限的推荐列表中就可能包含了一定数量的不热门item,所以ItemCF推荐长尾的能力比较强。不过ItemCF的推荐对某一个用户而言,显然多样性不足。但是对整个系统而言,因为不同的用户的主要兴趣点不同,所以系统的coverage会很大。 显然上面的两种推荐都有其合理性,但都不是最好的选择,因此他们的精度也会有损失。最好的选择是,如果我们给这个用户推荐30个item,我们既不是每个领域挑选10个最热门的给他,也不是推荐30个A领域的给他,而是比如推荐15个A领域的给他,剩下的15个从B,C中选择。 认识到这一点,可以给我们设计高精度的算法指明一个方向。就是当一个系统对个人推荐的多样性不足时,我们增加个人推荐的多样性可以提高精度。而当一个系统的整体多样性不足(比如只推荐popular的),我们增加整体的多样性同样可以提高精度。

社会舆论和用户个性的两难选择

在传统的推荐算法中,有两个基本算法,也就是所谓的user-based和item-based。其实,前一种算法的观点是认为用户的行为比较受舆论的影响,而后一种认为用户的行为受自己喜好的影响。当然这两者算法都是偏于极端的,现实社会中用户的行为往往受两种的共同影响,而两种影响的大小主要取决于用户和舆论谁更强势。 就比如拿最近的孔子来说,其实本人自从来了北京之后,每个月都会看一部电影,不管好还是烂,反正我个人看电影的习惯就是放松,不管多烂的电影,只要能放松就行了。而且我个人还是比较有主见的,不大受社会太多的影响(当然这也是相比较而言)。但是,有的时候舆论的影响却是潜移默化的,鉴于我的社会圈子里的舆论都认为孔子不怎么样,首先这就降低了我的期望,也就是说我去看孔子也不抱大希望了,但因为我的习惯,我还是觉得去看孔子,也就是说,在我到电影院之前,我的行为还是受我的习惯影响,舆论虽然有影响,但还没有大到改变我决定的地步。 不过当我到了电影院,发现孔子打折票还买50,这时我犹豫了,身在价格和舆论的双重context下,再强的人也不得不改变习惯了,于是经过激烈的思想斗争,我放弃了看孔子,用8元钱去买了个面包(现烤的,味道很不错)吃了一下,算是本周末奢侈了一把。 由此可见,舆论和个性的博弈在我看孔子这件事情上体现的非常的明显,当一个个人还在如此犹豫的时候,去追求推荐的精度还有什么意义了?也许我明天又后悔了,而这个事情推荐系统拿到了我没看孔子的数据,还在沾沾自喜着准备利用这个信息来调整精度。

item-based方法无法搞定的用户

最近研究发现有些用户在item-based的算法中是永远都不可能做出好的推荐的。因为item-based算法有一个基本假设,就是用户会喜欢和他以前喜欢的东西相似的东西。那么我们可以定义一个用户喜欢的物品的自相似性。比如给一个用户u,他喜欢K个物品,我们把这K个物品的两两相似度平均值记为d(u)。 那么,如果一个用户的d(u)大,那就说明他看的东西都是比较相似的,也就是说他比较符合item-based方法的基本假设,也就是说他喜欢的物品都是和其他物品相似的,这种用户在item-based的方法下能够获得好的推荐。反之,如果d(u)小,说明这个用户的喜好习惯并不满足item-based方法的假设,对于这种用户,用item-based方法做出好的推荐的可能性非常低。

item-based top-N问题中的一个公式

我觉得所有的item-based的方法其实是最大化如下的目标函数 sum_{i in N(u) , j in I\N(u)} w(i,j) x(j) 其中x(j) = 1表示j将被选作最终的N个结果集合中,所以有 sum(x(j)) = N I是所有item的集合, N(u)是u喜欢的物品集合, w(i,j)是i和j的相似度。

user-based和item-based算法,谁能产生多样化的结果

前一段时间和wendong聊天,他提到userbased算法的结果多样性不如itembased算法。对此,我觉得有几个问题 1) 我们知道所谓多样性,是指推荐结果两两都不怎么相似,从而不同的相似度度量其实产生不同的多样性度量。 2)常用的相似度有两种,一种是基于content的,一种是基于collaborative filtering的,那么根据我的实验,在这两种相似度的度量下,userbased的结果多样性都好于itembased的算法 3)但我觉得还是存在一种相似度,而这个相似度对应的多样性在item-based的方法下比较好 不知道大家对这个问题怎么看,在实际系统中userbased和itembased谁能产生多样的结果?

my solutions of github contest – item based KNN

文栋以前让我写一些具体的算法问题,所以从今天起,我详细介绍一下我在Github中用到的所有算法,我用中文写。 我的Github Contest解决方案 : item-based KNN item-based KNN是top-K推荐问题中用的最广泛的一个方法,他的相关论文有 Item-based collaborative filtering recommendation algorithmsItem-based top-n recommendation algorithmsAmazon. com recommendations: Item-to-item collaborative filtering 在github contest里面,我首先使用了item-based KNN,不过具体的实现细节和前面几篇论文不太一样,主要有下面几点 1) 如果两个工程被同一个用户watch过,那这个用户肯定给这两个工程贡献一定的相似度。在传统的相似度计算中,不同的用户贡献相似度的能力是相同的,不过我们考虑两个用户,一个看了100个工程,一个只看过两个工程,那么看过2个工程的用户贡献的相似度应该要高于看过100个工程的用户。(这个效应被称为inverseuser frequence,是和信息检索中的idf相对应的) 2) 推荐过程,对于一个用户,我们找出他曾经watch过的所有工程,然后对每个工程找出和他相似的工程,从而找出这个用户没有watch过得,但是和他watch过的工程最相似的工程。比如一个工程j,一个用户u,那么u对j的喜欢程度定义为 p(u,j) = sum_{i in N(u)} w(i,j) 这里的w(i.j)就是i和j两个工程的相似度,N(u)是uwatch过的所有工程。因为w(i,j)是线性相关系数,在我的实现中,我对w(i,j)进行了平方,这样的目的主要是削弱小相似度的影响,因为w(i,j)是大于0小于1的

An improved item-based KNN predictor

Today, I revise the item-based KNN predictor and get RMSE = 0.8730 in quiz with other 39 predictors. The classical item-based kNN will firstly calculate similarity between item i and j by: The, the rating r(u,i) will be predicted by: However, I revise this predictor by: This predictor can produce more accurate prediction by choosing [...]