Mahout 推荐
本章介绍了称为
推荐的流行机器学习技术、其机制以及如何编写实现 Mahout 推荐的应用程序。
推荐
有没有想过亚马逊是如何列出推荐商品的列表来吸引您关注您可能感兴趣的特定产品的!
假设您想从亚马逊购买"Mahout in Action"一书:
除了选中的商品外,亚马逊还会显示相关推荐商品列表,如下图。
此类推荐列表是在
推荐引擎的帮助下生成的。 Mahout 提供了多种类型的推荐引擎,例如:
user-based recommenders
item-based recommenders, and
several other algorithms
Mahout 推荐引擎
Mahout 有一个非分布式、非基于 Hadoop 的推荐引擎。您应该传递一个具有用户对项目首选项的文本文档。该引擎的输出将是特定用户对其他项目的估计偏好。
示例
考虑一个销售消费品(例如手机、小工具及其配件)的网站。如果我们想在这样的站点中实现 Mahout 的功能,那么我们可以构建一个推荐引擎。该引擎会分析用户过去的购买数据,并据此推荐新产品。
Mahout 提供的构建推荐引擎的组件如下:
DataModel
UserSimilarity
ItemSimilarity
UserNeighborhood
Recommender
从数据存储中,准备数据模型并作为输入传递给推荐引擎。推荐引擎为特定用户生成推荐。下面给出推荐引擎的架构。
推荐引擎架构
使用 Mahout 构建推荐器
以下是开发简单推荐系统的步骤:
第一步:创建数据模型对象
PearsonCorrelationSimilarity 类 req 的构造函数uires 一个数据模型对象,该对象包含一个文件,其中包含产品的用户、项目和首选项详细信息。这是示例数据模型文件:
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"));
步骤 2:创建 UserSimilarity 对象
使用
PearsonCorrelationSimilarity 类创建
UserSimilarity 对象,如下所示:
UserSimilarity similarity = new PearsonCorrelationSimilarity(datamodel);
Step3:创建 UserNeighborhood 对象
这个对象计算用户的"邻居",比如给定用户。有两种类型的社区:
NearestNUserNeighborhood-此类计算由距给定用户最近的 n 个用户组成的邻域。 "最近"由给定的 UserSimilarity 定义。
ThresholdUserNeighborhood-此类计算由与给定用户的相似度达到或超过特定阈值的所有用户组成的邻域。相似性由给定的 UserSimilarity 定义。
这里我们使用
ThresholdUserNeighborhood 并将偏好限制设置为 3.0。
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(3.0, similarity, model);
Step4:创建推荐对象
创建
UserbasedRecomender 对象。将上面创建的所有对象传递给它的构造函数,如下所示。
UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
步骤 5:向用户推荐商品
使用
Recommender 接口的recome() 方法向用户推荐产品。此方法需要两个参数。第一个代表我们需要向其发送推荐的用户的用户 ID,第二个代表要发送的推荐数量。下面是
recommender() 方法的用法:
List<RecommendedItem> recommendations = recommender.recommend(2, 3);
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
示例程序
下面给出了一个设置推荐的示例程序。为用户 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]