Mahout – 推荐
Mahout – 推荐
本章介绍了称为推荐的流行机器学习技术、其机制以及如何编写实现 Mahout 推荐的应用程序。
推荐
有没有想过亚马逊是如何列出推荐商品的清单来吸引您注意您可能感兴趣的特定产品的!
假设您想从亚马逊购买“Mahout in Action”一书:
除了选定的产品外,亚马逊还会显示相关推荐项目列表,如下所示。
此类推荐列表是在推荐引擎的帮助下生成的。Mahout 提供了几种类型的推荐引擎,例如:
- 基于用户的推荐,
- 基于项目的推荐,以及
- 其他几种算法。
Mahout 推荐引擎
Mahout 有一个非分布式、非基于 Hadoop 的推荐引擎。您应该传递具有用户对项目首选项的文本文档。该引擎的输出将是特定用户对其他项目的估计偏好。
例子
考虑一个销售消费品(如手机、小工具及其配件)的网站。如果我们想在这样的站点中实现 Mahout 的功能,那么我们可以构建一个推荐引擎。该引擎分析用户过去的购买数据,并在此基础上推荐新产品。
Mahout 提供的构建推荐引擎的组件如下:
- 数据模型
- 用户相似度
- 物品相似度
- 用户邻居
- 推荐人
从数据存储中,准备好数据模型并将其作为输入传递给推荐引擎。推荐引擎为特定用户生成推荐。下面给出了推荐引擎的架构。
推荐引擎架构
使用 Mahout 构建推荐器
以下是开发简单推荐系统的步骤:
步骤 1:创建 DataModel 对象
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"));
步骤 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);
Step5:向用户推荐商品
使用Recommender接口的推荐()方法向用户推荐产品。此方法需要两个参数。第一个代表我们需要向其发送推荐的用户的用户 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]