首页 > 代码库 > 推荐算法之基于物品的协同过滤算法
推荐算法之基于物品的协同过滤算法
基于物品的协同过滤算法(ItemCF)是业界应用最多的算法,主要思想是利用用户之前有过的行为,给用户推荐和之前物品类似的物品。
基于物品的协同过滤算法主要分为两步:
1)计算物品之间的相似度。
2)根据物品的相似度和用户的历史行为给用户生成推荐列表。
第一步的关键点在于计算物品之间的相似度,这里并不采用基于内容的相似性,而是去计算在喜欢物品i的用户中有多少是喜欢物品j的,这样计算的前提是用户的兴趣爱好一般是比较确定的,不容易变,那么当一个用户对两个物品都喜欢的时候,我们往往可以认为这两个物品可能属于同一分类。令N(i)表示购买物品i的用户数,则物品i和物品j的相似度可以用wij = |N(i)&N(j)|/N(i)来计算。
第一步时间复杂度的改进方法:和UserCF类似,我们可以建立一张用户-物品的倒查表,这样每次去计算一个用户有过行为的那些物品间的相似度,能够保证计算的相似度都是有用的,而不用花大的计算量在那些0上面(肯定是个稀疏矩阵)
第一步相似度的改进方法1:若根据上面的公式来计算相似度,你会发现,物品i跟流行物品j的相似度很高,因为流行读高,所以基本人人都会买,这样的话流行度高的物品就比较没有区分度,所以我们需要惩罚流行物品j的权重wij = |N(i)&N(j)|/sqrt(N(i)*N(j))
第一步相似度的改进方法2:需要惩罚用户的活跃度。若用户活跃度比较低,只买了有限的几本书,那么这几本书很有可能在一个或者两个兴趣范围内,对计算物品相似度比较有用,但是如果说一书店卖家趁着打折把亚马逊90%的书都买了然后赚差价,那么该用户的行为对计算物品相似度就没什么作用,因为90%的书肯定会覆盖很多范围,故应该像改进方法一中惩罚用户的活跃度。
第一步相似度的改进方法3:物品相似度的归一话。归一化不仅仅能提高推荐的准确度,还可以提高推荐的覆盖率和多样性。比如亚马逊上,用户的兴趣爱好肯定是分成几类的,很少说爱好集中在一类。假设有两类A和B,A类之间的相似度为0.5, B类之间的相似度为0.8,A和B之间的相似度为0.2, 当用户买了5本A类的书和5本B类的书后,我们要给用户来推荐书,如果按照之前的方法,最后按照相似度排序,那么推荐的应该都会是B类物品,就算B类中排名比较低,但照样比A类要高阿,所以应该根据类别进行相似度的归一话,这样一来A的相似度为1,B的相似度也为1,这样的话排序后的推荐A,B类商品都有,就大大提高了准确度,覆盖率和多样性。
第二步则比较简单,计算物品与用户已买物品的相似度(权重和),然后根据相似度排序选出topN.
ItemCF在实际系统中运用的比较多,主要有两个优点:
1)item-item表相比如user-user表要小的多,处理起来比较容易
2)itemCF容易提供推荐理由,比如给你推荐《机器学习》是因为你之前买过《数据挖掘》,这样能增加信任度,提高用户和推荐系统的交互,进一步增强个性化推荐