基于mllib的协同过滤实战(电影推荐)

//加载需要的包

import org.apache.spark.rdd._
import org.apache.spark.mllib.recommendation.{ALS, Rating, MatrixFactorizationModel}

//读取数据
val ratings = sc.textFile("D:/BaiduYunDownload/machine-learning/movielens/medium/ratings.dat").map { line =>  val fields = line.split("::")  (fields(3).toLong % 10, Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble))}

//数据情况探索(评分数,用户数,物品数)
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 on " + numMovies + " movies.")

//某个人评分数据

val myRatingsRDD = sc.textFile("D:/BaiduYunDownload/machine-learning/bin/personalRatings.txt").map { line =>  val fields = line.split("::")  Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble)}

//拆分训练集,校验集,测试集(ratings是(Int,Rating)格式,取values即可)

val numPartitions = 4val training = ratings.filter(x => x._1 < 6)  .values  .union(myRatingsRDD) //加入个人评分数据  .repartition(numPartitions)  .cache()val validation = ratings.filter(x => x._1 >= 6 && x._1 < 8)  .values  .repartition(numPartitions)  .cache()val test = ratings.filter(x => x._1 >= 8).values.cache()val numTraining = training.count()val numValidation = validation.count()val numTest = test.count()println("Training: " + numTraining + ", validation: " + numValidation + ", test: " + numTest)

// 校验集预测数据和实际数据之间的均方根误差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)))    .values  math.sqrt(predictionsAndRatings.map(x => (x._1 - x._2) * (x._1 - x._2)).reduce(_ + _) / n)}
//训练不同参数下的模型,并在校验集中验证,获取最佳参数下的模型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 = validationRmse    bestRank = rank    bestLambda = lambda    bestNumIter = numIter  }}
//用最佳模型作用于测试集,并计算预测评分和实际评分之间的均方根误差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 + ".")



//比较将最佳模型作用于测试集的结果:testRmse 与 仅仅用均值预测的结果进行比较,计算模型提升度。val meanRating = training.union(validation).map(_.rating).meanval baselineRmse = math.sqrt(test.map(x => (meanRating - x.rating) * (meanRating - x.rating)).mean)val improvement = (baselineRmse - testRmse) / baselineRmse * 100println("The best model improves the baseline by " + "%1.2f".format(improvement) + "%.")



//装载电影目录对照表(电影ID->电影标题)val movies = sc.textFile("D:/BaiduYunDownload/machine-learning/movielens/medium/movies.dat").map { line =>  val fields = line.split("::")  (fields(0).toInt, fields(1))}.collect().toMap

// 推荐前十部最感兴趣的电影,注意要剔除用户已经评分的电影val myRatedMovieIds = myRatingsRDD.map(_.product).collect().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}


over!!

  

时间: 2024-07-31 14:17:17

基于mllib的协同过滤实战(电影推荐)的相关文章

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

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,

推荐算法之基于用户的协同过滤算法

协同过滤是推荐算法中最基本的算法,主要分为基于用户的协同过滤算法和基于物品的协同过滤算法. 这篇文章主要介绍基于用户的协同过滤算法,简单来说,要给用户u作推荐,那么只要找出那些和u之前的行为类似的用户,即和u比较像的用户,把他们的行为推荐给用户u即可.所以基于用户的系统过滤算法包括两个步骤:1)找到和目标用户兴趣相似的用户集合  2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 第一步的关键点在于计算用户之间的相似度,相似度一般通过Jaccard公式或者余弦相似度即可求

基于用户的协同过滤推荐算法原理和实现

在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是推荐系统领域最著名的算法. 本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其他你有可能感兴趣的人. 基本思想 俗话说"物以类聚.人以群分",拿看电影这个例子来说,如果你喜欢<蝙蝠侠>.<碟中谍>.&l

【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)

