用户电影评分数据集下载

http://grouplens.org/datasets/movielens/

1) Item-Based,非个性化的,每个人看到的都一样

2) User-Based,个性化的,每个人看到的不一样

对用户的行为分析得到用户的喜好后,可以根据用户的喜好计算相似用户和物品,然后可以基于相似用户或物品进行推荐。这就是协同过滤中的两个分支了,基于用户的和基于物品的协同过滤。

在计算用户之间的相似度时,是将一个用户对所有物品的偏好作为一个向量,而在计算物品之间的相似度时,是将所有用户对某个物品的偏好作为一个向量。求出相似度后,接下来可以求相似邻居了。

3)基于模型(ModelCF)

按照模型,可以分为:

1)最近邻模型:基于距离的协同过滤算法

       2)Latent Factor Mode(SVD):基于矩阵分解的模型

       3)Graph:图模型,社会网络图模型

适用场景

对于一个在线网站,用户的数量往往超过物品的数量,同时物品数据相对稳定,因此计算物品的相似度不但

计算量小,同时不必频繁更新。但是这种情况只适用于电子商务类型的网站,像新闻类,博客等这类网站的

系统推荐,情况往往是相反的,物品数量是海量的,而且频繁更新。

r语言实现基于物品的协同过滤算法

  #引用plyr包library(plyr)#读取数据集train<-read.table(file="C:/users/Administrator/Desktop/u.data",sep=" ")train<-train[1:3]names(train)<-c("user","item","pref")#计算用户列表方法usersUnique<-function(){users<-unique(train$user)users[order(users)]}#计算商品列表方法itemsUnique<-function(){items<-unique(train$item)items[order(items)]}# 用户列表users<-usersUnique()# 商品列表items<-itemsUnique() #建立商品列表索引index<-function(x) which(items %in% x)data<-ddply(train,.(user,item,pref),summarize,idx=index(item)) #同现矩阵cooccurrence<-function(data){n<-length(items)co<-matrix(rep(0,n*n),nrow=n)for(u in users){idx<-index(data$item[which(data$user==u)])m<-merge(idx,idx)for(i in 1:nrow(m)){co[m$x[i],m$y[i]]=co[m$x[i],m$y[i]]+1}}return(co)}#推荐算法recommend<-function(udata=udata,co=coMatrix,num=0){n<-length(items)# all of prefpref<-rep(0,n)pref[udata$idx]<-udata$pref# 用户评分矩阵userx<-matrix(pref,nrow=n)# 同现矩阵*评分矩阵r<-co %*% userx# 推荐结果排序 # 把该用户评分过的商品的推荐值设为0r[udata$idx]<-0idx<-order(r,decreasing=TRUE)topn<-data.frame(user=rep(udata$user[1],length(idx)),item=items[idx],val=r[idx])topn<-topn[which(topn$val>0),]# 推荐结果取前num个if(num>0){topn<-head(topn,num)}#返回结果return(topn)}#生成同现矩阵co<-cooccurrence(data) #计算推荐结果recommendation<-data.frame()for(i in 1:length(users)){udata<-data[which(data$user==users[i]),]recommendation<-rbind(recommendation,recommend(udata,co,0)) }

mareduce 实现

参考文章:

http://www.cnblogs.com/anny-1980/articles/3519555.html

代码下载

https://github.com/bsspirit/maven_hadoop_template/releases/tag/recommend

spark ALS实现

Spark mllib里用的是矩阵分解的协同过滤,不是UserBase也不是ItemBase。

参考文章:

http://www.mamicode.com/info-detail-865258.html


