Slope One 算法 是一种基于评分的预测算法, 本质上也是一种基于项目的算法。与一般的基于项目的算法不同, 该算法不计算项目之间的相似度, 而是用一种简单的线性回归模型进行预测(可以扩展) 算法易于实现, 计算速度快, 可扩展性好, 同时对数据稀疏性有较好的适应性。
       例如下面表格里有3个用户对4个物品的评分
 
101
102
103
104
UserX 5
3.5
 
 
UserY
2
5
4
2
UserZ
4.5
3.5
1
4

求物品两两之间的差值平均分:

        物品102和101:{(3.5-5)+(5-2)+(3.5-4.5)}/3=0.5/3
      物品103跟101:{(4-2)+(1-4.5)}/2=-1.5/2
      物品104跟101:{(2-2)+(4-4.5)}/2=-0.5/2
      物品103跟102:{(4-5)+(1-3.5)}/2=-3.5/2
      物品104跟102:{(2-5)+(4-3.5)}/2=-2.5/2
      物品104跟103:{(2-4)+(4-1)}/2=1/2
能得到下面表格
 
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的评分来的。

       X预测103评分={(-0.75+5)+(-1.75+3.5)}/2=(4.25+1.75)/2=3
       X预测104评分={(-0.25+5)+(-1.25+3.5)}/2=(4.75+2.25)/2=3.5
       那么给X用户推荐的顺序就是:先推荐104在推荐103
       实战经验:可以看出该算法对评分质量要求非常高,那么如果某一个物品的平均分高的话,那么该物品就非常容易被推荐。
       下面代码是基于Mahout的SlopeOne算法调用:

  1. import java.io.BufferedReader;
  2.  
  3. import java.io.BufferedWriter;
  4.  
  5. import java.io.File;
  6.  
  7. import java.io.FileNotFoundException;
  8.  
  9. import java.io.FileReader;
  10.  
  11. import java.io.FileWriter;
  12.  
  13. import java.io.IOException;
  14.  
  15. import java.util.List;
  16.  
  17. import org.apache.commons.cli2.OptionException;
  18.  
  19. import org.apache.mahout.cf.taste.common.TasteException;
  20.  
  21. import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
  22.  
  23. import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
  24.  
  25. import org.apache.mahout.cf.taste.impl.recommender.CachingRecommender;
  26.  
  27. import org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender;
  28.  
  29. import org.apache.mahout.cf.taste.model.DataModel;
  30.  
  31. import org.apache.mahout.cf.taste.recommender.RecommendedItem;
  32.  
  33. public class App
  34.  
  35. {
  36.  
  37. static final String inputFile = "/mnt/new/ml-1m/ratings.dat";
  38.  
  39. static final String outputFile = "/mnt/new/ml-1m/ratings.csv";
  40.  
  41. public static void main( String[] args ) throws IOException, TasteException, OptionException
  42.  
  43. {
  44.  
  45. CreateCsvRatingsFile();
  46.  
  47. //创建模型数据源文件
  48.  
  49. File ratingsFile = new File(outputFile);
  50.  
  51. DataModel model = new FileDataModel(ratingsFile);
  52.  
  53. // SlopeOne算法
  54.  
  55. CachingRecommender cachingRecommender = new CachingRecommender(new SlopeOneRecommender(model));
  56.  
  57. // 对所有用户进行推荐
  58.  
  59. for (LongPrimitiveIterator it = model.getUserIDs(); it.hasNext();){
  60.  
  61. long userId = it.nextLong();
  62.  
  63. // 对单个User进行推荐
  64.  
  65. List<RecommendedItem> recommendations = cachingRecommender.recommend(userId, 10);
  66.  
  67. // 该用户无推荐结果
  68.  
  69. if (recommendations.size() == 0){
  70.  
  71. System.out.print("User ");
  72.  
  73. System.out.print(userId);
  74.  
  75. System.out.println(": no recommendations");
  76.  
  77. }
  78.  
  79. // 打印推荐信息
  80.  
  81. for (RecommendedItem recommendedItem : recommendations) {
  82.  
  83. System.out.print("User ");
  84.  
  85. System.out.print(userId);
  86.  
  87. System.out.print(": ");
  88.  
  89. System.out.println(recommendedItem);
  90.  
  91. }
  92.  
  93. }
  94.  
  95. }
  96.  
  97. //读文件前1000行作为模型输入
  98. private static void CreateCsvRatingsFile() throws FileNotFoundException, IOException {
  99.  
  100. BufferedReader br = new BufferedReader(new FileReader(inputFile));
  101.  
  102. BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
  103.  
  104. String line = null;
  105.  
  106. String line2write = null;
  107.  
  108. String[] temp;
  109.  
  110. int i = 0;
  111.  
  112. while ((line = br.readLine()) != null && i < 1000)
  113.  
  114. {
  115.  
  116. i++;
  117.  
  118. temp = line.split("::");
  119.  
  120. line2write = temp[0] + "," + temp[1];
  121.  
  122. bw.write(line2write);
  123.  
  124. bw.newLine();
  125.  
  126. bw.flush();
  127.  
  128. }
  129.  
  130. br.close();
  131.  
  132. bw.close();
  133.  
  134. }
  135.  
  136. }

