- 浏览: 596119 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
import org.apache.log4j.{Level, Logger} import org.apache.spark.mllib.recommendation.{ALS, MatrixFactorizationModel, Rating} import org.apache.spark.rdd._ import org.apache.spark.{SparkContext, SparkConf} import org.apache.spark.SparkContext._ import scala.io.Source object MovieLensALS { def main(args:Array[String]) { // 屏蔽不必要的日志显示在终端上 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]") 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("::") // 格式 -> (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("::") // 格式 --> (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 = 4 val 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] = None var bestValidationRmse = Double.MaxValue var bestRank = 0 var bestLambda = -1.0 var bestNumIter = -1 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 = validationRmse bestRank = rank bestLambda = lambda bestNumIter = 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 model val 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 * 100 println("The best model improves the baseline by " + "%1.2f".format(improvement) + "%.") // 推荐前十部最感兴趣的电影,注意要剔除用户已经评分的电影 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 = 1 println("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))).values math.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://m635674608.iteye.com/blog/2285683
发表评论
文章已被作者锁定,不允许评论。
-
Spark 会把数据都载入到内存吗
2017-06-01 10:14 814前言 很多初学者其实对Spark的编程模式还是RDD这个概念理 ... -
Spark Driver和Executor资源调度学习
2017-05-31 16:14 975一、引子 在Worker Actor中,每次LaunchE ... -
Spark 实现TopN的问题(groupBy)
2017-05-31 14:11 1400t2.txt ab 11 ab 23 ab 13 a ... -
Spark block和partition的区别
2017-05-31 13:48 973hdfs中的block是分布式存储的最小单元,类似于盛放文件的 ... -
Spark 什么是DAG(有向无环图)(窄依赖和宽依赖)
2017-05-26 16:46 2142在Spark里每一个操作生成一个RDD,RDD之间连一条边,最 ... -
Spark 为什么比Hadoop快
2017-05-25 16:12 1335Spark SQL比Hadoop Hive快, ... -
Spark 集群的搭建(1.6.3)
2017-05-24 10:41 8参考内容:http://www.cnblogs.com/one ... -
Spark shuffle实现详细探究学习
2017-04-28 15:08 572Background 在MapReduce框架中,shuffl ... -
Spark collect和take函数学习(RDD-->Array)
2017-04-27 15:44 2106将RDD转成Scala数组,并返回。 函数原型 def ... -
Spark parallelize函数和makeRDD函数的区别(Array-->RDD)
2017-04-27 14:56 824我们知道,在Spark中创建RDD的创建方式大概可以分为三种: ... -
Spark Streaming实时计算学习
2017-04-27 10:31 942随着大数据的发展,人们对大数据的处理要求也越来越高,原有的批处 ... -
Spark 集群的搭建学习(1.6.3)
2017-04-25 14:30 784Spark是一个快速、通用的计算集群框架,它的内核使用Scal ... -
Spark SQL简单示例学习
2017-04-25 14:17 758Spark SQL 作为Apache Spark大数据框架的一 ... -
Spark RDD基于内存的集群计算容错抽象(核心概念)
2017-04-11 20:09 671摘要 本文提出了分布 ... -
Spark 入门知识学习
2017-04-08 11:46 400什么是Spark Apache Spark是 ...
相关推荐
Spark MLlib 是 Apache Spark 的机器学习库,其中包含多种机器学习算法,如协同过滤(Collaborative Filtering, CF)。在本实例中,我们将探讨如何使用 PySpark(Python 接口)实现基于 MLlib 的协同过滤推荐算法...
电影推荐系统中运用的推荐算法是基于协同过滤算法(Collaborative Filtering Recommendation)。协同过滤是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,...
基于Spark MLlib平台,通过协同过滤算法实现电影推荐功能协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能...
项目概述:本Scala源码项目构建于Spark MLlib平台之上,实现了一套协同过滤的电影推荐系统。项目共包含208个文件,以Scala为主要编程语言,同时整合了JavaScript、CSS和HTML技术。 文件构成: - Scala源文件:9个,...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
本项目基于Apache Spark的机器学习库MLlib,采用ALS(Alternating Least Squares)算法,构建了一个电影推荐系统。此系统旨在根据用户的历史行为和偏好,为他们提供个性化的电影推荐,从而提高用户体验和满意度。 ...
总之,推荐系统在电影推荐领域发挥着重要作用,Apache Spark的MLlib提供了强大的工具来实现协同过滤算法。通过学习和实践,你不仅可以了解推荐系统的原理,还能掌握使用大数据工具处理和分析数据的技能,这对于从事...
Apache Spark MLlib是Spark生态系统中的一个机器学习库,提供了各种常用机器学习算法的实现,如分类、回归、聚类、协同过滤等,同时还包括了特征提取、转换、选择等工具。MLlib的设计目的是为了简化机器学习在大规模...
基于Spark的电影推荐系统是使用Spark MLlib的ALS推荐算法,对会员电影评分数据和观看记录的数据构建协同过滤式的推荐引擎,对历史数据进行训练创建模型进行针对用户推荐电影和针对电影推荐用户的推荐功能,由此来...
总的来说,这个基于Spark MLlib的电影推荐系统项目,不仅展示了如何利用大数据工具处理实际问题,还涵盖了机器学习中的协同过滤技术。对于想要在IT行业,特别是大数据和推荐系统方向发展的专业人士,这是一个非常...
我们将深入探讨如何使用Python编程语言和Apache Spark的机器学习库MMLib中的协同过滤(Collaborative Filtering, CF)以及latent factor models(LFM)算法,特别是Alternating Least Squares(ALS)来实现电影推荐...
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主...4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
2. **MLlib库**:MLlib是Spark中的机器学习库,包含了多种机器学习算法和实用工具,如分类、回归、聚类、协同过滤等,以及模型选择和评估方法。它提供了统一的API,便于在分布式环境中操作大规模数据集。 3. **机器...
在本项目"基于协同过滤和Spark-ALS的电影推荐系统"中,我们将深入探讨如何利用机器学习算法,特别是协同过滤(Collaborative Filtering)和Apache Spark的 Alternating Least Squares (ALS) 实现这一功能。...
在推荐系统部分,我们将重点讨论如何利用Spark的协同过滤算法。该算法基于用户的历史行为,找出具有相似兴趣的用户或物品,然后进行推荐。此外,还可以考虑引入基于内容的推荐,结合电影的元数据(如类型、导演、...