Mahout中主要核心的三大算法为推荐,聚类及分类算法,今天就最基本的推荐算法做总结,推荐中常用的两个推荐算法是”user_based”和”item_based”,前者主要通过和你兴趣相似的人来发现新的你感兴趣的东西,而后者则是发现一些和你所喜欢的事物相似的事物。此外,还有一种基于“contend_based”的推荐算法,它是根据事物所拥有的元数据出现进行事物的推荐,例如,如果你喜欢的电影是斯皮尔伯格导影的,那么你可以向你的朋友推荐他拍摄的其他影片,推荐的理由就是基于电影的一个属性——导演,这个就是基于内容的推荐。

下面将使用mahout来做一个小的推荐案例以供学习:

1.构建数据集

这里选取的常用的偏好来描述用户与项目之间的关联程度,一个偏好包含有用户ID,项目ID和偏好值,例如,用户对影片的评分值,评分值越大,代表用户对该影片的喜爱越好。

可以采用文本文件来保存该内容,如intro.csv:

1,101,5.0

1,102,3.0

1,103,2.5

2,101,2.0

2,102,2.5

2,103,5.0

2,104,2.0

3,101,2.5

3,104,4.0

3,105,4.5

3,107,5.0

4,101,5.0

4,103,3.0

4,104,4.5

4,106,4.0

5,101,4.0

5,102,3.0

5,103,2.0

5,104,4.0

5,105,3.5

5,106,4.0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

2.建立简易推荐器

下面利用mathou提供的基本类包mahout-examples-0.10.0-job.jar来构建java代码程序,我们要实现的是根据用户的基本情况向User1推荐合适的影片,代码如下:

package com.recommeder.lg.example;

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

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

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

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

import org.apache.mahout.cf.taste.model.*;

import org.apache.mahout.cf.taste.neighborhood.*;

import org.apache.mahout.cf.taste.recommender.*;

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

import java.io.*;

import java.util.*;

