持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
1、前言
现在开源的推荐系统有很多很多,但大部分都是基于Python、C++的,同时门槛很高,应用到项目里很困难,要费大的精力。Mahout是一个纯Java编写包含协同过滤推荐算法的开源项目,非常适合初学者,或者紧急需求的项目来使用。(PS:本CV战士就是突然接到了要做一个简单的推荐系统的需求,开始恶补推荐系统,最后发现Mahout简直是初学小白的福音。)
2、Mahout简介
Mahout是Apache旗下一个基于Java编写的开源项目,提供一些可扩展的机器学习领域经典算法的实现,包括聚类、分类、推荐过滤等。本篇主要为大家介绍下推荐部分。
Mahout封装的推荐算法主要有:
3、主要类
-
Preference类: 表示每个用户或者物品的属性, 比如
1,101,5.0表示ID为1的用户对ID为101的物品进行了评分,评分为5.0; -
DataModel类: 表示所有的数据集合, 即Preference的聚合。DataModel可以从文件或者数据库中读取(PS:仅支持MySQL,其他数据库u要自己继承接口实现);
-
Similarity类: 表示所有Preference之间的相似度, 所有的用户或者物品都通过Similarty建立起了联系;
-
Neighberhood类:邻域,记录每个用户或者物品相似的物品集, 方便后期调用;
-
Recommender类: 推荐算法, 整个推荐系统的核心(PS:也可以自己实现);
代码结构如下:
Recommender接口主要方法:
1、recommend(long userID, int howMany):给userID推荐howMany个物品
2、recommend(long userID, int howMany, IDRescorer rescorer):给userID推荐howMany个物品,同时可以根据rescorer对推荐结果重新排序。
3、estimatePreference(long userID, long itemID): 当打分为空时,估计用户对物品的打分
4、setPreference(long userID, long itemID, float value): 对用户,物品,分值进行赋值
5、removePreference(long userID, long itemID): 删除用户对物品的打分
6、getDataModel(): 获取推荐数据
4、示例
public class HelloMahout {
public static void main(String[] args) {
try {
String path = HelloMahout.class.getClassLoader().getResource("data/info.csv").getPath();
//将数据加载到内存中
DataModel model = new FileDataModel(new File(path));
//计算相似度,相似度算法有很多种,欧几里得、皮尔逊等。
UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(model);
//设置邻域数量
UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(3,userSimilarity, model);
//使用基于用户的协同过滤推荐
Recommender recommender = new GenericUserBasedRecommender(model,userNeighborhood, userSimilarity);
//获取推荐结果
List<RecommendedItem> recommend = recommender.recommend(1, 5);
for (RecommendedItem item : recommend) {
logger.info(item);
}
} catch (Exception e) {
logger.error(e.getMessage() , e );
}
}
}
5、最后
可以看到使用Mahout做推荐系统,入门真的非常简单。但同时,缺点也很明显,对于推荐算法的实现细节不了解,针对业务改动起来也很复杂。最后,在学习Mahout时,其作者写的《Mahout实战》令我受益匪浅,这里也一并分享给大家。
链接:pan.baidu.com/s/1aqC2OHXH… 提取码:4x5c
好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