输入:物品用户行为矩阵,行为矩阵中的元素只有0和1,0代表行为的负类,1代表行为的正类。比如不喜欢与喜欢、不点赞与点赞、不收藏与收藏。
输出1:根据输入可计算得到物品相似度矩阵;
输出2:根据输入中物品用户行为矩阵得到用户喜欢的物品,用户喜欢的物品结合输出1得到的物品相似度矩阵,可以计算得到用户喜欢度最高的k个物品,并推荐给用户。
基于物品的协同过滤算法适用于物品数明显小于用户数的场景,适用于长尾物品丰富,用户个性化需求强烈的领域。但是该算法不适用于物品变化较快的场景,比如新闻类的应用,如果物品一直在变化,那么会增加物品相似度更新的频率,不够稳定,此类场景下可以考虑选择基于用户的协同过滤算法。
基于物品的协同过滤诞生于1998年,是由亚马逊首先提出,适用于用户明显多于物品的情况。基于物品的协同过滤算法的原始想法是:给用户推荐用户喜欢的物品相似的物品。问题在于“相似的物品”是如何度量的,基于内容的推荐系统中,物品相似是用内容的相似性计算出来的,但是实际上人的群体行为还是会有一些内容特征抓不到的相似性。
在基于物品的协同过滤之前,最常用的是基于用户的协同过滤。基于用户的协同过滤首秀按计算相似用户,然后再根据相似用户的喜好推荐物品,但是基于用户的协同过滤存在以下问题:
基于物品的协同过滤可以较好的解决上面的问题。物品的数量远远少于用户的数量,而且物品之间的相似度不易改变,物品对应的消费者数量大,所以计算出来的物品相似度比较可靠。
协同过滤算法依赖于用户物品之间的关系矩阵(如表1所示)。基于物品的协同过滤算法除了依赖用户物品之间的关系矩阵,还依赖于物品之间的相似度矩阵(如表2所示)。
计算物品的相似度有好几种方法,比如余弦相似度、杰卡德(Jaccard)相似度,余弦相似度适用于评分数据,杰卡德(Jaccard)相似度适用于隐式反馈数据,由于这里使用的用户户物品矩阵是隐式反馈数据,所以介绍下Jaccard相似度的计算公式:
通过上面的公式计算得到物品相似度矩阵后,就可以结合用户已经喜欢过的物品集合给用户推荐物品了,可以通过下面的公式计算用户对待推荐物品的评分:
可以依次求得用户u对所有物品的评分,去掉用户已经喜欢过的物品后,保留分数最高的N个结果推荐给用户u。
python代码实现
本文代码手动构造了一个100*200的物品用户行为矩阵,实际工业环境中肯定不止这点数据量,本中重点在于讲解原理和一种实现方法,对于某个用户而言,推荐喜欢度最高的10个物品,代码运行结果如下:
1user[122]top[10]recomresult:[(98,13.734837466951667),(97,13.534563830373337),(90,12.351537112348055),(94,12.194631579469013),(82,11.25929195188074),(84,10.662303442296619),(80,10.60327372276929),(79,10.570187047487309),(77,9.94780886977415),(69,8.431845325504977)]按照喜欢度从高到底排序,推荐的物品id为98、97、90、94、82、84、80、79、77、69。