class RecommenderIntro {

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

DataModel model = new FileDataModel(new File("/home/jinyu/Documents/intro.csv"));//加载数据文件

UserSimilarity similarity = new PearsonCorrelationSimilarity (model); //建立推荐模型

UserNeighborhood neighborhood = new NearestNUserNeighborhood (2, similarity, model);

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

List recommendations = recommender.recommend(1, 2); //给用户1推荐2个项目

for (RecommendedItem recommendation : recommendations) {

System.out.println(recommendation);

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

3.相关解释说明

该代码是基于用户推荐的基本流程,用图表示出来就是:

DataModel负责存储和提供用户、项目、偏好的计算所需要的数据。UserSimiliarity提供了一些基于某种

算法的用户相似度度量的方法。UserNeighborhood定义了一个和某指定用户相似的用户集合。最后,Recommender利用所有的组件来为一个用户产生一个推荐结果。

4.运行结果展示

利用eclipse运行该代码的结果如下所示:

可以看到该推荐器向用户1推荐了104,106这两部影片,其中104是推荐偏好量化值最高的一部

5.推荐器评估

高效准确地产生推荐结果是非常重要的,推荐的结果一般要求准、新、普,准要求推荐的结果可靠真实,新要求推荐的结果具有新奇性,不与往常重复,普则要求推荐的结果是为大众所接受的。评估的一般做法是将数据集分成训练集和测试集,然后选择指标进行评估说明。

常用的几个指标有:

差值平均数(真实与预期值)

标注差(差值均方根)

查准率与查全率

下面利用差值平均数进行评估,代码如下:

import java.io.File;

import org.apache.mahout.cf.taste.common.TasteException;

import org.apache.mahout.cf.taste.eval.*;

import org.apache.mahout.cf.taste.impl.eval.*;

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

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

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

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

import org.apache.mahout.cf.taste.model.*;

import org.apache.mahout.cf.taste.neighborhood.*;

import org.apache.mahout.cf.taste.recommender.*;

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

import org.apache.mahout.common.RandomUtils;

class RecommenderEvaluators {

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

RandomUtils.useTestSeed();

DataModel model = new FileDataModel(new File("intro.csv"));//加载数据文件

RecommenderEvaluator evalutor= new AverageAbsoluteDifferenceRecommenderEvaluator();

RecommenderBuilder builder=new RecommenderBuilder() {

@Override

public Recommender buildRecommender(DataModel model) throws TasteException {

// TODO Auto-generated method stu

UserSimilarity similarity = new PearsonCorrelationSimilarity (model); //建立推荐模型

UserNeighborhood neighborhood = new NearestNUserNeighborhood (2, similarity, model);

return new GenericUserBasedRecommender (model,neighborhood,similarity);

}

};

double score =evalutor.evaluate(builder, null, model, 0.6, 1);

System.out.println(score);

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

最后的evaluate()函数为推荐器评分,分值越低,代表差异越小,评估的效果越准确,其中0.6表示训练集的百分比,1表示选取数据集的百分比。

6.分布式推荐计算

当数据量足够大时,单机环境已经不适用于做推荐计算了,这是可以考虑mahout提供的分布式推荐算法在hadoop平台下进行计算,可以把上述数据集上传到hdfs下的文件夹,然后利用recommenditembased命令进行分布式推荐计算,其适用的数据类型一般是偏好型,若是对向量数据进行相似度的计算,则可以考虑适用rowsimilarity命令,其主要参数可以使用mahout recommenditembased -h命令查看,运行命令如下:

mahout recommenditembased -i testdata/pre.data -o output/similar -s SIMILARITY_EUCLIDEAN_DISTANCE -n 3 -opfsm output/matrix

其中,-i 指出数据集存放地址,-o 存放推荐结果,-s 指出相似度计算的函数,-n 指出为每个用户推荐的数量,最后一个opfsm存放item间的相似度。

此外,hdfs下额外的产生的temp文件夹也有许多可查看文件,如下图:

不过,值得注意的事,尽管数据量很小,但是hadoop下的mapreduce过程仍然花费了一定的时间,还有,hadoop2.2与mahout1.0及以上版本搭配才可能不会出错的。

mahout 推荐算法 java_Mahout之推荐算法基本实例相关推荐

  1. mahout 推荐算法 java_Mahout推荐算法API详解

    前言 用Mahout来构建推荐系统,是一件既简单又困难的事情.简单是因为Mahout完整地封装了"协同过滤"算法,并实现了并行化,提供非常简单的API接口:困难是因为我们不了解算法 ...

  2. 基于音乐/电影/图书的协同过滤推荐算法代码实现(基于用户推荐、基于项目推荐、基于SlopeOne算法推荐、基于SVD算法推荐、混合加权推荐)

    基于音乐/电影/图书的协同过滤推荐算法代码实现(基于用户推荐.基于项目推荐.基于SlopeOne算法推荐.基于SVD算法推荐.加权混合推荐) 一.开发工具及使用技术 MyEclipse10.jdk1. ...

  3. 经典算法书籍推荐以及算法书排行【算法四库全书】

    经典算法书籍推荐以及算法书排行[算法四库全书] 作者:霞落满天   https://linuxstyle.blog.csdn.net/    https://blog.csdn.net/21aspne ...

  4. 推荐业务多目标建模算法介绍:MMOE、OMOE、Shared-Bottom

    在推荐业务中经常有"既要.也要.还要"的场景,比如做视频推荐业务的时候既要提升用户对于视频的点击率,也希望同时提升用户观看视频的时长.面对这样的诉求,通常需要在推荐系统中使用多目标 ...

  5. 从零实现来理解机器学习算法:书籍推荐及障碍的克服

     从零实现来理解机器学习算法:书籍推荐及障碍的克服 发表于2015-09-10 16:16| 1261次阅读| 来源Machine Learning Mastery| 2 条评论| 作者Jason ...

  6. 从大学入门到研究生拿大厂offer,必须看的数据结构与算法书籍推荐,不好不推荐!

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...

  7. 计算机视觉算法实战书籍推荐_岗位内推 | 字节跳动招聘NLP、计算机视觉、推荐算法实习生...

    PaperWeekly 致力于推荐最棒的工作机会,精准地为其找到最佳求职者,做连接优质企业和优质人才的桥梁.如果你需要我们帮助你发布实习或全职岗位,请添加微信号「pwbot02」. NLP算法实习生 ...

  8. 推荐算法(二)--算法总结

    转自:https://www.jianshu.com/p/1464eab67711 推荐算法分类 1 个性化推荐 1.1 基于用户推荐(Demographic-based Recommendation ...

  9. 基于协同过滤算法的商品推荐购物电商系统

    一.介绍 商品推荐是针对用户面对海量的商品信息而不知从何下手的一种解决方案,它可以根据用户的喜好,年龄,点击量,购买量以及各种购买行为来为用户推荐合适的商品.在本项目中采用的是基于用户的协同过滤的推荐 ...

最新文章

  1. 如何解决开发人员的工作无法量化的问题
  2. 豆瓣评论9.5的《Effective Python》,帮你解决80%难题!
  3. 身体出现十个信号当心短命
  4. SpringBoot 中 get/post 请求处理方式,以及requestboy为Json时的处理
  5. 用C语言来统计文件中单词的个数(C语言笔记)
  6. SLAM--卡尔曼滤波、粒子滤波
  7. 基于大数据的城市租房信息可视化分析系统
  8. 新战投入场,苏宁易购迎来破局发展新开端
  9. linux 远程启动带gui程序,通过 ssh 运行 远程linux GUI 的方法.
  10. PCB六层板如何分层最好?
  11. blob的txt下载方式
  12. 清理qmail邮件队列
  13. 论文阅读笔记:Geography-Aware Sequential Location Recommendation
  14. python 将垂直速度从压力坐标系转为高度坐标系(pa/s转为m/s)
  15. 河北单招计算机的考试试题,河北单招试题
  16. Openkruise/rollouts 源码解读
  17. 2020-07-03
  18. 鲲鹏计算展蓝图,无限风光在广东
  19. 浅谈征信大数据与撸贷
  20. 计算机组装与维护试题及答案

热门文章

  1. nmn是个什么东西,一篇文章让您客观了解nmn对身体有什么好处
  2. java基于ssm的物资物料管理系统
  3. python图书馆管理系统设计,千行代码带你学!
  4. 基于LabVIEW的无线温度测控电路设计_温度传感器电路
  5. cc150:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针
  6. Qt使用C++封装qml自定义图形控件(QQuickPaintedItem)
  7. Win10微软输入法自定义短语导入
  8. 配置思科3550三层交换机用TELNET方式登录
  9. 中国五大发电厂及下属电站
  10. Sony大法的Music Center for PC歌曲一直显示未分析的解决办法