import org.apache.spark.SparkConf
import org.apache.spark.mllib.recommendation.{ALS, MatrixFactorizationModel, Rating}
import org.apache.spark.rdd._
import org.apache.spark.SparkContext
import scala.io.Sourceobject MovieLensALS {def main(args:Array[String]) {//设置运行环境val sparkConf = new SparkConf().setAppName("MovieLensALS").setMaster("local[5]")val sc = new SparkContext(sparkConf)//装载用户评分,该评分由评分器生成(即生成文件personalRatings.txt)val myRatings = loadRatings(args(1))val myRatingsRDD = sc.parallelize(myRatings, 1)//样本数据目录val movielensHomeDir = args(0)//装载样本评分数据,其中最后一列Timestamp取除10的余数作为key,Rating为值,即(Int,Rating)val ratings = sc.textFile(movielensHomeDir + "/ratings.dat").map {line =>val fields = line.split("::")// format: (timestamp % 10, Rating(userId, movieId, rating))(fields(3).toLong % 10, Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble))}//装载电影目录对照表(电影ID->电影标题)val movies = sc.textFile(movielensHomeDir + "/movies.dat").map {line =>val fields = line.split("::")// format: (movieId, movieName)(fields(0).toInt, fields(1))}.collect().toMap//统计有用户数量和电影数量以及用户对电影的评分数目val numRatings = ratings.count()val numUsers = ratings.map(_._2.user).distinct().count()val numMovies = ratings.map(_._2.product).distinct().count()println("Got " + numRatings + " ratings from " + numUsers + " users " + numMovies + " movies")//将样本评分表以key值切分成3个部分,分别用于训练 (60%,并加入用户评分), 校验 (20%), and 测试 (20%)//该数据在计算过程中要多次应用到,所以cache到内存val numPartitions = 4val training = ratings.filter(x => x._1 < 6).values.union(myRatingsRDD).repartition(numPartitions).persist()val validation = ratings.filter(x => x._1 >= 6 && x._1 < 8).values.repartition(numPartitions).persist()val test = ratings.filter(x => x._1 >= 8).values.persist()val numTraining = training.count()val numValidation = validation.count()val numTest = test.count()println("Training: " + numTraining + " validation: " + numValidation + " test: " + numTest)//训练不同参数下的模型,并在校验集中验证,获取最佳参数下的模型val ranks = List(8, 12)val lambdas = List(0.1, 10.0)val numIters = List(10, 20)var bestModel: Option[MatrixFactorizationModel] = Nonevar bestValidationRmse = Double.MaxValuevar bestRank = 0var bestLambda = -1.0var bestNumIter = -1for (rank <- ranks; lambda <- lambdas; numIter <- numIters) {val model = ALS.train(training, rank, numIter, lambda)val validationRmse = computeRmse(model, validation, numValidation)println("RMSE(validation) = " + validationRmse + " for the model trained with rank = "+ rank + ",lambda = " + lambda + ",and numIter = " + numIter + ".")if (validationRmse < bestValidationRmse) {bestModel = Some(model)bestValidationRmse = validationRmsebestRank = rankbestLambda = lambdabestNumIter = numIter}}//用最佳模型预测测试集的评分,并计算和实际评分之间的均方根误差(RMSE)val testRmse = computeRmse(bestModel.get, test, numTest)println("The best model was trained with rank = " + bestRank + " and lambda = " + bestLambda+ ", and numIter = " + bestNumIter + ", and its RMSE on the test set is " + testRmse + ".")//create a naive baseline and compare it with the best modelval meanRating = training.union(validation).map(_.rating).mean()val baselineRmse = math.sqrt(test.map(x => (meanRating - x.rating) * (meanRating - x.rating)).reduce(_ + _) / numTest)val improvement = (baselineRmse - testRmse) / baselineRmse * 100println("The best model improves the baseline by " + "%1.2f".format(improvement) + "%.")//推荐前十部最感兴趣的电影,注意要剔除用户已经评分的电影val myRatedMovieIds = myRatings.map(_.product).toSetval candidates = sc.parallelize(movies.keys.filter(!myRatedMovieIds.contains(_)).toSeq)val recommendations = bestModel.get.predict(candidates.map((0, _))).collect().sortBy(-_.rating).take(10)var i = 1println("Movies recommended for you:")recommendations.foreach { r =>println("%2d".format(i) + ": " + movies(r.product))i += 1}sc.stop()}/** 校验集预测数据和实际数据之间的均方根误差 **/def computeRmse(model:MatrixFactorizationModel,data:RDD[Rating],n:Long):Double = {val predictions:RDD[Rating] = model.predict(data.map(x => (x.user,x.product)))val predictionsAndRatings = predictions.map{ x =>((x.user,x.product),x.rating)}.join(data.map(x => ((x.user,x.product),x.rating))).valuesmath.sqrt(predictionsAndRatings.map( x => (x._1 - x._2) * (x._1 - x._2)).reduce(_+_)/n)}/** 装载用户评分文件 personalRatings.txt **/def loadRatings(path:String):Seq[Rating] = {val lines = Source.fromFile(path).getLines()val ratings = lines.map{line =>val fields = line.split("::")Rating(fields(0).toInt,fields(1).toInt,fields(2).toDouble)}.filter(_.rating > 0.0)if(ratings.isEmpty){sys.error("No ratings provided.")}else{ratings.toSeq}}}

参考文章:

http://blog.csdn.net/acdreamers/article/details/44672305

http://www.cnblogs.com/technology/p/4467895.html

http://blog.fens.me/rhadoop-mapreduce-rmr/

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1710048

协同过滤算法 R/mapreduce/spark mllib多语言实现相关推荐

  1. 基于Spark MLlib平台的协同过滤算法---电影推荐系统

    协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,协同过滤算法按照数据使用 ...

  2. spark MLlib平台的协同过滤算法---电影推荐系统

    又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实 ...

  3. mllib协同过滤 java实现_协同过滤(ALS)算法介绍及Spark MLlib调用实例(Scala/Java/Python)...

    协同过滤 算法介绍: 协同过滤常被用于推荐系统.这类技术目标在于填充"用户-商品"联系矩阵中的缺失项.Spark.ml目前支持基于模型的协同过滤,其中用户和商品以少量的潜在因子来描 ...

  4. mllib调参 spark_Spark MLlib协同过滤算法

    算法说明 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予 ...

  5. Spark机器学习之协同过滤算法

    Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...

  6. 使用Spark DataFrame实现基于物品的协同过滤算法(ItemCF)

    简书不支持Markdown Math语法,请移步https://glassywing.github.io/2018/04/10/spark-itemcf/ 简介 当前spark支持的协同过滤算法只有A ...

  7. 推荐系统(一)基于协同过滤算法开发离线推荐

    什么是离线推荐 所谓的离线推荐其实就是根据用户产生的行为日志,后台设定一个离线统计算法和离线推荐算法的任务来对这些行为日志进行周期性的统计,统计过后的结果数据为前台或者实时分析提供数据的支撑.离线推荐 ...

  8. 文章召回-基于ALS的协同过滤算法实践及评估

    文章召回-基于ALS的协同过滤算法 本项目完整源码地址:https://github.com/angeliababy/ALS_col 项目博客地址: https://blog.csdn.net/qq_ ...

  9. 基于协同过滤算法的在线鲜花店推荐系统详解及GitHub下载

    [[TOC]] 基于协同过滤的在线鲜花店推荐系统 项目需求: 基于店铺的客户订单记录,实现店铺的推荐需求: 基于RFM模型,得到客户的价值分类,对高价值客户进行重点跟踪,推荐其潜在的商品列表,即实现: ...

最新文章

  1. 位地址和字节地址换算_面试常考,项目易错,长文详解C/C++中的字节对齐
  2. [NOIP2008 提高组] 笨小猴-map容器用来标记
  3. VS2015 vc++ 项目出现new.h找不到的错误
  4. 5-2利用MapReduce进行数据排序
  5. 【英语学习】【English L06】U02 Food L3 Peking roast duck
  6. ping,python实现批量ping包工具--小案例v5阶段版本,可以使用了
  7. 【MQTT编程】消息Publish实践:Synchronous publication同步发布示例
  8. Elasticsearch 实战(四、分词与IK分词器)
  9. sprintf和fprintf
  10. CenterNet:Objects as Points代码解析(九):通过高斯函数画热点图
  11. vue创建的挂钩中出错_建立自己的Vue 3 SWR挂钩
  12. Python文件读取关闭和写入
  13. kubernetes 核心术语
  14. 图片编辑工具哪个好?好用的图片编辑工具介绍
  15. 数据挖掘与分析课程笔记(Chapter 7)
  16. 如何正确认识优越感和自卑感
  17. Mapbox、GeoServer离线部署矢量地图
  18. 数字标牌 android,【浩鑫推出全球首款英特尔方案+Android系统数字标牌播放器】PjTime.COM 新品快讯 Intel...
  19. python南开大学王恺_《信息处理技术》复习资料-王恺
  20. asp.net家居建材选购商场

热门文章

  1. java实现excel的导入导出(poi详解)
  2. 为什么淘宝、天猫和旺信的 App 不整合成一个?
  3. 第二组视频:MySQL复制
  4. eplan模板_EPLAN之3D箱柜清单自动生成
  5. 人员梯度培养_关键人才的梯队培养
  6. SSL_TLS快速扫描器SSLScan常用命令集合大学霸IT达人
  7. 领英Linkedin信息搜集工具InSpy
  8. 简易灯箱画廊设计html,原生Js实现的画廊功能
  9. java多线程发牌 一个发牌 三个玩家_JAVA代码之斗地主发牌
  10. Nilearn中的基本操作和查看