基于Hadoop的商品推荐系统

推荐:
基于特征:
基于行为:
基于物品:
基于用户:不确定性

使用协同过滤算法
相似度计算方式:
1.欧式距离:(x1,y1)(x2,y2)(x3,y3),比较三点距离,越近越相似

2.余弦夹角

3.共现矩阵
物品的相似度:物品共现次数


这个项目我是计算
推荐结果=用户的购买向量*物品的相似度矩阵

物品的相似度:物品的共现次数

1.项目名:GRES【Goods Recommend Engine System】
2.添加Maven依赖:pom.xml
3.创建包:
com.briup.bigdata.project.gres
|–step1
|–step2
|–…
|–utils
4.将集群上的四个xml配置文件放到resources目录中。
5.在HDFS集群的根目录下创建目录:
/gres
|–rawdata
|-----matrix.txt
|–step1
|–…
6.开始编程。
原始数据:(部分数据,这里为了方便我将用户评价分数改为是否购买,1是指购买)
10001 20001 1
10001 20002 1
10001 20005 1
10001 20006 1
10001 20007 1
10002 20003 1
10002 20004 1
10002 20006 1
10003 20002 1
10003 20007 1
10004 20001 1
10004 20002 1
10004 20005 1
10004 20006 1
10005 20001 1
10006 20004 1
10006 20007 1

a.计算用户购买商品的列表类名:UserBuyGoodsList.javaUserBuyGoodsListUserBuyGoodsListMapperUserBuyGoodsListReducer结果数据:10001   20001,20005,20006,20007,2000210002  20006,20003,2000410003  20002,2000710004    20001,20002,20005,2000610005    2000110006  20004,20007b.计算商品的共现关系文件:GoodsCooccurrenceList.java类名:GoodsCooccurrenceListGoodsCooccurrenceListMapperGoodsCooccurrenceListReducer数据来源:第1步的计算结果计算结果:20001   2000120001  2000120001  2000220001  2000520001  2000620001  2000720001  2000120001  2000620001  2000520001  2000220002  2000720002  2000120002  2000520002  2000620002  2000720002  2000220002  2000620002  2000520002  2000220002  2000120002  2000220003  2000320003  2000420003  2000620004  2000420004  2000720004  2000420004  2000620004  2000320005  2000220005  2000620005  2000520005  2000120005  2000520005  2000620005  2000720005  2000120005  2000220006  2000520006  2000320006  2000420006  2000120006  2000220006  2000620006  2000220006  2000620006  2000720006  2000620006  2000120006  2000520007  2000620007  2000420007  2000720007  2000220007  2000720007  2000520007  2000120007  2000220007  20007c.计算商品的共现次数(共现矩阵)文件:GoodsCooccurrenceMatrix.java类名:GoodsCooccurrenceMatrixGoodsCooccurrenceMatrixMappperGoodsCooccurrenceMatrixReducer数据来源:第2步的结果计算结果:20001    20001:3,20002:2,20005:2,20006:2,20007:120002    20001:2,20002:3,20005:2,20006:2,20007:220003    20003:1,20004:1,20006:120004    20003:1,20004:2,20006:1,20007:120005    20001:2,20002:2,20005:2,20006:2,20007:120006    20001:2,20002:2,20003:1,20004:1,20005:2,20006:3,20007:120007    20001:1,20002:2,20004:1,20005:1,20006:1,20007:3d.计算用户的购买向量文件:UserBuyGoodsVector.java类名:UserBuyGoodsVectorUserBuyGoodsVectorMapperUserBuyGoodsVectorReducer源数据:第1步的结果或者最原始数据。计算结果:20001  10001:1,10004:1,10005:120002    10001:1,10003:1,10004:120003    10002:120004    10002:1,10006:120005    10001:1,10004:120006    10001:1,10002:1,10004:120007    10001:1,10003:1,10006:1

