SlopeOne推荐算法
|
101
|
102
|
103
|
104
|
UserX | 5 |
3.5
|
|
|
UserY
|
2
|
5
|
4
|
2
|
UserZ
|
4.5
|
3.5
|
1
|
4
|
求物品两两之间的差值平均分:
|
101
|
102
|
103
|
104
|
101
|
|
|
|
|
102
|
0.17
|
|
|
|
103
|
-0.75
|
-1.75
|
|
|
104
|
-0.25
|
-1.25
|
0.5
|
|
OK,现在准备工作已经完成了,然后进行推荐,例如对X用户进行推荐,103和104个预测评分根据101、102的评分来的。
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.List;
- import org.apache.commons.cli2.OptionException;
- import org.apache.mahout.cf.taste.common.TasteException;
- import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
- import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
- import org.apache.mahout.cf.taste.impl.recommender.CachingRecommender;
- import org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender;
- import org.apache.mahout.cf.taste.model.DataModel;
- import org.apache.mahout.cf.taste.recommender.RecommendedItem;
- public class App
- {
- static final String inputFile = "/mnt/new/ml-1m/ratings.dat";
- static final String outputFile = "/mnt/new/ml-1m/ratings.csv";
- public static void main( String[] args ) throws IOException, TasteException, OptionException
- {
- CreateCsvRatingsFile();
- //创建模型数据源文件
- File ratingsFile = new File(outputFile);
- DataModel model = new FileDataModel(ratingsFile);
- // SlopeOne算法
- CachingRecommender cachingRecommender = new CachingRecommender(new SlopeOneRecommender(model));
- // 对所有用户进行推荐
- for (LongPrimitiveIterator it = model.getUserIDs(); it.hasNext();){
- long userId = it.nextLong();
- // 对单个User进行推荐
- List<RecommendedItem> recommendations = cachingRecommender.recommend(userId, 10);
- // 该用户无推荐结果
- if (recommendations.size() == 0){
- System.out.print("User ");
- System.out.print(userId);
- System.out.println(": no recommendations");
- }
- // 打印推荐信息
- for (RecommendedItem recommendedItem : recommendations) {
- System.out.print("User ");
- System.out.print(userId);
- System.out.print(": ");
- System.out.println(recommendedItem);
- }
- }
- }
- //读文件前1000行作为模型输入
- private static void CreateCsvRatingsFile() throws FileNotFoundException, IOException {
- BufferedReader br = new BufferedReader(new FileReader(inputFile));
- BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
- String line = null;
- String line2write = null;
- String[] temp;
- int i = 0;
- while ((line = br.readLine()) != null && i < 1000)
- {
- i++;
- temp = line.split("::");
- line2write = temp[0] + "," + temp[1];
- bw.write(line2write);
- bw.newLine();
- bw.flush();
- }
- br.close();
- bw.close();
- }
- }
参考资料:1,Mahout cookbook;2,http://weibo.com/bicloud 网友写的SlopeOnePPT
SlopeOne推荐算法的更多相关文章
- java和python实现一个加权SlopeOne推荐算法
一.加权SlopeOne算法公式: (1).求得所有item之间的评分偏差 上式中分子部分为项目j与项目i的偏差和,分母部分为所有同时对项目j与项目i评分的用户数 (2).加权预测评分 项目j与项目i ...
- Mahout推荐算法API详解
转载自:http://blog.fens.me/mahout-recommendation-api/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...
- Mahout推荐算法基础
转载自(http://www.geek521.com/?p=1423) Mahout推荐算法分为以下几大类 GenericUserBasedRecommender 算法: 1.基于用户的相似度 2.相 ...
- 转】Mahout推荐算法API详解
原博文出自于: http://blog.fens.me/mahout-recommendation-api/ 感谢! Posted: Oct 21, 2013 Tags: itemCFknnMahou ...
- Mahout推荐算法之SlopOne
Mahout推荐算法之SlopOne 一. 算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分.如下图,估计UserB对 ...
- [转]Mahout推荐算法API详解
Mahout推荐算法API详解 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeepe ...
- 推荐算法之 slope one 算法
1.示例引入 多个吃货在某美团的某家饭馆点餐,如下两道菜: 可乐鸡翅: 红烧肉: 顾客吃过后,会有相关的星级评分.假设评分如下: 评分 可乐鸡翅 红烧肉 小明 4 5 小红 4 3 小伟 2 3 小芳 ...
- 从分类,排序,top-k多个方面对推荐算法稳定性的评价
介绍 论文名: "classification, ranking, and top-k stability of recommendation algorithms". 本文讲述比 ...
- Mahout推荐算法API具体解释【一起学Mahout】
阅读导读: 1.mahout单机内存算法实现和分布式算法实现分别存在哪些问题? 2.算法评判标准有哪些? 3.什么会影响算法的评分? 1. Mahout推荐算法介绍 Mahout推荐算法,从数据处理能 ...
随机推荐
- [ios]objective-c 协议和委托 (重点基础知识)
objective-c protocol delegateprotocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. delegate-委托,顾名思义就是委托 ...
- EasyMvc入门教程-基本控件说明(4)折叠面板
折叠面板一般出现在管理后台,大家用的OutLook里就是用了折叠面板,样子大概是这样的: 把其中的内容替换成图标按钮,是不是就是我们常见的样子了?:)那么如何实现呢?请看例子: @{ var data ...
- MySQL主库异常,从库手动切换为主库方案
主库异常,从库手动切换为主库方案 1.登录从服务器,确认从服务器已经完成所有同步操作: mysql> stop slave io_thread mysql> show processlis ...
- JNI开发(2)——开发实战
JNI开发(1)--概述.环境搭建.必要知识点 JNI开发(2)--开发实战 本篇是重头戏:JNI实战开发.假设你对于 JNI.NDK 还没概念的话 那么观看本篇 也是没有太大难度的 ,哈哈哈哈! ! ...
- MySQL经常使用命令--create命令使用
切换数据库的字符集 在mysql中的配置文件里: 使用vim /etc/mysql/my.cnf [client] default-character-set = utf8 [mysqld] char ...
- ichartjs 制作的图表
ichartjs资源包下载:https://files.cnblogs.com/files/xiandedanteng/ichartjs-ichartjs1.2.zip 本例下载地址:https:// ...
- Vue 内容分发slot
1.概述 内容分发:混合父组件的内容与子组件自己的模板. 2.单个插槽 当子组件模板只有一个没有属性的插槽时,父组件传入的整个内容片段将插入到插槽所在的 DOM 位置,并替换掉插槽标签本身. 最初在 ...
- apue学习笔记(第九章 进程关系)
本章将详细地说明进程组以及POSIX.1引入的会话的概念.还将介绍登录shell和所有从登录shell启动的进程之间的关系 终端登录 BSD终端登录.系统管理者创建通常名为/etc/ttys的文件,其 ...
- c语言字符数组的初始化问题
1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...
- sql数据分页
方法一.直接限制返回区间 (只适应于mysql) SELECT * FROM table WHERE 查询条件 ORDER BY 排序条件 LIMIT ((页码-1)*页大小),页大小; 优点:写法简 ...