Mahout - 推荐系统



本章涵盖了流行的机器学习技术,称为推荐系统,其机制以及如何编写实现 Mahout 推荐系统的应用程序。

推荐系统

您是否曾经想过亚马逊是如何提出推荐商品列表,以吸引您关注您可能感兴趣的特定产品的!

假设您想从亚马逊购买“Mahout in Action”这本书

Mahout in Action

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

Items

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

  • 基于用户的推荐器,
  • 基于项目的推荐器,以及
  • 其他多种算法。

Mahout 推荐引擎

Mahout 拥有一个非分布式、非基于 Hadoop 的推荐引擎。您应该传递一个包含用户对商品偏好的文本文档。此引擎的输出将是特定用户对其他商品的估计偏好。

示例

考虑一个销售消费品(如手机、电子产品及其配件)的网站。如果我们想在这样的网站上实现 Mahout 的功能,那么我们可以构建一个推荐引擎。此引擎分析用户的过去购买数据,并根据这些数据推荐新产品。

Mahout 提供以下组件来构建推荐引擎

  • 数据模型 (DataModel)
  • 用户相似度 (UserSimilarity)
  • 项目相似度 (ItemSimilarity)
  • 用户邻域 (UserNeighborhood)
  • 推荐器 (Recommender)

从数据存储中准备数据模型,并将其作为输入传递给推荐引擎。推荐引擎为特定用户生成推荐。以下是推荐引擎的架构。

推荐引擎架构

Recommender Engine

使用 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);

步骤 3:创建 UserNeighborhood 对象

此对象计算与给定用户类似的“用户邻域”。邻域有两种类型

  • NearestNUserNeighborhood - 此类计算一个邻域,该邻域包含与给定用户最近的 n 个用户。“最近”由给定的 UserSimilarity 定义。

  • ThresholdUserNeighborhood - 此类计算一个邻域,该邻域包含所有与给定用户的相似度达到或超过某个阈值的用户的相似度。相似度由给定的 UserSimilarity 定义。

这里我们使用 ThresholdUserNeighborhood 并将偏好限制设置为 3.0。

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

步骤 4:创建 Recommender 对象

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

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

步骤 5:向用户推荐商品

使用 Recommender 接口的 recommend() 方法向用户推荐产品。此方法需要两个参数。第一个表示需要向其发送推荐的用户 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]
广告