上一讲讲到userCF算法,该算法是根据用户之间相似度,来给目标用户推荐与他们相似用户产生过行为的物品。该算法在某些应用场景并不适用。首先随着网站用户数目越来越大,计算用户兴趣相似矩阵越来越困难,运算时间复杂度和空间复杂度和用户增长近似于平方关系。其次,基于用户的协同过滤很难对推荐结果作出解释。
由此产生了基于物品的协同过滤(itemCF)给用户推荐和他们之前喜欢的物品相似的物品。不过ItemCF算法不是根据物品内容属性计算物品之间相似度,它主要通过分析用户的行为记录来计算物品之间的相似度。
基于物品的协同过滤算法主要分为两步。
①:计算物品之间的相似度
②:根据物品之间相似度和用户的历史行为给用户生产推荐列表。
根据定义可以用以下公式计算物品相似度:
N(i)表示喜欢物品i的用户列表,N(j)表示喜欢物品j的用户列表。上述公式可以理解成喜欢物品i的用户里有多少喜欢物品j。
但是有一个问题,如果物品j是个热门物品呢?大家都喜欢。那么上面公式岂不是接近1?因此该公式会造成任何物品都和热门物品有很大的相似性,对于致力于挖掘长尾信息来说不是一件好特性。为避免推荐出热门物品可以用下面公式:
上面公式惩罚了物品j的权重,因此减轻了热门物品和很多物品的相似性。
在实际计算物品相似度时,先建立用户—>物品的倒排表(即对每个用户建立一个包含他喜欢的物品列表),然后对于每个用户,将它的物品列表里面的物品两两在共现矩阵C中加1。
得到物品相似度以后,ItemCF通过如下公式计算用户u对一物品j的兴趣:
这里N(u)表示用户u喜欢的物品列表,S(j,k)表示和物品j最为相似的k个物品,Wji表示物品j和物品i的相似度。
表示用户u的历史兴趣物品列表中与物品j最为相似的k个物品。
rui表示用户u对物品i的喜欢程度(对于隐反馈数据,如果用户u对物品i产生过行为,则Rui=1),该公式的含义就是,和用户历史感兴趣的物品越相似的物品越有可能在用户推荐列表获得比较高的排名。
ItemCF算法在各个评测指标上的表现:
①精度(准确率和召回率):不和k的选取成正相关或者负相关,因此选择合适的k对获得最高精度非常重要。
②流行度(降低新颖度即提高流行度):和userCF不同,ItemCF推荐结果流行度影响不是完全受k影响,随着k增加,流行度会逐渐提高,但当k提高到一定程度,流行度就不会再有变化。
③覆盖率:k增加会降低系统的覆盖率。
用户活跃度对物品相似度的影响:活跃用户对物品的相似度的贡献应该小于不活跃的用户,应该增加IUf参数来修正物品相似度的计算公式:
将上面的算法记为itemCF-IUF,不考虑参数K的影响(即固定K),itemCF-IUF对比iemCF提高了覆盖率,降低了推荐系统的流行度,整体性能有提升
物品相似度归一化:如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率,如果得到物品的相似度矩阵,那么可以使用如下公式得到归一化之后相似度:
归一化的好处不仅仅在于增加推荐的准确率还提高了推荐的覆盖率和多样性。
下面举例说明为何归一化后结果好些:
假设物