Mahout推荐系统初试
2018-10-29 本文已影响79人
Wumpus
Mahout是Apache Software Foundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用Apache Hadoop库,Mahout可以有效地扩展到云中。 —— 《百度百科》
在 Mahout 实现的机器学习算法
Mahout 实现的机器学习算法Taste简介
Taste是Apache Mahout提供的一个协同过滤算法的高效实现,它是一个基于Java实现的可扩展的,高效的推荐引擎。Taste既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的推荐算法。同时,Taste不仅仅只适用于Java应用程序,它可以作为内部服务器的一个组件以HTTP和Web Service 的形式向外界提供推荐的逻辑。
Taste 由以下组件组成:
- DataModel:DataModel是用户喜好信息的抽象接口,它的具体实现支持从任意类型的数据源抽取用户喜好信息。Taste默认提供JDBCDataModel和FileDataModel,分别支持从数据库和文件中读取用户的喜好信息。
- UserSimilarity和ItemSimilarity:UserSimilarity用于定义两个用户间的相似度,它是基于协同过滤的推荐引擎的核心部分,可以用来计算用户的“邻居”,这里我们将与当前用户口味相似的用户称为他的邻居。ItemSimilarity类似的,计算内容之间的相似度。
- UserNeighborhood:用于基于用户相似度的推荐方法中,推荐的内容是基于找到与当前用户喜好相似的“邻居用户”的方式产生的。UserNeighborhood定义了确定邻居用户的方法,具体实现一般是基于UserSimilarity计算得到的。
- Recommender:Recommender是推荐引擎的抽象接口,Taste 中的核心组件。程序中,为它提供一个DataModel,它可以计算出对不同用户的推荐内容。实际应用中,主要使用它的实现类GenericUserBasedRecommender或者GenericItemBasedRecommender,分别实现基于用户相似度的推荐引擎或者基于内容的推荐引擎。
基于Taste的协同过滤推荐系统
数据准备
随机模拟一份数据,如图,为mysql中的一个表,uid代表用户id,iid代表物品id,score代表用户打分,也可以直接用二进制文本保存数据:
MySQL中随机模拟的数据
引入maven包
<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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
基于用户的协同过滤代码(还有基于物品,SlopeOne,SVD的推荐器,代码雷同,不贴出来了)
package com.example;
import java.io.File;
import java.util.List;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public class TestMahout {
public static void main(String[] args) throws Exception {
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUseSSL(true);
dataSource.setServerName("your_server_name");
dataSource.setPort(your_port);
dataSource.setUser("your_user_name");
dataSource.setPassword("your_password");
dataSource.setDatabaseName("your_database_name");
JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "your_table_name", "uid", "iid",
"score", "ts");
// 基于文件构建模型
// DataModel dataModel = new FileDataModel(new File("C:\\Users\\l00382753\\Desktop\\test.txt"));
// 相似度计算(皮尔森相似度)
UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
// 设置相似用户阈值(或使用NearestNUserNeighborhood)
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, dataModel);
// 基于以上数据创建推荐器(这里使用的是基于用户的推荐,还有GenericItemBasedRecommender等推荐器)
Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
// 给用户推荐物品(这里是给用户4推荐5个物品)
List<RecommendedItem> recommendItems = recommender.recommend(4, 5);
// 打印结果
for (RecommendedItem recommendedItem : recommendItems) {
System.out.println(recommendedItem);
}
}
}