参考资料:1,Mahout cookbook;2,http://weibo.com/bicloud 网友写的SlopeOnePPT

SlopeOne推荐算法的更多相关文章

  1. java和python实现一个加权SlopeOne推荐算法

    一.加权SlopeOne算法公式: (1).求得所有item之间的评分偏差 上式中分子部分为项目j与项目i的偏差和,分母部分为所有同时对项目j与项目i评分的用户数 (2).加权预测评分 项目j与项目i ...

  2. Mahout推荐算法API详解

    转载自:http://blog.fens.me/mahout-recommendation-api/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...

  3. Mahout推荐算法基础

    转载自(http://www.geek521.com/?p=1423) Mahout推荐算法分为以下几大类 GenericUserBasedRecommender 算法: 1.基于用户的相似度 2.相 ...

  4. 转】Mahout推荐算法API详解

    原博文出自于: http://blog.fens.me/mahout-recommendation-api/ 感谢! Posted: Oct 21, 2013 Tags: itemCFknnMahou ...

  5. Mahout推荐算法之SlopOne

    Mahout推荐算法之SlopOne 一.       算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分.如下图,估计UserB对 ...

  6. [转]Mahout推荐算法API详解

    Mahout推荐算法API详解 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeepe ...

  7. 推荐算法之 slope one 算法

    1.示例引入 多个吃货在某美团的某家饭馆点餐,如下两道菜: 可乐鸡翅: 红烧肉: 顾客吃过后,会有相关的星级评分.假设评分如下: 评分 可乐鸡翅 红烧肉 小明 4 5 小红 4 3 小伟 2 3 小芳 ...

  8. 从分类,排序,top-k多个方面对推荐算法稳定性的评价

    介绍 论文名: "classification, ranking, and top-k stability of recommendation algorithms". 本文讲述比 ...

  9. Mahout推荐算法API具体解释【一起学Mahout】

    阅读导读: 1.mahout单机内存算法实现和分布式算法实现分别存在哪些问题? 2.算法评判标准有哪些? 3.什么会影响算法的评分? 1. Mahout推荐算法介绍 Mahout推荐算法,从数据处理能 ...

随机推荐

  1. [ios]objective-c 协议和委托 (重点基础知识)

    objective-c protocol delegateprotocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. delegate-委托,顾名思义就是委托 ...

  2. EasyMvc入门教程-基本控件说明(4)折叠面板

    折叠面板一般出现在管理后台,大家用的OutLook里就是用了折叠面板,样子大概是这样的: 把其中的内容替换成图标按钮,是不是就是我们常见的样子了?:)那么如何实现呢?请看例子: @{ var data ...

  3. MySQL主库异常,从库手动切换为主库方案

    主库异常,从库手动切换为主库方案 1.登录从服务器,确认从服务器已经完成所有同步操作: mysql> stop slave io_thread mysql> show processlis ...

  4. JNI开发(2)——开发实战

    JNI开发(1)--概述.环境搭建.必要知识点 JNI开发(2)--开发实战 本篇是重头戏:JNI实战开发.假设你对于 JNI.NDK 还没概念的话 那么观看本篇 也是没有太大难度的 ,哈哈哈哈! ! ...

  5. MySQL经常使用命令--create命令使用

    切换数据库的字符集 在mysql中的配置文件里: 使用vim /etc/mysql/my.cnf [client] default-character-set = utf8 [mysqld] char ...

  6. ichartjs 制作的图表

    ichartjs资源包下载:https://files.cnblogs.com/files/xiandedanteng/ichartjs-ichartjs1.2.zip 本例下载地址:https:// ...

  7. Vue 内容分发slot

    1.概述 内容分发:混合父组件的内容与子组件自己的模板. 2.单个插槽 当子组件模板只有一个没有属性的插槽时,父组件传入的整个内容片段将插入到插槽所在的 DOM 位置,并替换掉插槽标签本身. 最初在  ...

  8. apue学习笔记(第九章 进程关系)

    本章将详细地说明进程组以及POSIX.1引入的会话的概念.还将介绍登录shell和所有从登录shell启动的进程之间的关系 终端登录 BSD终端登录.系统管理者创建通常名为/etc/ttys的文件,其 ...

  9. c语言字符数组的初始化问题

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...

  10. sql数据分页

    方法一.直接限制返回区间 (只适应于mysql) SELECT * FROM table WHERE 查询条件 ORDER BY 排序条件 LIMIT ((页码-1)*页大小),页大小; 优点:写法简 ...