Mahout - 推荐

本章介绍了流行的机器学习技术,称为推荐,其机制,以及如何编写实施Mahout推荐的应用程序.

推荐

曾经想知道亚马逊如何推出一系列推荐商品以引起您对您可能感兴趣的特定产品的关注!

假设您要购买来自亚马逊的"Mahout in Action"一书:

Mahout in Action

除了所选产品外,亚马逊还会显示相关的推荐
项目列表,如下所示.

Items

此类推荐列表是在推荐引擎的帮助下生成的.
Mahout提供多种类型的推荐引擎,例如:

  • 基于用户的推荐人,

  • 基于项目的推荐人,

  • 其他几种算法.

Mahout推荐引擎

Mahout有一个非分布式,非基于Hadoop的推荐引擎.您应该传递具有项目用户首选项的文本文档.此引擎的输出将是特定用户对其他项目的估计偏好.

示例

考虑销售消费品的网站作为手机,小工具及其配件.如果我们想在这样的网站中实现Mahout的功能,那么我们
可以构建一个推荐引擎.该引擎分析用户过去的购买数据
并推荐基于此的新产品.

Mahout提供的用于构建推荐引擎的组件如下:

  • DataModel

  • UserSimilarity

  • ItemSimilarity

  • UserNeighborhood

  • 推荐人

从数据存储中,数据模型已准备好并通过作为推荐引擎的输入.推荐引擎为特定用户生成推荐.下面给出了推荐引擎的架构.

推荐引擎架构

推荐引擎

使用Mahout构建推荐器

以下是开发简单推荐器的步骤:

Step1:创建DataModel对象

PearsonCorrelationSimilarity 类的构造函数需要一个数据模型
对象,该对象包含一个包含Users,Items,
产品的首选项和首选项详细信息.以下是示例数据模型文件:

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:创建UserSimilarity对象

使用 PearsonCorrelationSimilarity <创建 UserSimilarity 对象/b>类如下所示:

 
 UserSimilarity similarity = new PearsonCorrelationSimilarity(datamodel);

步骤3:创建UserNeighborhood对象

此对象计算用户的"邻域",如给定用户.有两种类型
的邻域:

  • NearestNUserNeighborhood  - 此类计算一个邻域
    由给定用户的最近的 n 用户组成. "最近"由给定UserSimilarity的
    定义.

  • ThresholdUserNeighborhood  - 此类计算邻域
    由与给定用户的相似性达到或超过
    a特定阈值的所有用户组成.相似性由给定的UserSimilarity定义.

这里我们使用 ThresholdUserNeighborhood 并将首选项限制设置为
3.0.

UserNeighborhood neighborhood = new ThresholdUserNeighborhood(3.0,similar,model);

步骤4:创建推荐对象

创建 UserbasedRecomender 对象.将所有上述创建的对象传递给它的构造函数,如下所示.

UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);

第5步:向用户推荐商品

使用

 
 List< RecommendedItem> suggestions = recommender.recommend(2,3); 
 for(RecommendedItem推荐:推荐){
 System.out.println(推荐); 
}

示例程序

以下是一个示例程序设定推荐.为用户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]