e.商品共现矩阵乘以用户购买向量,形成临时的推荐结果。
文件:MultiplyGoodsMatrixAndUserVector.java

 类名:MultiplyGoodsMatrixAndUserVectorFirstMapperMultiplyGoodsMatrixAndUserVectorSecondMapper文件:MultiplyGoodsMatrixAndUserVectorReducer思考:文件的来源,来自于两个文件,第一个是第3步的结果(物品的共现矩阵),第二个文件是第4步的结果(用户的购买向量)。所以在一个MR程序中,需要使用两个自定义Mapper分别处理,然后定义一个自定义Reducer来处理这两个Mapper的中间结果。1.保证两个Mapper的Key要相同。2.两个Mapper的数据输出的Key和Value的数据类型是一致的。3.在作业配置中,对于Mapper端的配置需要使用MultipleInputs.addInputPath(job,数据的输入路径,数据输入的格式控制器.class,执行的Mapper类.class);原始数据:第3步和第4步的结果数据。计算结果:10001,20001  210001,20001    210001,20001    310001,20001    110001,20001    210001,20002    310001,20002    210001,20002    210001,20002    210001,20002    210001,20003    110001,20004    110001,20004    110001,20005    210001,20005    210001,20005    210001,20005    110001,20005    210001,20006    210001,20006    310001,20006    210001,20006    110001,20006    210001,20007    210001,20007    110001,20007    110001,20007    310001,20007    110002,20001    210002,20002    210002,20003    110002,20003    110002,20003    110002,20004    110002,20004    210002,20004    110002,20005    210002,20006    310002,20006    110002,20006    110002,20007    110002,20007    110003,20001    210003,20001    110003,20002    310003,20002    210003,20004    110003,20005    210003,20005    110003,20006    210003,20006    110003,20007    210003,20007    310004,20001    210004,20001    210004,20001    310004,20001    210004,20002    310004,20002    210004,20002    210004,20002    210004,20003    110004,20004    110004,20005    210004,20005    210004,20005    210004,20005    210004,20006    210004,20006    310004,20006    210004,20006    210004,20007    210004,20007    110004,20007    110004,20007    110005,20001    310005,20002    210005,20005    210005,20006    210005,20007    110006,20001    110006,20002    210006,20003    110006,20004    210006,20004    110006,20005    110006,20006    110006,20006    110006,20007    110006,20007    3f.对第5步计算的推荐的零散结果进行求和。文件:MakeSumForMultiplication.javaMakeSumForMultiplicationMakeSumForMultiplicationMapperMakeSumForMultiplicationReducer原始数据:第5步的计算结果计算结果:10001,20001   1010001,20002   1110001,20003   110001,20004    210001,20005    910001,20006    1010001,20007   810002,20001    210002,20002    210002,20003    310002,20004    410002,20005    210002,20006    510002,20007    210003,20001    310003,20002    510003,20004    110003,20005    310003,20006    310003,20007    510004,20001    910004,20002    910004,20003    110004,20004    110004,20005    810004,20006    910004,20007    510005,20001    310005,20002    210005,20005    210005,20006    210005,20007    110006,20001    110006,20002    210006,20003    110006,20004    310006,20005    110006,20006    210006,20007    4g.数据去重,在推荐结果中去掉用户已购买的商品信息。文件:DuplicateDataForResult.java类名:DuplicateDataForResultFirstMapperDuplicateDataForResultSecondMapperDuplicateDataForResultReducer数据来源:1.FirstMapper处理用户的购买列表数据。2.SecondMapper处理第6的推荐结果数据。计算结果:10001   20004   210001  20003   110002  20002   210002  20007   210002  20001   210002  20005   210003  20006   310003  20005   310003  20001   310003  20004   110004  20007   510004  20004   110004  20003   110005  20006   210005  20002   210005  20005   210005  20007   110006  20006   210006  20002   210006  20005   110006  20003   110006  20001   1h.将推荐结果保存到MySQL数据库中注意:1.保证表提前存在。grms.results(uid varchar(20),gid varchar(20),exp int)2.通过MR程序将HDFS集群上的数据保存到MySQL数据库中的时候,只能将最终输出的Key值保存到数据库中。3.自定义最终输出的Key的数据类型。自定义的类实现WritableComparable<自定义的类>,但是作为将数据从HDFS集群输出到MySQL数据库中的Key,还要实现DBWritable接口。readFields(ResultSet rs)write(PrepareStatement ps)A impl WC,DBW{private String uid;private String gid;private int exp;readFields(ResultSet rs){uid=rs.getString(1);}write(PrepareStatement ps){ps.setString(1,uid);ps.setString(2,gid);ps.setInt(1,exp);}}4.在作业配置中,需要使用DBConfiguration.setConfiguration()指定连接数据库的相关参数。参数1:和当前作业相关的配置对象,Configuration对象要通过Job对象来获取;参数2:"com.mysql.jdbc.Driver"参数3:"jdbc:mysql://ip:port/grms"参数4和5:"用户名"和"密码"。5.数据输出的格式控制需要使用DBOutputFormat。DBOutputFormat.setOutput();有三个参数:参数1:Job对象。参数2:数据库表名参数3:可变长参数,指的是往数据库中插入的列名。insert into 数据库表名 values(?,?,?);文件:SaveRecommendResultToDB.java类名:SaveRecommendResultToDBMapper<LW,Text,Text,Text>SaveRecommendResultToDBReducer<Text,Text,自定义的Key,NullWritable>数据来源:第7步的结果数据。数据去向:MySQL数据库,grms.resulti.构建作业流对象(JobControl),让程序自行提交作业。文件:GoodsRecommendationManagementSystemJobController.java类名:GoodsRecommendationManagementSystemJobController1.分别创建step1到step8的Job对象,然后进行各自的作业配置。Job job1=Job.getIns();2.创建8个ControlledJob对象,将上一步的Job对象转化成可被控制的作业。ControlledJob cj1=new CJ();cj1.setJob(job1);cj2.setJob(job2);3.对可被控制的作业添加依赖关系。cj2.addDepe...(cj1);4.构建JobControl对象,将8个可被控制的作业逐个添加。JobControl jc=new JobControl("");5.构建线程对象,并启动线程,执行作业。Thread t=new Thread(jc);t.start();

