协同过滤(CollaborativeFiltering,CF)是推荐系统广泛使用的一种技术,它主要通过考虑用户(User)与用户之间、物品(Item)与物品之间的相似度(Similarity),来向用户推荐物品,常被用在电商网站中。其中,在推荐系统中最常使用的协同过滤方法,有如下4种:
对象相似性度量
Mahout采用了log-likelihoodratio(LLR)的方法计算相似度,对于事件A和事件B,我们考虑两个事件发生的次数,具有如下事件矩阵:
下面,我们会对上面提到的4种协同过滤方法进行详细说明,其中会结合ApacheMahout,并给出相应的实现代码,以求能够更好地理解各种协同过滤方法。
基于用户的协同过滤推荐
基于用户的协同过滤推荐,比较适合于用户数量少于物品数量的应用,这样,通过更多的用户对物品的偏好行为历史数据,维护用户的相似关系,能够更好地计算出用户的相似性。
基于物品的协同过滤推荐
对于编号为200的用户,使用对数似然(PearsonCorrelationSimilarity)计算物品相似度,得到的Top10推荐物品及其评分列表,如下所示:
基于物品的协同过滤推荐,比较适合于物品远远少于用户的应用,这样可以更好地维护物品之间的相似关系。
基于模型的协同过滤推荐
我们选择使用MovieLens数据集,2亿的评分数据(大约有500多MB),首先将数据集进行分割:80%用作训练集,20%用作测试集,Mahout提供分割数据集的工具,分割执行如下命令:
这样,生成2个数据集:/test/shiyj/data/splitDS/probeSet和/test/shiyj/data/splitDS/trainingSet。
使用训练集/test/shiyj/data/splitDS/trainingSet来训练推荐模型,执行如下命令:
上面命令执行结果,数据会在/test/shiyj/data/output/als/目录下面,可以看到生成如下目录:
这些目录下的文件就是推荐模型对应的数据文件,可以用于后面步骤中的评估和最终推荐。
评估模型使用Mahout的evaluateFactorization命令,需要输入上一步生成的模型文件,如下所示:
可以看到,最后输出了RMSE,在文件/test/shiyj/data/output/als/rmse/rmse.txt中。
如果我们训练得到的模型在评估以后,误差能够满足实际推荐业务需要,则可以直接用于实际的推荐系统。Mahout提供了一个基于命令行的推荐方式,可以使用recommendfactorized命令,如下所示:
上面指定了,为每个用户选择Top10个物品作为推荐,并计算出了评分,执行上述命令,得到推荐结果,在目录/test/shiyj/data/output/als/recommendations中,该目录下的文件内容,示例如下所示:
实际应用中,为了加快在线上推荐系统的检索,这些结果,可以考虑将数据存储到ElasticSearch或者SolrCloud系统中,方便查询。
混合协同过滤推荐
我们可以想到,根据前面介绍的基本协同过滤推荐方法,作为入门,可以这样实现一个混合协同过滤系统: