spark机器学习电影推荐
最近公司在弄推荐系统,抽时间学习了下。感觉这东西很强大。一般公司还真用不着,对数据的要求比较高(至少20W以上,否则不太准)。
下面是我对spark自带的电影推荐系统例子进行个人理解:
使用算法:ALS交替最小二乘法
电影数据列表(电影ID和电影名称、演片类型)
用户评分列表(用户ID,电影ID,评分,评分时间)
需推荐的测试数据
step1:加载
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)//设置日志级别
Logger.getLogger("org.apache.eclipse.jetty.server").setLevel(Level.OFF)
val sparkConf = new SparkConf().setAppName("MovieLensALS").setMaster("local[5]").set("spark.executor.memory", "2g")
val sc = new SparkContext(sparkConf)//测试数据加载,过滤出评分大于0的,转换为ratingRDD=>Rating(用户,电影,评分)
val myRatings = loadRatings("F:/datafile/test.dat")
val myRatingsRDD = sc.parallelize(myRatings, 1)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}}//加载用户评分列表和电影评分列表val ratings = sc.textFile(new File("F:/datafile/ratings.dat").toString).map { line =>val fields = line.split("::")(fields(3).toLong % 10, Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble))}//按时间取余分组val movies = sc.textFile(new File("F:/datafile/movies.dat").toString).map { line =>val fields = line.split("::")(fields(0).toInt, fields(1))}.collect().toMap
step2:显示数据情况
用户评分列表
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.")
step3:数据集合分块
将样本评分表以key值切分成3个部分,分别用于训练 (60%), 校验 (20%), 测试 (20%),并进行缓存
val numPartitions = 4 //分区数
val training = ratings.filter(x => x._1 < 6).values.union(myRatingsRDD).repartition(numPartitions).persist()//把60%的数据合上原始数据
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)
step4:参数配置
val ranks = List(8, 12)
val lambdas = List(0.1, 10.0)
val numIters = List(10, 20)
var bestModel: Option[MatrixFactorizationModel] = None
var bestValidationRmse = Double.MaxValue
var bestRank = 0
var bestLambda = -1.0
var bestNumIter = -1//平方根误差
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)//把预测的和现在的进行求平方根误差}//算出最佳rating
for (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} //通过方差大小比较去除最小的(即最好的)}
step5:推荐电影
排除测试数据中电影,并在模型中推荐出前10电影
val myRatedMovieIds = myRatings.map(_.product).toSet
val 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} //打印推荐的电影
总体来说写的挺好的,里面包含了很多东西。
不好的地方就是:应该根据你个人看过的电影,为你推荐你喜欢的电影.
spark机器学习电影推荐相关推荐
- 利用Spark MLIB实现电影推荐
利用Spark MLIB实现电影推荐 源码及数据集:https://github.com/luo948521848/BigData Spark 机器学习库MLLib MLlib是Spark的机器学习( ...
- 使用Java语言开发在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis)开发框架 机器学习、人工智能、大数据开发
使用Java语言开发在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis)开发框架 机器学习.人工智能.大数据开发 ...
- 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline
使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline 一.项目简 ...
- 在线电影推荐网 Python+Django+Mysql 协同过滤推荐算法在电影网站中的运用 基于用户、物品的协同过滤推荐算法 开发在线电影推荐系统 电影网站推荐系统 人工智能、大数据、机器学习开发
在线电影推荐网 Python+Django+Mysql 协同过滤推荐算法在电影网站中的运用 基于用户.物品的协同过滤推荐算法 开发在线电影推荐系统 电影网站推荐系统 人工智能.大数据.机器学习开发 M ...
- 在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户、物品的协同过滤推荐算法 个性化推荐算法开发 机器学习、人工智能、大数据分布式开发
在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户.物品的协同过滤推荐算法 个性化推荐算法开发 机器学习.人工智能.大数据分布式开发 Mo ...
- 【大数据 Spark】利用电影观看记录数据,进行电影推荐
利用电影观看记录数据,进行电影推荐. 文章目录 利用电影观看记录数据,进行电影推荐. 准备 1.任务描述: 2.数据下载 3.部分数据展示 实操 1.设置输入输出路径 2.配置spark 3.读取Ra ...
- 机器学习资料推荐 URL
1 http://blog.csdn.net/poiiy333/article/details/10282751 机器学习的资料较多,初学者可能会不知道怎样去有效的学习,所以对这方面的资料进行了一个 ...
- Spark机器学习实战 (十二) - 推荐系统实战
0 相关源码 将结合前述知识进行综合实战,以达到所学即所用.在推荐系统项目中,讲解了推荐系统基本原理以及实现推荐系统的架构思路,有其他相关研发经验基础的同学可以结合以往的经验,实现自己的推荐系统. 1 ...
- Spark机器学习之协同过滤算法
Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
- 毕业设计之基于协同过滤算法的电影推荐系统设计(一) - 项目简介
由于本人今年毕业,为完成毕设特地想着实现一个简单的推荐系统设计,思来想去,小电影不就是很好的切入点嘛! 于是诞生该项目,将会一步步带着大家实现一个自己的电影推荐系统. 1 研究目标 从应用场景来看,基 ...
最新文章
- ESP-12F模块转接板测试版调试说明,下载MicroPython程序。ESP8266-12F
- 双NameNode的同步机制
- (收藏)Turbo C 2.0、Borland C++库函数及用例
- sklearn综合示例5:多分类分类器
- python设置格式模板
- springboot系列十五、springboot集成PageHelper
- IM即时通讯结合mui 环信
- Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动
- 初探Object Pascal的类(七)
- 软件方法上竞赛自测题答案
- PRINCE2认证好在哪?
- deepin photoshop_Linux/Deepin 系统简单安装 Photoshop CS6 教程,附安装包
- Nature communications
- Java基础——对象和类1(面向对象基本概念)
- Protel (DXP2004sp2) 许可协议认证过程
- NDK OpenGL ES 3.0 开发(五):FBO 离屏渲染
- 95 费解的开关(递推)
- 微信订阅通知开发 (小白教程)微擎
- 树莓派与windows之间传输文件
- Google卫星地图定位(Resources)