准确率:推荐结果/未购买商品总数;
覆盖率:推荐结果/商品总数;

数据集:80%数据参与计算,20%的数据参与算法评估;

基于Hadoop的商品推荐系统

基于特征:
基于行为:
基于用户:
基于商品:

推荐结果=用户的购买向量*物品的相似度矩阵

物品的相似度:物品的共现次数

1.项目名:GRES【Goods Recommend Engine System】
2.添加Maven依赖:pom.xml
3.创建包:
com.briup.bigdata.project.gres
|–step1
|–step2
|–…
|–utils
4.将集群上的四个xml配置文件放到resources目录中。
5.在HDFS集群的根目录下创建目录:
/gres
|–rawdata
|-----matrix.txt
|–step1
|–…
6.开始编程。
原始数据:
10001 20001 1
10001 20002 1
10001 20005 1
10001 20006 1
10001 20007 1
10002 20003 1
10002 20004 1
10002 20006 1
10003 20002 1
10003 20007 1
10004 20001 1
10004 20002 1
10004 20005 1
10004 20006 1
10005 20001 1
10006 20004 1
10006 20007 1

a.计算用户购买商品的列表类名:UserBuyGoodsList.javaUserBuyGoodsListUserBuyGoodsListMapperUserBuyGoodsListReducer结果数据:10001   20001,20005,20006,20007,2000210002  20006,20003,2000410003  20002,2000710004    20001,20002,20005,2000610005    2000110006  20004,20007b.计算商品的共现关系文件:GoodsCooccurrenceList.java类名:GoodsCooccurrenceListGoodsCooccurrenceListMapperGoodsCooccurrenceListReducer数据来源:第1步的计算结果计算结果:20001   2000120001  2000120001  2000220001  2000520001  2000620001  2000720001  2000120001  2000620001  2000520001  2000220002  2000720002  2000120002  2000520002  2000620002  2000720002  2000220002  2000620002  2000520002  2000220002  2000120002  2000220003  2000320003  2000420003  2000620004  2000420004  2000720004  2000420004  2000620004  2000320005  2000220005  2000620005  2000520005  2000120005  2000520005  2000620005  2000720005  2000120005  2000220006  2000520006  2000320006  2000420006  2000120006  2000220006  2000620006  2000220006  2000620006  2000720006  2000620006  2000120006  2000520007  2000620007  2000420007  2000720007  2000220007  2000720007  2000520007  2000120007  2000220007  20007c.计算商品的共现次数(共现矩阵)文件:GoodsCooccurrenceMatrix.java类名:GoodsCooccurrenceMatrixGoodsCooccurrenceMatrixMappperGoodsCooccurrenceMatrixReducer数据来源:第2步的结果计算结果:20001    20001:3,20002:2,20005:2,20006:2,20007:120002    20001:2,20002:3,20005:2,20006:2,20007:220003    20003:1,20004:1,20006:120004    20003:1,20004:2,20006:1,20007:120005    20001:2,20002:2,20005:2,20006:2,20007:120006    20001:2,20002:2,20003:1,20004:1,20005:2,20006:3,20007:120007    20001:1,20002:2,20004:1,20005:1,20006:1,20007:3d.计算用户的购买向量文件:UserBuyGoodsVector.java类名:UserBuyGoodsVectorUserBuyGoodsVectorMapperUserBuyGoodsVectorReducer源数据:第1步的结果或者最原始数据。计算结果:20001  10001:1,10004:1,10005:120002    10001:1,10003:1,10004:120003    10002:120004    10002:1,10006:120005    10001:1,10004:120006    10001:1,10002:1,10004:120007    10001:1,10003:1,10006:1

