我们如今開始训练模型,还输入參数例如以下:

rank:ALS中因子的个数。通常来说越大越好,可是对内存占用率有直接影响,通常rank在10到200之间。

iterations:迭代次数,每次迭代都会降低ALS的重构误差。在几次迭代之后,ALS模型都会收敛得到一个不错的结果,所以大多情况下不须要太多的迭代(一般是10次)。

lambda:模型的正则化參数,控制着避免过度拟合。值越大,越正则化。

我们将使用50个因子,8次迭代,正则化參数0.01来训练模型:

  1. val model = ALS.train(ratings, 50, 8, 0.01)

说明:原书中使用的迭代參数是10。可是在本机上使用10次迭代參数会造成堆内存溢出,经过调试将它改成8。

它会返回一个MatrixFactorizationModel对象,包括了user和item的RDD,以(id。factor)对的形式,它们是userFeatures和productFeatures。

  1. println(model.userFeatures.count)
  2. println(model.productFeatures.count)





MatrixFactorizationModel类有有一个很方便的方法predict,会针对某个用户和物品的组合预測分数。

  1. val predictedRating = model.predict(789, 123)

这里选择的用户id为789。计算他对电影123可能的评分。结果例如以下:



你得到的结果可能跟我这的不一样,由于ALS模型是随机初始化的。

predict方法会创建一个RDD(user,item),为某个用户进行个性化推荐,MatrixFactorizationModel提供了一个很方便的方法——recommendProducts。输入參数:user,num。user是用户id,num是将要推荐的个数。

如今为用户789推荐10部电影:

  1. val userID = 789
  2. val K = 10
  3. val topKRecs = model.recommendProducts(userID, K);
  4. println(topKRecs.mkString("\n"))

结果例如以下:



以下取到电影的名字:

  1. val movies = sc.textFile("F:\\ScalaWorkSpace\\data\\ml-100k\\u.item")
  2. val titles = movies.map(line => line.split("\\|").take(2)).map(array => (array(0).toInt, array(1))).collectAsMap()
  3. println(titles(123))

结果例如以下:



我们再来看看用户789对多少部电影进行了评分:

  1. val moviesForUser = ratings.keyBy(_.user).lookup(789)
  2. println(moviesForUser.size)

结果例如以下:



能够看到用户789对33部电影进行了评分。

接下来我们将要取得前10个评分最高的电影,使用Rating对象的rating字段。而且得到依据电影的id得打电影的名字:

  1. moviesForUser.sortBy(-_.rating).take(10).map(rating => (titles(rating.product), rating.rating)).foreach(println)

结果例如以下:



然后我们再来看看为这个用户推荐的是哪10部电影:

  1. topKRecs.map(rating => (titles(rating.product), rating.rating)).foreach(println)

结果例如以下:



找到类似电影

通过计算两个向量的夹角的余弦值来推断类似度,假设是1,那么说明全然一样,假设是0那么说明没有相关性,假设是-1则表明这两者是全然相反的。首先编写计算两个向量夹角余弦值的方法:

  1. def cosineSimilarity(vec1: DoubleMatrix, vec2: DoubleMatrix): Double = {
  2. vec1.dot(vec2) / (vec1.norm2() * vec2.norm2())
  3. }

如今来检測下是否正确,选一个电影。看看它与它本身类似度是否是1:

  1. val itemId = 567
  2. val itemFactor = model.productFeatures.lookup(itemId).head
  3. val itemVector = new DoubleMatrix(itemFactor)
  4. println(cosineSimilarity(itemVector, itemVector))



能够看到得出的结果是1!

接下来我们计算其它电影与它的类似度:

  1. val sims = model.productFeatures.map{ case (id, factor) =>
  2. val factorVector = new DoubleMatrix(factor)
  3. val sim = cosineSimilarity(factorVector, itemVector)
  4. (id,sim)
  5. }

然后取得前10个:

  1. val sortedSims = sims.top(K)(Ordering.by[(Int, Double), Double]{
  2. case(id, similarity) => similarity
  3. })
  4. println(sortedSims.take(10).mkString("\n"))

结果例如以下:



如今来看看电影名字:

  1. val sortedSims2 = sims.top(K+1)(Ordering.by[(Int, Double), Double]{
  2. case(id, similarity) => similarity
  3. })
  4. println(sortedSims2.slice(1, 11).map{case (id, sim) => (titles(id), sim)}.mkString("\n"))

