Mahout推荐算法编程实践-demo说明

引言java

Taste是曾经风靡一时的推荐算法框架,后来被并入Mahout中,Mahout的部分推荐算法基于Taste实现。算法

下文介绍基于Taste实现最经常使用的UserCF和ItemCF。apache

本文不涉及UserCF和ItemCF算法的介绍,这方面网上资料不少,本文仅介绍如何基于Mahout编程实现。编程

欢迎转载,请注明来源:框架

http://blog.csdn.net/u010967382/article/details/39183839 ide

步骤一:构建数据模型测试

UserCF和ItemCF算法的输入数据是用户偏好,用户偏好数据能够有两种形式:idea

  • 包含用户对目标评分的【用户ID,itemID,评分】 
  • 不包含评分的【用户ID,itemID】 

推荐算法的第一步是基于数据源构建数据模型,Taste构建数据模型的数据源能够有不少,好比JDBC,文件等。.net

下面仅介绍最经常使用的文件数据源:rest

  • 用户偏好数据包含评分 

示例代码:

DataModel dm = new FileDataModel(new File("E:\\testdata\\3columns")); 

  • 用户偏好数据不包含评分 

示例代码:

DataModel dm = new  GenericBooleanPrefDataModel(

GenericBooleanPrefDataModel

.toDataMap(new FileDataModel(new File("E:\\testdata\\2columns"))));

步骤二:指定距离(类似度)计算方法

建立好数据模型后,第二步须要指定一种计算“距离”的方法,由于在后续的步骤中须要计算user或item之间的“距离”。

Taste提供的计算距离的方法不少,如下仅介绍经常使用的方法:

  • 用户偏好数据包含评分    

欧氏距离:EuclideanDistanceSimilarity

皮尔森距离:PearsonCorrelationSimilarity

余弦距离:UncenteredCosineSimilarity

  • 用户偏好数据不包含评分   

曼哈顿距离:CityBlockSimilarity

对数似然距离: LogLikelihoodSimilarity

 

示例代码:

UserSimilarity us = new  CityBlockSimilarity(dm);

ItemSimilarity is  = new  CityBlockSimilarity(dm); 

步骤三(仅UserCF须要):选择近邻算法

若是选择使用UserCF算法作推荐,则在完成类似度计算方法的指定后,须要指定近邻算法。

 

  • NearestNUserNeighborhood 

指定距离最近的N个用户做为邻居。

示例:UserNeighborhood unb = new NearestNUserNeighborhood(10, us, dm);

三个参数分别是: 邻居的个数,用户类似度,数据模型    

  • ThresholdUserNeighborhood 

指定距离最近的必定百分比的用户做为邻居。

示例:UserNeighborhood unb = new ThresholdUserNeighborhood(0.2, us, dm); 

三个参数分别是: 阀值(取值范围0到1之间),用户类似度,数据模型

 

步骤四:建立推荐器

实施推荐算法的最后一步就是建立推荐引擎,Taste为UserCF和ItemCF算法,针对有用户评分和没用户评分的状况,分别提供了推荐器:

  • 用户偏好数据包含评分   

示例代码:

UserCF:Recommender re = new  GenericUserBasedRecommender(dm, unb, us);

ItemCF:Recommender re = new  GenericItemBasedRecommender(dm, is);

 

  • 用户偏好数据不包含评分   

示例代码:

UserCF:Recommender re = new  GenericBooleanPrefUserBasedRecommender(dm, unb, us);

ItemCF:Recommender  re = new  GenericBooleanPrefItemBasedRecommender(dm, is);

题外话:

经过召回率和查准率的测试, CityBlockSimilarity + UserCF 的推荐效果最好。

示例代码:用户偏好数据不包含评分 + CityBlockSimilarity + UserCF

  • 用户偏好数据 

1,101

1,102

1,103

2,101

2,102

2,103

2,104

3,101

3,104

3,105

3,107

4,101

4,103

4,104

4,106

5,101

5,102

5,103

5,104

5,105

5,106

 

  • 代码 

import java.io.File;

import java.util.List;

import org.apache.mahout.cf.taste.impl.model.GenericBooleanPrefDataModel;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;

import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;

import org.apache.mahout.cf.taste.impl.recommender.GenericBooleanPrefUserBasedRecommender;

import org.apache.mahout.cf.taste.impl.similarity.CityBlockSimilarity;

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.Recommender;

import org.apache.mahout.cf.taste.similarity.UserSimilarity;

public class UserCFRecommender {

     public  static  void main(String[] args)  throws Exception {

        // 建立数据模型,不包含用户评分

        DataModel dm =  new GenericBooleanPrefDataModel(

                GenericBooleanPrefDataModel

                        .toDataMap( new FileDataModel( new File("E:\\testdata\\2columns"))));

        // 使用曼哈顿距离计算类似度

        UserSimilarity us =  new CityBlockSimilarity(dm);

 

        //指定NearestNUserNeighborhood做为近邻算法

        UserNeighborhood unb =  new NearestNUserNeighborhood(10, us, dm);

        

        // 构建不包含用户评分的UserCF推荐器

        Recommender re =  new GenericBooleanPrefUserBasedRecommender(dm, unb, us);

        

        // 输出推荐结果,为1号用户推荐5个商品

        List<RecommendedItem> list = re.recommend(1, 5);

         for (RecommendedItem recommendedItem : list) {

            System. out.println(recommendedItem.getItemID()+" : "+recommendedItem.getValue());   

        }

    }

}

相关文章
相关标签/搜索