推荐系统开源算法库——LibRec(http://www.librec.net)覆盖了70余个各类型的推荐算法,有效地解决了评分预测和物品推荐两大关键的推荐问题。项目结构清晰、代码风格良好、测试充分、注释与手册完善,基于GPL3.0协议代码开源。
最近,推荐系统获得快速发展,数以百计的新算法、新模型不断涌现。却让刚刚接触推荐算法的新人造成无所适从,也给那些有经验的人士带来不少困扰。不同的人对算法的理解可能大相径庭,更不用说是具体的实现。因此,为了解决算法实现和共享的问题,LibRec团队设计实现了基于Java的跨平台推荐框架,并以GPL-3.0协议在GitHub上开源共享。
通过多年的发展,项目团队经过上千次的代码提交,最新版本已经到2.0。目前为止,LibRec包含了矩阵分解、概率图模型等多种类型的70余个推荐算法,10个相似度度量方法,4个rating评估指标与10个ranking评估指标,5大类数据的分割方式以及2种不同格式的数据读取,满足绝大部分推荐系统的需求。因此,LibRec具有算法丰富、易于扩展、简单易用等突出特点。
项目系统结构
Data Structure包括常用的数据结构,如SparseMatrix、SparseVector等;Data Model主要负责数据的读取、分割、导入其他数据如社交关系等;Recommender主要负责模型的训练(Inference),预测(Prediction),相似度衡量(Similarity),以及模型的持久化(Persistence);最终结果可以进行评估,或者过滤之后输出到文件。总体来说,LibRec项目拥有良好的结构,不同模块之间耦合度非常低,针对某个模块的开发通常无需关心其他模块的实现。以实现新的分割方式为例,用户只需继承Splitter接口抽象类,根据相应的逻辑重写splitData()方法即可。
基于LibRec来运行推荐算法就如同搭积木一样简单,其工作流程如上图所示。首先设置好相关参数配置,然后实例化数据并测试分割,调用推荐算法训练学习,最后对推荐结果进行过滤和评估。示例程序:
publicstatic void main(String[] args) throws Exception{
// build data model
Configuration conf = new Configuration();
conf.set("dfs.data.dir", "path/to/data/folder/");
Randoms.seed(1);
TextDataModel dataModel = new TextDataModel(conf);
dataModel.buildDataModel();
// build recommendercontext
RecommenderContextcontext = new RecommenderContext(conf, dataModel);
// build similarity
conf.set("rec.recommender.similarity.key","item");
RecommenderSimilarity similarity = new PCCSimilarity();
similarity.buildSimilarityMatrix(dataModel);
context.setSimilarity(similarity);
// build recommender
conf.set("rec.neighbors.knn.number", "5");
Recommender recommender = new ItemKNNRecommender();
recommender.setContext(context);
// run recommenderalgorithm
recommender.recommend(context);
// evaluate therecommended result
RecommenderEvaluatorevaluator = new RMSEEvaluator();
System.out.println("RMSE:"+ recommender.evaluate(evaluator));
}
调用了ItemKNN算法,采用RMSE对结果进行评估。用户可以根据实际应用,采用其他算法与评估器来进行推荐计算。LibRec的参数配置是在配置文件中设定的,主要分为两部分。一部分是流程控制参数(默认加载),与推荐算法无关;另一部分是与推荐算法相关的参数。
GitHub:https://github.com/guoguibing/librec