http://ihoge.cn/2018/ML1.html

协同过滤算法

​ 获取spark自带的MovieLens数据集,其中每行包含一个用户、一个电影、一个该用户对该电影的评分以及时间戳。我们使用默认的ALS.train() 方法,即显性反馈(默认implicitPrefs 为false)来构建推荐模型并根据模型对评分预测的均方根误差来对模型进行评估。

导入需要的包:

import org.apache.spark.ml.evaluation.RegressionEvaluator
import org.apache.spark.ml.recommendation.ALS

根据数据结构创建读取规范

创建一个Rating类型,即[Int, Int, Float, Long];然后建造一个把数据中每一行转化成Rating类的函数。

case class Rating(userId: Int, movieId: Int, rating: Float, timestamp: Long)
def parseRating(str: String): Rating = {val fields = str.split("::")assert(fields.size == 4)Rating(fields(0).toInt, fields(1).toInt, fields(2).toFloat, fields(3).toLong)}

读取数据:

导入implicits,读取MovieLens数据集,把数据转化成Rating类型;

import spark.implicits._
val ratings = spark.sparkContext.textFile("file:///home/hduser/spark/data/mllib/als/sample_movielens_ratings.txt").map(parseRating).toDF()

然后打印数据

ratings.show()

构建模型

把MovieLens数据集划分训练集和测试集

val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))

使用ALS来建立推荐模型,这里我们构建了两个模型,一个是显性反馈,一个是隐性反馈

val alsExplicit = new ALS().setMaxIter(5).setRegParam(0.01).setUserCol("userId"). setItemCol("movieId").setRatingCol("rating")
val alsImplicit = new ALS().setMaxIter(5).setRegParam(0.01).setImplicitPrefs(true). setUserCol("userId").setItemCol("movieId").setRatingCol("rating")

在 ML 中的实现有如下的参数:

  • numBlocks 是用于并行化计算的用户和商品的分块个数 (默认为10)。
  • rank 是模型中隐语义因子的个数(默认为10)。
  • maxIter 是迭代的次数(默认为10)。
  • regParam 是ALS的正则化参数(默认为1.0)。
  • implicitPrefs 决定了是用显性反馈ALS的版本还是用适用隐性反馈数据集的版本(默认是false,即用显性反馈)。
  • alpha 是一个针对于隐性反馈 ALS 版本的参数,这个参数决定了偏好行为强度的基准(默认为1.0)。
  • nonnegative 决定是否对最小二乘法使用非负的限制(默认为false)。

    可以调整这些参数,不断优化结果,使均方差变小。比如:imaxIter越大,regParam越 小,均方差会越小,推荐结果较优。

接下来,把推荐模型放在训练数据上训练:

val modelExplicit = alsExplicit.fit(training)
val modelImplicit = alsImplicit.fit(training)

模型预测

使用训练好的推荐模型对测试集中的用户商品进行预测评分,得到预测评分的数据集

val predictionsExplicit = modelExplicit.transform(test)
val predictionsImplicit = modelImplicit.transform(test)

我们把结果输出,对比一下真实结果与预测结果:

predictionsExplicit.show()
predictionsImplicit.show()

模型评估

通过计算模型的均方根误差来对模型进行评估,均方根误差越小,模型越准确:

val evaluator = new RegressionEvaluator().setMetricName("rmse").setLabelCol("rating"). setPredictionCol("prediction")
val rmseExplicit = evaluator.evaluate(predictionsExplicit)
val rmseImplicit = evaluator.evaluate(predictionsImplicit)

打印出两个模型的均方根误差 :

println(s"Explicit:Root-mean-square error = $rmseExplicit")
println(s"Implicit:Root-mean-square error = $rmseImplicit")

可以看到打分的均方差值为1.69和1.80左右。由于本例的数据量很少,预测的结果和实际相比有一定的差距。

