飞鸟各投林

导航

推荐系统第3周--- 大数据环境下的itemCF实现

代码报错注意事项:

1:最后Ctrl+shift+O  导入包
2:导入mahout包
3:新建datafile文件包,在其下面新建csv文件

 

项目背景:图书推荐系统介绍
需求分析:项目需求分析
算法模型:基于Mahout推荐算法
架构设计:职位推荐引擎架构
系统环境:构建Mahout的开发环境
程序开发:基于Mahout的推荐算法实现

 

项目背景: 图书推荐系统介绍

Amazon是最早的电子商务网站之一,以网上销售图书起家,最后发展成为音像,电子消费品,游戏,生活用品等的综合性电子商务平台。Amazon的推荐系统,是互联网上最早的商品推荐系统,它为Amazon带来了至少30%的流量,和非常可观的销售利润。
如今推荐系统已经成为电子商务网站的标配,如果还没有推荐系统都丌好意思,说自己是做电商的

 

项目背景: 推荐引擎Mahout

Mahout是Hadoop的子项目。
Mahout框架包含了一套完整的推荐系统引擎,标准化的数据结构,多样的算法实现,简单的开发流程。

Mahout推荐的推荐系统引擎是模块化的,分为5个主要部分组成:数据模型,相似度算法,近邻算法,推荐算法,算法评分器。

 

需求分析:案例介绍

广告位:广告商投放广告的位置,网站可以靠网络广告赚钱,一般是网页最好的位置。
平均分:用户对图书的打分
关联规则:通过关联规则,推荐位
协同过滤:通过基于物品的协同过滤算法的,推荐位
图书属性:包括页数,出版社,ISBN,诧言等
作者介绍:有关作者的介绍,和作者的其他著作
用户评分:用户评分行为
用户评论:用户评论的内容

 

算法模型:测试数据集

rating.csv:行为数据
–3列数据:用户ID,图书ID, 用户对图书的评分
–记录数: 4000次的图书评分
–用户数: 200个
–图书数: 1000个
–评分:1-10
users.csv :属性数据
–3列数据:用户ID,用户性别,用户年龄
–用户数: 200个
–用户性别: M为男性,F为女性
–用户年龄: 11-80岁之间

 

 

算法模型:数据样例

rating.csv            user.csv

 

算法模型:算法组合

我们选择UserCF,ItemCF,SlopeOne的3种推荐算法,迚行7种组合的测试。
userCF1: EuclideanSimilarity+ NearestNUserNeighborhood+ GenericUserBasedRecommender
userCF2: LogLikelihoodSimilarity+ NearestNUserNeighborhood+ GenericUserBasedRecommender
userCF3: EuclideanSimilarity+ NearestNUserNeighborhood+ GenericBooleanPrefUserBasedRecommender
itemCF1: EuclideanSimilarity+ GenericItemBasedRecommender
itemCF2: LogLikelihoodSimilarity+ GenericItemBasedRecommender
itemCF3: EuclideanSimilarity+ GenericBooleanPrefItemBasedRecommender
slopeOne:SlopeOneRecommender

 

 

算法模型:算法组合解释

基于用户的协同过滤算法:
用户相似度距离+ 最近邻算法+ 推荐算法(有评分,无评分)


基于物品的协同过滤算法:
用户相似度距离+ 推荐算法(有评分,无评分)


有关于算法组合的详细解释,请参考文章:从源代码剖析Mahout推荐引擎

 

 

算法模型:算法评估

查准率:被检索到的,越相关的越多越好,丌相关的越少越好,越大越好。
召回率(查全率):被检索到的越多越好,越大越好。
有关于算法评估的详细解释,请参考文章:Mahout推荐算法API详解

 

架构设计:Mahout推荐系统

系统架构:Mahout中推荐过滤算法支持单机算法和分步式算法两种。
单机算法: 在单机内存计算,支持多种算法推荐算法,部署运行简单,但处理数据量有限。
分步式算法: 基于Hadoop集群运行,支持有限的几种推荐算法部署运行复杂,支持海量数据

 

 

