课后补充实验spark电影推荐系统_第1页
课后补充实验spark电影推荐系统_第2页
课后补充实验spark电影推荐系统_第3页
课后补充实验spark电影推荐系统_第4页
课后补充实验spark电影推荐系统_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Spark平台的协同过滤算法-推荐系统基于SparkMLlib平台的协同过滤算法---推荐系说到推荐系统,大家可能立想到协同过滤算法。本文基于SparkMLlib平台实现一个向用户推荐的简单应用。其中,主要包括三部分内容:实时推荐架构分一、协同过滤算法概基于用户基于商品最近邻模型:基于距离的协同过滤算LatentFactorMode(SVD):基于矩阵分解的模型1、基于用户(UserCF)---基于用户相似基于用户之间的相似性做出推荐。简单来讲,就是给用户推荐和他相似的如图,有三个用户A、B、C,四个物品A、B、C、D,需要向用户A这里,由于用户ACAC,所以,我们认为用户A用户CCD,那么就需要给AUserCF度,找到K2、基于商品(ItemCF)---基于商品相似itemitemitem如图,有三个用户A、B、C和三件物品A、B、C,需要向用户C里,由于用户AA和C,用户B买过物品A、B、C,用户CA,从用户ABAC,说明物品A和C常相似,同时,用户C又买过物品A,所以,将物品C推荐给用户C。基于ItemCF的原理和基于UserCF类似,只是在计算邻居时采用物品本身,而3、基于模型SparkMLlib因子进行表达,并且这些因子也用于预测缺失的元素。MLlib乘法(ALS)来学习这些隐性因子。如果 ,可以阅读Spark的这部分源代码二、基于模型的协同过滤应用---推荐本文实现对用户推荐的简单应用。1、测试数据描本次测试数据主要包括四个数据文件:(README文1)用户数据文用户ID::::::职业编号::2)数据文ID::名称::种类用户ID::ID::评分::时用户ID::ID::评分::时2、实现代码importorg.apache.log4j.{Level,importorg.apache mendation.{ALS,MatrixFactorizationModel,Rating}importimportorg.apache.spark.{SparkContext,SparkConf}importorg.apache.spark.SparkContext._importobjectMovieLensALSdefmain(args:Array[String])//不必要的日志显示在终端//valsparkConf=newSparkConf().setAppName("MovieLensALS").setMastervalsc=new valmyRatings=loadRatings(args(1))valmyRatingsRDD=sc.parallelize(myRatings,//valmovielensHomeDir=//装载样本评分数据,其中最后一列Timestamp10key,Rating为值,即(Int,Rating)valratings=sc.textFile(movielensHomeDir+"/ratings.dat").map{line=>valfields=//format:(timestamp%10,Rating(userId,movieId,(fields(3).toLong%10,Rating(fields(0).toInt,fields(1).toInt,fields(2).toDoub}//装载对照表(ID->标题valmovies=sc.textFile(movielensHomeDir+"/movies.dat").map{line=>valfields=//format:(movieId,movieName)(fields(0).toInt,fields(1))//统计有用户数量和数量以及用户对的评分数valnumRatings=valnumUsers=valnumMovies=println("Got"+numRatings+"ratingsfrom"+numUsers+"users"+numMovies+"movies")//key3(60%,并加入用户评分),校验(20%),and测试(20%)//cachevalnumPartitions=valtraining=ratings.filter(x=>x._1<6).values.union(myRatingsRDD).repvalvalidation=ratings.filter(x=>x._1>=6&&x._1<8).values.repartitiovaltest=ratings.filter(x=>x._1>=valnumTraining=valnumValidation=validation.count()valnumTest=test.count()println("Training:"+numTraining+"validation:"+numValidation+"test:"+numTest)valranks=List(8,12)vallambdas=List(0.1,10.0)valnumIters=List(10,20)varbestModel:Option[MatrixFactorizationModel]=NonevarbestValidationRmse=Double.MaxValuevarbestRank=varbestLambda=-1.0varbestNumIter=-1for(rank<-ranks;lambda<-lambdas;numIter<-numIters){valmodel=ALS.train(training,rank,numIter,lambda)valvalidationRmse=computeRmse(model,validation,println("RMSE(validation)="+validationRmse+"forthemodeltrainedwithrank="+rank+",lambda="+lambda+",andnumIter="+numIter+if(validationRmse<bestValidationRmse)bestModel=Some(model)bestValidationRmse=validationRmsebestRank=rankbestLambda=lambdabestNumIter=}}//用最佳模型预测测试集的评分,并计算和实际评分之间的均误差(RMSvaltestRmse=computeRmse(bestModel.get,test,println("Thebestmodelwastrainedwithrank="+bestRank+"andlambda="+bestLambda+",andnumIter="+bestNumIter+",anditsRMSEonthetestsetis"+testRmse+".")//createanaivebaselineandcompareitwiththebestmodelvalmeanRating=training.union(validation).map(_.rating).meanvalbaselineRmse=math.sqrt(test.map(x=>(meanRating-x.rating)*(meanRating-x.rating)).reduce(_+_)/numTest)valimprovement=(baselineRmse-testRmse)/baselineRmse*println("Thebestmodelimprovesthebaselineby"+"%1.2f".format(improvement)+"%.")//推荐前十部最感的,注意要剔除用户已经评分的valmyRatedMovieIds=valcandidates=sc.parallelize(movies.keys.filter(!myRatedMovieIds.contains mendations=.predict(candidates.map((0,.sortBy(-vari= mendedforyou:")mendations.foreach{r=>println("%2d".format(i)+":"+movies(duct))i+=1}}/**校验集预测数据和实际数据之间的均误差defcomputeRmse(model:MatrixFactorizationModel,data:RDD[Rating],n:Long):Double={valpredictions:RDD[Rating]=model.predict((data.map(x=>(x.user,duvalpredictionsAndRatings=predictions.map{x=>((x.user,duct),x.ratin.join(data.map(x=>math.sqrt(predictionsAndRatings.map(x=>(x._1-x._2)*(x._1-x._2)).r}/**装载用户评分文件alRatings.txt**/defloadRatings(path:String):Seq[Rating]={vallines=Source.fromFile(path).getLines()valratings=lines.map{line=>valfields=line.split("::")}.filter(_.rating>0.0)sys.error("Noratings}}}3、运行程这里有两个输入参数:第一个是数据文 ,第二个是测试数据从运行效果来看,总共有6040个用户,3706个(已经去重), 验、20%用户测试模型;接下来是模型在不同参数下的均误差(RMSE)值,以及对应的参数,最优的参数选择均误差(RMSE--- )最小参数 即最优参数模型建立;接着,使用20%的测试模型数据来测试模型好坏,也就是均误差(RMSE),这里计算的结果为 ,在22.32%程序运行效果---推荐结最后,给用户推荐10部自己未看过的4、总这样,一个简单的基于模

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论