Mahout 简明教程
Mahout - Recommendation
本章涵盖了流行的机器学习技术 recommendation, 、其机制,以及如何编写实现 Mahout 推荐的应用程序。
Recommendation
您是否曾想过亚马逊如何想出推荐的一系列商品,以此吸引您注意您可能感兴趣的特定产品!
假设您想从亚马逊购买“Mahout in Action”这本书:
除了所选产品,亚马逊还显示了一系列相关推荐商品,如下所示。
此类推荐列表借助于 recommender engines 生成。Mahout 提供了几种类型的推荐引擎,例如:
-
user-based recommenders,
-
item-based recommenders, and
-
several other algorithms.
Mahout Recommender Engine
Mahout 拥有一个非分布式、非基于 Hadoop 的推荐引擎。您应该传递一个包含用户对商品首选项的文本文档。此引擎的输出将是特定用户对其他商品的估计首选项。
Building a Recommender using Mahout
以下是开发一个简单推荐引擎的步骤:
Step1: Create DataModel Object
PearsonCorrelationSimilarity 类的构造函数需要一个数据模型对象,该对象包含一个文件,其中包含产品的用户、商品和首选项详细信息。以下为数据模型文件示例:
1,00,1.0
1,01,2.0
1,02,5.0
1,03,5.0
1,04,5.0
2,00,1.0
2,01,2.0
2,05,5.0
2,06,4.5
2,02,5.0
3,01,2.5
3,02,5.0
3,03,4.0
3,04,3.0
4,00,5.0
4,01,5.0
4,02,5.0
4,03,0.0
DataModel 对象需要文件对象,其中包含输入文件的路径。如下所示,创建 DataModel 对象。
DataModel datamodel = new FileDataModel(new File("input file"));
Step2: Create UserSimilarity Object
使用 PearsonCorrelationSimilarity 如下所示创建 UserSimilarity 对象:
UserSimilarity similarity = new PearsonCorrelationSimilarity(datamodel);
Step3: Create UserNeighborhood object
此对象计算用户相对于给定用户的“邻域”。有两种类型的邻域:
-
NearestNUserNeighborhood - 此类计算一个包含给定用户最近 n 个用户的邻域。“最近”由给定的 UserSimilarity 定义。
-
ThresholdUserNeighborhood - 类计算了所有与给定用户相似度满足或超过特定阈值的用户的邻域。相似度由给定的 UserSimilarity 定义。
这里我们使用 ThresholdUserNeighborhood 并将偏好限制设置为 3.0。
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(3.0, similarity, model);
Step4: Create Recommender Object
创建 UserbasedRecomender 对象。将上述创建的所有对象传递给它的构造函数,如下所示。
UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
Step5: Recommend Items to a User
使用 Recommender 界面的 recommend() 方法向用户推荐产品。该方法需要两个参数。第一个表示要向其发送推荐的用户 ID,第二个表示要发送的推荐数。以下是 recommender() 方法的使用方法:
List<RecommendedItem> recommendations = recommender.recommend(2, 3);
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
Example Program
下面是一个设置推荐的示例程序。为用户 ID 为 2 的用户准备推荐。
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.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.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.UserBasedRecommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
public class Recommender {
public static void main(String args[]){
try{
//Creating data model
DataModel datamodel = new FileDataModel(new File("data")); //data
//Creating UserSimilarity object.
UserSimilarity usersimilarity = new PearsonCorrelationSimilarity(datamodel);
//Creating UserNeighbourHHood object.
UserNeighborhood userneighborhood = new ThresholdUserNeighborhood(3.0, usersimilarity, datamodel);
//Create UserRecomender
UserBasedRecommender recommender = new GenericUserBasedRecommender(datamodel, userneighborhood, usersimilarity);
List<RecommendedItem> recommendations = recommender.recommend(2, 3);
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
}catch(Exception e){}
}
}
使用以下命令编译程序:
javac Recommender.java
java Recommender
它应生成以下输出:
RecommendedItem [item:3, value:4.5]
RecommendedItem [item:4, value:4.0]