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算法调用:

 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推荐算法的更多相关文章

  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. su su- sudo

    su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码. linux su 命令 建议大家切换用户的时候 使用 su - root 这样,否则可能发现某些命令执行不了 关于su .s ...

  2. mysql之group by,order by

    写在前面 上篇文章介绍mysql的增删改查操作,这篇将介绍group和order by操作. 系列文章 mysql之创建数据库,创建数据表 mysql之select,insert,delete,upd ...

  3. 负样本采样及bias校准、ctr平滑

    参考:https://zhuanlan.zhihu.com/p/31529643 在CTR预估中,负样本采样是一种常见的特征工程方法.一般CTR预估的原始正负样本比可能达到1:1000~1:10000 ...

  4. Codis连接异常问题处理

    报错信息可以看出:由于没有正常的关闭连接,导致连接异常 Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Unex ...

  5. @Cacheable注解在spring3中的使用-实现缓存

    转:  http://blog.csdn.net/chenleixing/article/details/44815443 在软件开发中使用缓存已经有一个非常久的历史了.缓存是一种很好的设计思想,一旦 ...

  6. MAC - 命令行中用sublime打开指定文件,使用ln命令建立软链接

    眼下sublime是mac下最好的文本编辑软件.常常要使用它打开一些文件,比如html,js,txt,json等文件,可是sublime2默认不支持在命令行下调用.经过研究发现能够用建立软连接的方式调 ...

  7. JAVA Eclipse开发Android程序如何自定义图标

    直接用做好的png图片替换res的所有分辨率的lc_launcher.png图片 注意到不同文件夹有不同的分辨率,直接把png图片做成最大的替换掉即可,不管小的. drawable-xxhdpi    ...

  8. MySql(六):影响 MySQL Server 性能的相关因素

    MySQL 最多的使用场景是WEB 应用,那么我们就以一个WEB 应用系统为例,逐个分析其系统构成,进行经验总结,分析出数据库应用系统中各个环境对性能的影响. 一.商业需求对性能的影响 这里我们就拿一 ...

  9. 关于C++项目指针对象未被初始化的问题(0xcdcdcd)

    http://blog.csdn.net/devfun/article/details/6900086 昨天我试图将一个封装好的模块加入到正在开发的项目中,这个模块不是单独的类,而且对应的声明和实例. ...

  10. 利用xlrd模块实现Python读取Excel文档

    # -*- coding: cp936 -*- #python读取excel import xlrd def main(): xls=xlrd.open_workbook("d:\\11.x ...