Spark ML - 协同过滤相关推荐

  1. Spark MLlib协同过滤之交替最小二乘法ALS实践

    摘自Spark MLlib协同过滤之交替最小二乘法ALS原理与实践 为什么要使用最小二乘法?(稀疏) 在实际应用中,由于用户只会评价或交易少部分物品,评分矩阵一般都非常稀疏.这种情况下的挑战是用相对少 ...

  2. Spark机器学习——协同过滤推荐算法

    协同过滤介绍 协同过滤简单来说是利用某兴趣相投.拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不 ...

  3. Spark的协同过滤.Vs.Hadoop MR

    基于物品的协同过滤推荐算法案例在TDW Spark与MapReudce上的实现对比,相比于MapReduce,TDW Spark执行时间减少了66%,计算成本降低了40%. 原文链接:http://w ...

  4. Spark实现协同过滤CF算法实践

    Spark编写Scala实现CF算法 UI矩阵–>II矩阵–>排序 数据文件:user_item_score.data 下载链接:https://pan.baidu.com/s/1JH57 ...

  5. spark 逻辑回归算法案例_黄美灵的Spark ML机器学习实战

    原标题:黄美灵的Spark ML机器学习实战 本课程主要讲解基于Spark 2.x的ML,ML是相比MLlib更高级的机器学习库,相比MLlib更加高效.快捷:ML实现了常用的机器学习,如:聚类.分类 ...

  6. Spark MLlib中的协同过滤

    本文转自http://www.tuicool.com/articles/fANvieZ,所有权力归原作者所有. 本文主要通过Spark官方的例子,理解ALS协同过滤算法的原理和编码过程. 协同过滤 协 ...

  7. 离线轻量级大数据平台Spark之MLib机器学习协同过滤ALS实例

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

  8. Spark 2.2.0 文档中文版 Collaborative Filtering 协同过滤 JAVA推荐系统

    协同过滤常用于推荐系统,这项技术旨在填补 丢失的user-item关联矩阵 的条目,spark.ml目前支持基于模型的协同过滤(用一些丢失条目的潜在因素在描述用户和产品).spark.ml使用ALS( ...

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

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

最新文章

  1. java 锁竞争_Java多线程中的竞争条件、锁以及同步的概念
  2. 操作系统:进程调度算法
  3. Stark 组件:快速开发神器 —— 自动生成 URL
  4. BorderDet论文解读
  5. apache php隐藏头信息的方法,apache、php隐藏http头部版本信息的实现方法
  6. 中国庭院刮板市场趋势报告、技术动态创新及市场预测
  7. C#WinForm程序异常退出的捕获、继续执行与自动重启
  8. ABMultiValueCopyLabelAtIndex使用不当引起的内存泄漏
  9. Android apk如何加固防止被破解(防止逆向编译)
  10. Python: 日志库logging总结
  11. SQL_Server_2008完全学习之第五章操作架构、索引和视图
  12. 信息论基础(学习笔记整理)
  13. 闲置eSATA接口影响Windows 7启动速度
  14. java+毕业设计+进销存管理系统+源码+论文.rar
  15. Parsing R-CNN(CVPR2019)-人体实例分析论文解读
  16. 国外最流行的几个外包接活网站 简要介绍
  17. 水星无线网卡代理服务器端口,水星(Mercury)MW150U 3.0/4.0无线网卡AP模式设置
  18. 书籍推荐:国内第一本ASP.NET 3.5 MVC技术专著
  19. 微信小程序万里目_微信小程序加盟千万别忘了几个基本要求
  20. 鸿蒙杀戮手机电脑版,鸿蒙杀戮单职业安卓版下载-鸿蒙杀戮单职业手游下载v2.0-PChome下载中心...

热门文章

  1. 2019 AI Bootcamp·Guangzhou 参会日记
  2. 10分钟了解分布式CAP、BASE理论
  3. C#中谁最快:结构还是类?
  4. 分布式 - 分布式系统的特点
  5. Xamarin支持微软HoloLens混合现实开发
  6. Nginx使用upstream实现动静分离
  7. [转]2020年5月程序员工资统计,平均14542元
  8. js中null,undefined,false,0,'',[],{}判断方法
  9. 解决夜神模拟器无法联机调试 adb server version (**) doesn't match this client (**); killing...
  10. 完美解决ArcGIS10.x栅格空间插值报错无法进行和导出插值栅格结果出错的问题