【甘道夫】Mahout推荐算法编程实践

引言

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

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

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


欢迎转载,请注明来源:

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


步骤一:构建数据模型

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

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

推荐算法的第一步是基于数据源构建数据模型,Taste构建数据模型的数据源可以有很多,比如JDBC,文件等。

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

  • 用户偏好数据包含评分

示例代码:

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());

}

}

}

时间: 2024-08-05 13:03:47

【甘道夫】Mahout推荐算法编程实践的相关文章

【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用

今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 +  Mahout0.6(0.8和0.9版本都不包含该算法.Mahout0.6可以和Hadoop2.2.0和平共处有点意外orz) 部分输入数据,输入数据一行代表一个购物篮: 4750,19394,25651,6395,5592 26180,10895,24571,23295,20578,27791,2729,8637 7

【甘道夫】通过Mahout构建推荐系统--通过IDRescorer扩展评分规则

通过Mahout构建推荐系统时,假设我们须要添?某些过滤规则(比方:item的创建时间在一年以内),则须要用到IDRescorer接口,该接口源代码例如以下: package org.apache.mahout.cf.taste.recommender; /** * <p> * A {@link Rescorer} which operates on {@code long} primitive IDs, rather than arbitrary {@link Object}s. * Thi

【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解

http://acm.hdu.edu.cn/showproblem.php?pid=1507 大致题意:在一个n*m的格子上,黑色的地方不可用,问在白色格子上最多可放多少1*2的矩阵. 思路:建图,每个白色格子与它临近的上下左右的白色格子建边,求最大匹配,答案为最大匹配/2,因为是双向图.最后输出匹配边时,当找到一组匹配边记得将该边标记,以防重复计算. #include <stdio.h> #include <algorithm> #include <set> #inc

【甘道夫】MapReduce实现矩阵乘法--实现代码

之前写了一篇分析MapReduce实现矩阵乘法算法的文章:[甘道夫]Mapreduce实现矩阵乘法的算法思路 为了让大家更直观的了解程序执行,今天编写了实现代码供大家参考. 编程环境: java version "1.7.0_40" Eclipse Kepler Windows7 x64 Ubuntu 12.04 LTS Hadoop2.2.0 Vmware 9.0.0 build-812388 输入数据: A矩阵存放地址:hdfs://singlehadoop:8020/wordsp

【甘道夫】用贝叶斯文本分类测试打过1329-3.patch的Mahout0.9 on Hadoop2.2.0

引言 接前一篇文章<[甘道夫]Mahout0.9 打patch使其支持 Hadoop2.2.0> http://blog.csdn.net/u010967382/article/details/39088035, 为Mahout0.9打过Patch编译成功后,使用贝叶斯文本分类来测试Mahout0.9对Hadoop2.2.0的兼容性. 欢迎转载,转载请注明出处: http://blog.csdn.net/u010967382/article/details/39088285 步骤一:将20ne

【甘道夫】Hadoop2.2.0环境使用Sqoop-1.4.4将Oracle11g数据导入HBase0.96,并自动生成组合行键

目的: 使用Sqoop将Oracle中的数据导入到HBase中,并自动生成组合行键! 环境: Hadoop2.2.0 Hbase0.96 sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz Oracle11g jdk1.7 Ubuntu14 Server 这里关于环境吐槽一句: 最新版本的Sqoop1.99.3功能太弱,只支持导入数据到HDFS,没有别的任何选项,太土了!(如有不同意见欢迎讨论给出解决方案) 命令: sqoop import --connect

【甘道夫】Hadoop2.2.0 NN HA详细配置+Client透明性试验【完整版】

引言: 前面转载过一篇团队兄弟[伊利丹]写的NN HA实验记录,我也基于他的环境实验了NN HA对于Client的透明性. 本篇文章记录的是亲自配置NN HA的详细全过程,以及全面测试HA对客户端访问透明性的全过程,希望对大家有帮助. 实验环境: Hadoop2.2.0的4节点集群,ZK节点3个(ZK节点数最好为奇数个),hosts文件和各节点角色分配如下: hosts: 192.168.66.91 master 192.168.66.92 slave1 192.168.66.93 slave2

【甘道夫】Win7x64环境下编译Apache Hadoop2.2.0的Eclipse小工具

目标: 编译Apache Hadoop2.2.0在win7x64环境下的Eclipse插件 环境: win7x64家庭普通版 eclipse-jee-kepler-SR1-win32-x86_64.zip Apache Ant(TM) version 1.8.4 compiled on May 22 2012 java version "1.7.0_45" 參考文章: http://kangfoo.u.qiniudn.com/article/2013/12/build-hadoop2x

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情.简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口:困难是因为我们不了解算法细节,很难去根据业务的场景进行算法配置和调优. 本文将深入算法API去解释Mahout推荐算法底层的一些事. 1. Mahout推荐算法介绍 Mahoutt推荐算法,从数据处理能力上,可以划分为2类: 单机内存算法实现 基于Hadoop的分步式算法实现 1). 单机内存算法实现 单机内存算法实现:就是在单机下运行的算法