e.商品共现矩阵乘以用户购买向量,形成临时的推荐结果。
文件:MultiplyGoodsMatrixAndUserVector.java

 类名:MultiplyGoodsMatrixAndUserVectorFirstMapperMultiplyGoodsMatrixAndUserVectorSecondMapper文件:MultiplyGoodsMatrixAndUserVectorReducer思考:文件的来源,来自于两个文件,第一个是第3步的结果(物品的共现矩阵),第二个文件是第4步的结果(用户的购买向量)。所以在一个MR程序中,需要使用两个自定义Mapper分别处理,然后定义一个自定义Reducer来处理这两个Mapper的中间结果。1.保证两个Mapper的Key要相同。2.两个Mapper的数据输出的Key和Value的数据类型是一致的。3.在作业配置中,对于Mapper端的配置需要使用MultipleInputs.addInputPath(job,数据的输入路径,数据输入的格式控制器.class,执行的Mapper类.class);原始数据:第3步和第4步的结果数据。计算结果:10001,20001  210001,20001    210001,20001    310001,20001    110001,20001    210001,20002    310001,20002    210001,20002    210001,20002    210001,20002    210001,20003    110001,20004    110001,20004    110001,20005    210001,20005    210001,20005    210001,20005    110001,20005    210001,20006    210001,20006    310001,20006    210001,20006    110001,20006    210001,20007    210001,20007    110001,20007    110001,20007    310001,20007    110002,20001    210002,20002    210002,20003    110002,20003    110002,20003    110002,20004    110002,20004    210002,20004    110002,20005    210002,20006    310002,20006    110002,20006    110002,20007    110002,20007    110003,20001    210003,20001    110003,20002    310003,20002    210003,20004    110003,20005    210003,20005    110003,20006    210003,20006    110003,20007    210003,20007    310004,20001    210004,20001    210004,20001    310004,20001    210004,20002    310004,20002    210004,20002    210004,20002    210004,20003    110004,20004    110004,20005    210004,20005    210004,20005    210004,20005    210004,20006    210004,20006    310004,20006    210004,20006    210004,20007    210004,20007    110004,20007    110004,20007    110005,20001    310005,20002    210005,20005    210005,20006    210005,20007    110006,20001    110006,20002    210006,20003    110006,20004    210006,20004    110006,20005    110006,20006    110006,20006    110006,20007    110006,20007    3f.对第5步计算的推荐的零散结果进行求和。文件:MakeSumForMultiplication.javaMakeSumForMultiplicationMakeSumForMultiplicationMapperMakeSumForMultiplicationReducer原始数据:第5步的计算结果计算结果:10001,20001   1010001,20002   1110001,20003   110001,20004    210001,20005    910001,20006    1010001,20007   810002,20001    210002,20002    210002,20003    310002,20004    410002,20005    210002,20006    510002,20007    210003,20001    310003,20002    510003,20004    110003,20005    310003,20006    310003,20007    510004,20001    910004,20002    910004,20003    110004,20004    110004,20005    810004,20006    910004,20007    510005,20001    310005,20002    210005,20005    210005,20006    210005,20007    110006,20001    110006,20002    210006,20003    110006,20004    310006,20005    110006,20006    210006,20007    4g.数据去重,在推荐结果中去掉用户已购买的商品信息。文件:DuplicateDataForResult.java类名:DuplicateDataForResultFirstMapperDuplicateDataForResultSecondMapperDuplicateDataForResultReducer数据来源:1.FirstMapper处理用户的购买列表数据。2.SecondMapper处理第6的推荐结果数据。计算结果:10001   20004   210001  20003   110002  20002   210002  20007   210002  20001   210002  20005   210003  20006   310003  20005   310003  20001   310003  20004   110004  20007   510004  20004   110004  20003   110005  20006   210005  20002   210005  20005   210005  20007   110006  20006   210006  20002   210006  20005   110006  20003   110006  20001   1h.将推荐结果保存到MySQL数据库中注意:1.保证表提前存在。grms.results(uid varchar(20),gid varchar(20),exp int)2.通过MR程序将HDFS集群上的数据保存到MySQL数据库中的时候,只能将最终输出的Key值保存到数据库中。3.自定义最终输出的Key的数据类型。自定义的类实现WritableComparable<自定义的类>,但是作为将数据从HDFS集群输出到MySQL数据库中的Key,还要实现DBWritable接口。readFields(ResultSet rs)write(PrepareStatement ps)A impl WC,DBW{private String uid;private String gid;private int exp;readFields(ResultSet rs){uid=rs.getString(1);}write(PrepareStatement ps){ps.setString(1,uid);ps.setString(2,gid);ps.setInt(1,exp);}}4.在作业配置中,需要使用DBConfiguration.setConfiguration()指定连接数据库的相关参数。参数1:和当前作业相关的配置对象,Configuration对象要通过Job对象来获取;参数2:"com.mysql.jdbc.Driver"参数3:"jdbc:mysql://ip:port/grms"参数4和5:"用户名"和"密码"。5.数据输出的格式控制需要使用DBOutputFormat。DBOutputFormat.setOutput();有三个参数:参数1:Job对象。参数2:数据库表名参数3:可变长参数,指的是往数据库中插入的列名。insert into 数据库表名 values(?,?,?);文件:SaveRecommendResultToDB.java类名:SaveRecommendResultToDBMapper<LW,Text,Text,Text>SaveRecommendResultToDBReducer<Text,Text,自定义的Key,NullWritable>数据来源:第7步的结果数据。数据去向:MySQL数据库,grms.resulti.构建作业流对象(JobControl),让程序自行提交作业。文件:GoodsRecommendationManagementSystemJobController.java类名:GoodsRecommendationManagementSystemJobController1.分别创建step1到step8的Job对象,然后进行各自的作业配置。Job job1=Job.getIns();2.创建8个ControlledJob对象,将上一步的Job对象转化成可被控制的作业。ControlledJob cj1=new CJ();cj1.setJob(job1);cj2.setJob(job2);3.对可被控制的作业添加依赖关系。cj2.addDepe...(cj1);4.构建JobControl对象,将8个可被控制的作业逐个添加。JobControl jc=new JobControl("");5.构建线程对象,并启动线程,执行作业。Thread t=new Thread(jc);t.start();

