一、简介
Taste 是 Apache Mahout提供的一个协同过滤算法的高效实现,它是一个基于 Java 实现的可扩展的,高效的推荐引擎。Taste 既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的推荐算法。同时,Taste 不仅仅只适用于 Java 应用程序,它可以作为内部服务器的一个组件以 HTTP 和 Web Service 的形式向外界提供推荐的逻辑(这个测试失败了....求具体流程)。Taste 的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。
二、接口说明
- DateModel
用户喜好信息的抽象接口,它的具体实现可能来自任意类型的数据源以抽取用户喜好信息。Taste提供了MySQLDataModel,方便用户通过JDBC和MySQL访问数据, 此外还通过FileDataModel提供了对文件数据源的支持。
- UserSimilarity 和 ItemSimilarity
用于定义两个用户间的相似度,它是基于协同过滤的推荐引擎的核心部分,可以用来计算用户的“邻居”,这里我们将与当前用户口味相似的用户称为他的邻居。ItemSimilarity 类似的,定义内容之间的相似度
- UserNeighborhood
用于基于用户相似度的推荐方法中,推荐的内容是基于找到与当前用户喜好相似的“邻居用户”的方式产生的。UserNeighborhood 定义了确定邻居用户的方法,具体实现一般是基于 UserSimilarity 计算得到的。
- Recommender
Recommender 是推荐引擎的抽象接口,Taste中的核心组件。程序中,为它提供一个DataModel,它可以计算出对不同用户的推荐内容。实际应用中,主要使用它的实现类 GenericUserBasedRecommender 或者 GenericItemBasedRecommender,分别实现基于用户相似度的推荐引擎或者基于内容的推荐引擎。
三、案例
(1)下载测试数据
http://www.grouplens.org/node/73
(2)拷贝到指定目录
cp ml-1m.zip /home/hadoop/data/mahout cd /home/hadoop/data/mahout unzip ml-1m.zip # 电影信息文件 格式为MovieID::MovieName::MovieTags cp movies.dat integration/src/main/resources/org/apache/mahout/cf/taste/example/grouplens/ # 打分信息文件 格式为UserID::MovieID::Rating::Timestamp cp ratings.dat integration/src/main/resources/org/apache/mahout/cf/taste/example/grouplens/ mvn install -DskipTests
(3)修改Pom文件
<dependency> <groupId>${project.groupId}</groupId> <artifactId>mahout-examples</artifactId> <version>0.8</version> </dependency>
(4)使用jetty测试
cd integration mvn jetty:run
访问地址查看:http://localhost:8080/mahout-integration/RecommenderServlet?userID=1
(5)命令行方式测试
mvn -q exec:java -Dexec.mainClass="org.apache.mahout.cf.taste.example.grouplens.GroupLensRecommenderEvaluatorRunner" -Dexec.args="-i /home/hadoop/data/mahout/ml-1m/ratings.dat"
四、Taste代码简述
// 1. 选择数据源 // 数据源格式为UserID,MovieID,Ratings // 使用文件型数据接口 DataModel model = new FileDataModel(new File("/Users/matrix/Documents/plan/test/ratings.txt")); // 2. 实现相似度算法 // 使用PearsonCorrelationSimilarity实现UserSimilarity接口, 计算用户的相似度 // 其中PearsonCorrelationSimilarity是基于皮尔逊相关系数计算相似度的实现类 // 其它的还包括 // EuclideanDistanceSimilarity:基于欧几里德距离计算相似度 // TanimotoCoefficientSimilarity:基于 Tanimoto 系数计算相似度 // UncerteredCosineSimilarity:计算 Cosine 相似度 UserSimilarity similarity = new PearsonCorrelationSimilarity(model); // 可选项 similarity.setPreferenceInferrer(new AveragingPreferenceInferrer(model)); // 3. 选择邻居用户 // 使用NearestNUserNeighborhood实现UserNeighborhood接口, 选择最相似的三个用户 // 选择邻居用户可以基于'对每个用户取固定数量N个最近邻居'和'对每个用户基于一定的限制,取落在相似度限制以内的所有用户为邻居' // 其中NearestNUserNeighborhood即基于固定数量求最近邻居的实现类 // 基于相似度限制的实现是ThresholdUserNeighborhood UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, similarity, model); // 4. 实现推荐引擎 // 使用GenericUserBasedRecommender实现Recommender接口, 基于用户相似度进行推荐 Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); Recommender cachingRecommender = new CachingRecommender(recommender); List<RecommendedItem> recommendations = cachingRecommender.recommend(1234, 10); // 输出推荐结果 for (RecommendedItem item : recommendations) { System.out.println(item.getItemID() + "\t" + item.getValue()); }