结果例如以下:

Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)的更多相关文章

  1. Machine Learning With Spark学习笔记(提取10万电影数据特征)

    注:原文中的代码是在spark-shell中编写运行的,本人的是在eclipse中编写运行,所以结果输出形式可能会与这本书中的不太一样. 首先将用户数据u.data读入SparkContext中.然后 ...

  2. Deep learning with Python 学习笔记(10)

    生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...

  3. Coursera 机器学习 第6章(下) Machine Learning System Design 学习笔记

    Machine Learning System Design下面会讨论机器学习系统的设计.分析在设计复杂机器学习系统时将会遇到的主要问题,给出如何巧妙构造一个复杂的机器学习系统的建议.6.4 Buil ...

  4. Machine Learning(Andrew Ng)学习笔记

    1.监督学习(supervised learning)&非监督学习(unsupervised learning) 监督学习:处理具有若干属性且返回值不同的对象.分为回归型和分类型:回归型的返回 ...

  5. Deep learning with Python 学习笔记(11)

    总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...

  6. Deep learning with Python 学习笔记(9)

    神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...

  7. 机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据

    机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据 关键字:PCA.主成分分析.降维作者:米仓山下时间:2018-11-15机器学习实战(Ma ...

  8. Spark学习笔记之SparkRDD

    Spark学习笔记之SparkRDD 一.   基本概念 RDD(resilient distributed datasets)弹性分布式数据集. 来自于两方面 ①   内存集合和外部存储系统 ②   ...

  9. spark学习笔记总结-spark入门资料精化

    Spark学习笔记 Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用. ...

随机推荐

  1. Eclipse/Myeclipse中查看和调试JDK源代码的方法

    看过这篇文章后,实践写的 http://blog.csdn.net/qq_27857857/article/details/71250401 一共做了以下几部: 第一步: 第二步: 一直next,到第 ...

  2. java反射--通过反射了解集合泛型的本质

    通过Class,Method来认识泛型的本质 package com.reflect; import java.lang.reflect.Method; import java.util.ArrayL ...

  3. 解析theme()

    drupal_render()只是对theme()的调用做了包装,真正做任务的还是theme(). function theme($hook, $variables = array()) { ... ...

  4. Postman+Postman interceptor的安装和使用-解决把chrome浏览器登录状态同步到postman进行有依赖的接口测试 Postman 使用方法详解

    Postman+Postman interceptor的安装和使用-解决把chrome浏览器登录状态同步到postman进行有依赖的接口测试   问题引入:做接口测试时,有依赖关系的接口往往不好测试( ...

  5. 10 分钟实现一个自己的server监控器

    需求 近期须要给自己的server加入监控器.目的是监控server的内存.CPU.磁盘占用率,资源占用率过高的话能给自己发个提醒.当前主流的平台通常会提供邮件.短息.甚至会提供微信提醒,只是这类提醒 ...

  6. python 2/3 joblib.dump() 和 joblib.load()

    在python2中加载python3训练和保存的模型时出错: ValueErrorTraceback (most recent call last) --> 237 clf = joblib.l ...

  7. mysql常见数据提示 mysql报错提示大全

    错误代码和消息 目录 B.1. 服务器错误代码和消息 B.2. 客户端错误代码和消息 本章列出了当你用任何主机语言调用MySQL时可能出现的错误.首先列出了服务器错误消息.其次列出了客户端程序消息. ...

  8. Mysql 日期时间类型详解

    MySQL 中有多种数据类型可以用于日期和时间的表示,不同的版本可能有所差异,表3-2 中列出了MySQL 5.0 中所支持的日期和时间类型. 这些数据类型的主要区别如下: * 如果要用来表示年月日 ...

  9. 深入浅出ObjC之消息 (转)

    在入门级别的ObjC 教程中,我们常对从C++或Java 或其他面向对象语言转过来的程序员说,ObjC 中的方法调用(ObjC中的术语为消息)跟其他语言中的方法调用差不多,只是形式有些不同而已. 譬如 ...

  10. JMeter学习笔记(三)

    D. User Defined Variables:用户自定义的变量,在此我们可以定义后面原件需要引用的变量并对其进行赋值.jsessionid一般是服务器返回的,每个用户返回的都不一样,所以在此不应 ...