Mahout 介绍
Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。
Mahout使用了Taste来提高协同过滤算法的实现,它是一个基于Java实现的可扩展的,高效的推荐引擎。Taste既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的推荐算法。同时,Taste不仅仅只适用于Java应用程序,它可以作为内部服务器的一个组件以HTTP和Web Service的形式向外界提供推荐的逻辑。Taste的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。
协同过滤介绍
协同过滤是目前推荐系统中使用最广泛也是最成熟的一种推荐算法,分为基于用户的协同过滤(User-based CF)和基于项目的协同过滤(Item-based CF),它们都是基于邻域的推荐。协同过滤主要分为三个步骤:用户项目评分矩阵的建立、相似度计算、评分预测。其中相似度计算是最核心的部分,后续的评分预测是在此基础上完成的,相似度的计算直接决定着推荐系统的质量,如图。
基于用户的 CF 的基本思想相当简单,基于用户对物品的偏好找到相邻邻居用户,然后将邻居用户喜欢的推荐给当前用户。计算上,就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,找到 K 邻居后,根据邻居的相似度权重以及他们对物品的偏好,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。下图给出了一个例子,对于用户 A,根据用户的历史偏好,这里只计算得到一个邻居 - 用户 C,然后将用户 C 喜欢的物品 D推荐给用户 A。
如何计算相似的用户
常见计算公式如下:
欧几里得距离,如图:
如下图所示,其中dist(A,B)为三维空间中两点间的距离。
拓展到n维空间时的一般性公式为:
使用Mahout 实现推荐
这里我采用的将用户的行为数据保存到.csv 文件中,通过文件去构建DataModel,mahout也提供了连接数据库的方式去构建。生成.csv 文件的代码在这里不贴了。
数据格式
public List<RecommendedItem> getRecommendItems(Long uid) throws Exception{
List<RecommendedItem> recommendedItemList = null;
List<Map<String,String>> songs = new ArrayList<>();
String path = CsvUtils.getSysPath();
//"comment.csv",
String [] files = {"comment.csv"};
for(String item :files){
String pathName = path+item;
//准备数据 这里是电影评分数据
File file = new File(pathName);
//将数据加载到内存中,GroupLensDataModel是针对开放电影评论数据的
DataModel dataModel = new FileDataModel(file);
//计算相似度,相似度算法有很多种,欧几里得、皮尔逊等等。
UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
System.out.println(similarity);
//计算最近邻域,邻居有两种算法,基于固定数量的邻居和基于相似度的邻居,这里使用基于固定数量的邻居
UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(10, similarity, dataModel);
//构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于用户的协同过滤推荐
Recommender recommender = new GenericUserBasedRecommender(dataModel, userNeighborhood, similarity);
//给用户ID等于5的用户推荐10部电影
recommendedItemList = recommender.recommend(uid, 4);
//打印推荐的结果
System.out.println("使用基于用户的协同过滤算法");
System.out.println("为用户"+uid+"推荐5个");
for (RecommendedItem recommendedItem : recommendedItemList) {
System.out.println(recommendedItem);
}
}
return recommendedItemList;
}
<!--推荐包-->
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-integration</artifactId>
<version>0.9</version>
</dependency>
相关系统演示
SSM - 基于mahout实现协同过滤推荐的插画交流平台
点我查看视频号中其他系统
参考资料
Mahout实例(UserCF,ItermCF,SlopOne)_kyrin_云中鹤的博客-CSDN博客
https://www.csdn.net/tags/NtjaAgzsMTY2MDUtYmxvZwO0O0OO0O0O.html
Mahout的taste推荐系统里的几种Recommender分析_beck_zhou的博客-CSDN博客
mahout推荐2 - jseven - 博客园
Mahout介绍和简单应用 - ahu-lichang - 博客园
Mahout推荐系统初试 - 简书
基于用户兴趣模型的推荐算法
Mahout推荐算法编程实践_wolvesqun的博客-CSDN博客
如何动手设计和构建推荐系统?看这里 - 知乎
MovieLens | GroupLens 测试数据