协同过滤推荐算法
一、简介
协同过滤(Collaborative Filtering,CF)推荐算法简单理解:分析用户的兴趣,在用户群体中找到指定用户的相似(兴趣:可以是感兴趣的,也可以是不感兴趣的)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。
目前协同过滤推荐算法主要由基于用户(User-based)的协同过滤、基于项目(Item-based)的协同过滤和基于模型(Model- based)的协同过滤。User-based和Item-based主要使用的是最邻近搜索(计算用户或项目间的相似度,根据相似度的高低进行推荐),以及在这基础上进行优化等。Model- based则是根据历史数据建立模型,再用模型来进行预测(用机器学习的思想解决问题)。
二、基于用户的协同过滤(UserCF)
基于用户的协同过滤机制:根据用户的历史数据来计算用户的相似度,根据用户群体间的相似度进行推荐。它的基本假设是,喜欢类似物品的用户可能有相同或者相近的偏好。
流程:
1.收集用户信息
收集可以代表用户兴趣的信息。如用户购买的商品记录,用户经常点赞的视频,或是用户看到后选择不敢兴趣的内容等。用户兴趣既可以是用户感兴趣的,也可以是用户不感兴趣的。
2.最近邻搜索(Nearest neighbor search, NNS)
以用户为基础(User-based)的协同过滤的出发点是与用户A兴趣爱好相同的另一组用户B,就是计算两个用户的相似度。多次计算用户A与其他用户的相似度,得到用户A的最邻近集合。
3.产生推荐结果
根据最近邻集合,对目标用户的兴趣进行预测,产生推荐结果。依据推荐目的进行推荐。较常见的推荐结果有Top-N 推荐和关系推荐。Top-N 推荐是针对个体用户产生,对每个人产生不一样的结果,例如:通过对A用户的最近邻用户进行统计,选择出现频率高且在A用户的评分项目中不存在的,作为推荐结果。关系推荐是对最近邻用户的记录进行关系规则挖掘。
对比:
基于用户的协同过滤——根据用户的历史偏好数据计算相似度,如:看过的视频,购买过的商品等。
基于人口统计学的推荐——主要考虑用户的本身特征计算相似度,如年龄、职业、性别等。
三、基于项目的协同过滤(ItemCF)
基于项目的协同过滤算法就是通过计算已评价项目和待预测项目之间的相似度,并将相似的项目推荐给目标用户。
流程:
1.收集项目信息
收集已经被用户评价过的项目信息。如用户对项目的评价、用户浏览项目的次数、或者用户为项目打的标签等。
2.针对项目的最近邻搜索
先计算已评价项目和待预测项目的相似度,并以相似度作为权重,加权各已评价项目的分数,得到待预测项目的预测值。
3.产生推荐结果
以项目为基础的协同过滤不用考虑用户间的差别,所以精度比较差。但是却不需要用户的历史数据,或是进行用户识别。对于项目来讲,它们之间的相似性要稳定很多,因此可以离线完成工作量最大的相似性计算步骤,从而降低了在线计算量,提高推荐效率,尤其是在用户多于项目的情形下尤为显著。
对比:
基于项目的协同过滤——根据新项目和已评价项目之间的相关信息计算相似度。
基于内容的推荐——基于物品本身的属性特征信息计算相似度。
四、基于模型的协同过滤 *
基于模型的协同过滤主要是用机器学习的思想来建模解决,用模型来进行预测和推荐。目前将深度学习和推荐算法相结合进行推荐也很火热。在基于模型的协同过滤中使用的主流方法包括关联算法、神经网络、矩阵分解、聚类算法、分类算法、回归算法、图模型以及隐语义模型。上诉涉及到的算法我之后会再发详细的讲解,这里只是简单提几个。
(1)关联算法:算法核心就是要找出通过条件A可以推出条件B的强关联的规则。挖掘出强关联规则的方法主要通过计算每个项集的频繁项集,然后筛选出比最小支持度大的项集,一直反复循环查找,直到没有符合要求的频繁项为止,最后计算符合要求的频繁项集的置信度和提升度,得出强关联规则。关联规则算法中找寻频繁项集主要依赖于三个指标,分别是支持度、置信度和提升度。常用的关联推荐算法有Apriori,FP Tree和PrefixSpan。
(2)神经网络:从目前看,使用神经网络做协同过滤和其他推荐算法相融合是以后研究、应用的一个趋势。目前比较主流的有用两层神经网络来做推荐算法的是限制玻尔兹曼机(RBM)。如果用多层的神经网络来做协同过滤效果应该会更好,用深度学习的方法来做协同过滤应该是将来的一个趋势。
(3)矩阵分解:目前用矩阵分解做协同过滤是目前使用也很广泛的一种方法。因为在协同过滤使用过程中经常会遇到数据稀疏性的问题,通过矩阵分解将高维矩阵分解为低维矩阵再进行计算。目前主流的矩阵分解推荐算法主要是SVD的一些变种,比如FunkSVD,BiasSVD和SVD++。
五、优缺点
优点:
1.新异兴趣发现、不需要领域知识;
2.随着时间推移性能提高;
3.推荐个性化、自动化程度高;
4.能处理复杂的非结构化对象。
缺点:
1.数据稀疏性问题;
2.可扩展性问题;
3.新用户问题(冷启动);
4.质量取决于历史数据集;
5.系统开始时推荐质量差。