好早的时候就打算写这篇文章,但是还是参加阿里大数据竞赛的第一季三月份的时候实验就完成了,硬生生是拖到了十一假期,自己也是醉了...找工作不是很顺利,希望写点东西回顾一下知识,然后再攒点人品吧,只能如此了. 一.问题背景 二.基于用户的协同过滤算法介绍 三.数据结构和实验过程设计 四.代码 一.问题背景 首先介绍一下问题的背景,现在我有四个月的用户.品牌数据<user,brand>,即用户在这四个月中的某一天购买了某个品牌(当然为了简化算法模型,将购买时间省去,后面再说).即现在有这四个月的数据

基于用户的协同过滤推荐算法

什么是推荐算法 推荐算法最早在1992年就提出来了,但是火起来实际上是最近这些年的事情,因为互联网的爆发,有了更大的数据量可以供我们使用,推荐算法才有了很大的用武之地. 最开始,所以我们在网上找资料,都是进yahoo,然后分门别类的点进去,找到你想要的东西,这是一个人工过程,到后来,我们用google,直接搜索自 己需要的内容,这些都可以比较精准的找到你想要的东西,但是,如果我自己都不知道自己要找什么肿么办?最典型的例子就是,如果我打开豆瓣找电影,或者我去 买说,我实际上不知道我想要买什么或者看

基于协同过滤的新闻推荐思路分享

目录结构 1,推荐系统的概率及部署 2,新闻推荐系统特点分析 3,协同过滤算法分析 4,系统评估与安全 一:推荐系统的概览及部署 首先明确一个概念,推荐系统是什么,或者说解决了什么样的一个问题. 新闻推荐系统解决的是咨询.用户和环境之间的关系,如图,通过对用户特征.环境特征.文章特征做综合分析,将最合适.有效的内容推荐给用户. 推荐系统在业务平台的定位 正所谓巧妇难为无米之炊,不光新闻推荐系统,几乎所有人工智能模型都离不开大数据组件的支持. 要做到一个“千人千面的推荐系统“,需要大数据的支持,可

推荐算法之基于物品的协同过滤

基于物品的协同过滤( item-based collaborative filtering )算法是此前业界应用较多的算法.无论是亚马逊网,还是Netflix .Hulu . YouTube ,其推荐算法的基础都是该算法.为行文方便,下文以英文简称ItemCF表示.本文将从其基础算法讲起,一步步进行改进并基于MovieLens 数据集给出代码实现,带你领略这一经典算法的美. 1.基本原理 前面我们简单讲解了一下基于用户的协同过滤推荐(UserCF),并且给出了实现代码.还不了解的朋友可以转到链接

推荐算法简介:基于用户的协同过滤、基于物品的协同过滤、基于内容的推荐

参考来源: https://blog.csdn.net/u011748319/article/details/90269818 1.推荐算法 1.1.协同过滤 协同过滤是目前应用最广泛的推荐算法,它仅仅通过了解用户与物品之间的关系进行推荐,而根本不会考虑到物品本身的属性. 可分成两类: 1.基于用户(user-based)的协同过滤 2.基于商品(item-based)的协同过滤 1.1.1.基于用户的协同过滤 基本思想: 基于用户对物品的偏好找到邻居用户(相似用户),然后将邻居用户(相似用户)

推荐算法之基于物品的协同过滤算法

基于物品的协同过滤算法(ItemCF)是业界应用最多的算法,主要思想是利用用户之前有过的行为,给用户推荐和之前物品类似的物品. 基于物品的协同过滤算法主要分为两步: 1)计算物品之间的相似度. 2)依据物品的相似度和用户的历史行为给用户生成推荐列表. 第一步的关键点在于计算物品之间的相似度,这里并不採用基于内容的相似性,而是去计算在喜欢物品i的用户中有多少是喜欢物品j的,这样计算的前提是用户的兴趣爱好通常是比較确定的,不easy变,那么当一个用户对两个物品都喜欢的时候,我们往往能够觉得这两个物品