架构设计:图书推荐引擎系统架构

 

架构设计:架构说明

上图中,左边是Application业务系统,右边是Mahout,下边是Hadoop集群。
1. 当数据量不太大,算法复杂时:直接选择用Mahout读取CSV戒者Database数据,在单机内存中迚行计算。Mahout是多线程的应用,会幵行使用单机所有系统资源
2. 当数据量很大时,并行化算法(ItemCF):先把业务系统的数据导入到Hadoop的HDFS中,然后用Mahout访问HDFS实现幵行算法。算法的性能不整个Hadoop集群有关。
3. 计算后的结果,保存到数据库中,方便以后查询!

 

 

开发环境
–Win7 64bit
–Java 1.6.0_45
–Maven3
–Eclipse Juno Service Release 2
–Mahout-0.8
–Hadoop-1.1.2
请参考文章:用Maven构建Mahout项目

 

这里要说明一下mahout的运行版本。
mahout-0.5, mahout-0.6, mahout-0.7,是基于hadoop-0.20.2x的。
mahout-0.8, mahout-0.9,是基于hadoop-1.1.x的。
mahout-0.7有一次重大升级,去掉了多个算法的单机内存运行,幵且了部分API丌向前兼容。

 

程序开发: Maven构建Mahout的开发环境

1. 用Maven创建一个标准化的Java项目
2. 导入项目到eclipse
3. 增加mahout依赖,修改pom.xml
4. 下载依赖

 

Mahout的推荐引擎,要从org.apache.mahout.cf.taste包说起。
–common: 公共类包括,异常,数据刷新接口,权重常量
–eval: 定义构造器接口,类似于工厂模式
–model: 定义数据模型接口
neighborhood: 定义近邻算法的接口
recommender: 定义推荐算法的接口
similarity: 定义相似度算法的接口
–transforms: 定义数据转换的接口
–hadoop: 基于hadoop的分步式算法的实现类
–impl: 单机内存算法实现类
参考文章:从源代码剖析Mahout推荐引擎

 

 

 

程序开发: Mahout推荐API

org.apache.mahout.cf.taste.model.DataModel.java
org.apache.mahout.cf.taste.similarity. UserSimilarity.java
org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood.java
org.apache.mahout.cf.taste.recommender.Recommender.java

 

 

recommend(long userID, inthowMany): 获得推荐结果,给userID推荐howMany个Item
–recommend(long userID, inthowMany, IDRescorerrescorer): 获得推荐结果,给userID推荐howMany个Item,可以根据rescorer对结构重新排序。
–estimatePreference(long userID, long itemID): 当打分为空,估计用户对物品的打分
–setPreference(long userID, long itemID, float value): 赋值用户,物品,打分
–removePreference(long userID, long itemID): 删除用户对物品的打分
–getDataModel(): 提取推荐数据

 

Recommender接口的子类
1.GenericUserBasedRecommender: 基于用户的推荐算法
2.GenericItemBasedRecommender: 基于物品的推荐算法
3.KnnItemBasedRecommender: 基于物品的KNN推荐算法
4.SlopeOneRecommender: Slope推荐算法
5.SVDRecommender: SVD推荐算法
6.TreeClusteringRecommender:TreeCluster推荐算法

 

程序开发: Mahout最简单的例子

 

程序开发: 新建Java类
BookEvaluator.java, 选出“评估推荐器”验证得分较高的算法
BookResult.java, 对指定数量的结果人工比较
BookFilterGenderResult.java,只保留男性用户的图书列表

 

程序开发: BookEvaluator.java

程序开发: 可视化输出–平均距离

AVERAGE_ABSOLUTE_DIFFERENCE距离:值越小越好

程序开发: 可视化输出–算法验证器

 

 

 

 

 

posted on 2016-04-23 21:02  飞鸟各投林  阅读(632)  评论(0编辑  收藏  举报