准确率:推荐结果/未购买商品总数;
覆盖率:推荐结果/商品总数;

数据集:80%数据参与计算,20%的数据参与算法评估;

基于hadoop的商品推荐引擎相关推荐

  1. 基于协同过滤的推荐引擎

    探索推荐引擎内部的秘密"系列将带领读者从浅入深的学习探索推荐引擎的机制,实现方法,其中还涉及一些基本的优化方法,例如聚类和分类的应用.同时在理论讲解的基础上,还会结合 Apache Maho ...

  2. 基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统

    本文是对经典论文的阅读笔记,大部分为论文的中文翻译内容(笔者英语水平也就六级飘过的水准,不喜勿喷) 论文标题:Matrix factorization techniques for recommend ...

  3. 基于协同过滤的推荐引擎(理论部分)

    记得原来和朋友猜测过网易云的推荐是怎么实现的,大概的猜测有两种:一种是看你听过的和收藏过的音乐,再看和你一样听过这些音乐的人他们喜欢听什么音乐,把他喜欢的你没听过的音乐推荐给你:另一种是看他听过的音乐 ...

  4. 基于hadoop的商品推荐系统_[零基础入门推荐系统(1)]基于用户和基于物品的协同过滤方法(python代码实现)...

    1. 前言: 为什么会有该系列? 最近,打算写<零基础入门推荐系统>系列,为了系统地介绍推荐系统知识,以及加强基础的实践能力. 该系列将结合一些书籍,比如项亮的<推荐系统实践> ...

  5. 基于内容的商品推荐技术的简单实现方法

    基于内容的推荐技术 最近做学校的一个商城项目需要推荐功能,于是翻看了几篇论文,感觉基于内容的推荐技术比较合适,索性就拿来用用.通过提取用户最近的商品收藏或者搜索记录中的有用信息,得到喜好模型从而计算相 ...

  6. 基于Hadoop的用户购买行为的商品推荐系统

    目录 一 绪论 1 1.1 编写目的 1 1.2 背景及意义 1 1.3 开发及运行环境 2 二 需求分析 3 2.1 系统概述 3 2.3 系统功能需求 4 2.3.1 收集原始数据 4 2.3.2 ...

  7. 基于 Apache Mahout 构建社会化推荐引擎

    http://www.ibm.com/developerworks/cn/java/j-lo-mahout/ Web 2.0 的一个核心思想就是"群体智慧",即基于大众行为,为每个 ...

  8. 探索推荐引擎内部的秘密 - 推荐引擎初探

    最近要用到协同过滤的算法来解决工作中的问题,先学习,以后再把自己的收获总结下来. 转自:http://www.ibm.com/developerworks/cn/web/1103_zhaoct_rec ...

  9. 探索推荐引擎内部的秘密系列

    最近要用到协同过滤的算法来解决工作中的问题,先学习,以后再把自己的收获总结下来. 转自:http://www.ibm.com/developerworks/cn/web/1103_zhaoct_rec ...

  10. 【转】探索推荐引擎内部的秘密

    from: http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy1/index.html?ca=drs- 赵 晨婷 , 软件 ...

最新文章

  1. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值
  2. 7 1学会使用 Node 编写简单的前端应用
  3. jQuery 事件用法详解
  4. EL之GB(GBM):利用GB对回归(性别属性编码+调2参)问题(整数值年龄预测)建模
  5. Mysql安装两种方法
  6. ROS初学笔记 - C++11与PCL库冲突问题
  7. sap.ca.ui.utils.busydialog - scenario1 - opportunity opened
  8. KMP算法的核心,是一个被称为部分匹配表(Partial Match Table)的数组以及next数组求解
  9. SpringBoot2.0 基础案例(16):配置Actuator组件,实现系统监控
  10. VSCode自定义代码片段7——CSS动画
  11. 机器学习的基本概念和相关术语
  12. lamp 测试mysql_搭建LAMP测试环境
  13. isight2019安装教程_abaqus2019软件下载+安装教程
  14. php日期时间戳转换
  15. 坯子库怎么导入插件_坯子库实用的插件安装器-SketchUp坯子插件库2020下载v2020.1正式版管理器-西西软件下载...
  16. 基于javacv实现视频转mp4
  17. 读书印记 - 《我们人类的基因:全人类的历史和未来》
  18. 计算机tpm管理,TPM管理工厂实施TPM可能面临的陷阱
  19. 1.19(Cake Baking)
  20. java开发 与c sharp 开发思想_Java与CSharp的相同与不同

热门文章

  1. 鹏业安装算量软件8.0.0.41 升级内容
  2. 《编译原理》画 DAG 图与求优化后的 4 元式代码- 例题解析
  3. 前端中用手机拍照压缩,上传图片压缩
  4. 给找机器学习/算法岗工作的同学们的一些建议
  5. 用VB打造个人版恺撒密码转换器
  6. win7计算机名称格式,win7笔记本电脑如何显示文件扩展名
  7. Ionic 安卓兼容性问题解决
  8. Win10 - 使用‘Alt+Tab’不能切换窗口及更改切换风格
  9. “绿萌”仿“大麦”演出购票APP
  10. Labelling tools 的环境配置