Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)
我们如今開始训练模型,还输入參数例如以下:
rank:ALS中因子的个数。通常来说越大越好,可是对内存占用率有直接影响,通常rank在10到200之间。
iterations:迭代次数,每次迭代都会降低ALS的重构误差。在几次迭代之后,ALS模型都会收敛得到一个不错的结果,所以大多情况下不须要太多的迭代(一般是10次)。
lambda:模型的正则化參数,控制着避免过度拟合。值越大,越正则化。
我们将使用50个因子,8次迭代,正则化參数0.01来训练模型:
val model = ALS.train(ratings, 50, 8, 0.01)
说明:原书中使用的迭代參数是10。可是在本机上使用10次迭代參数会造成堆内存溢出,经过调试将它改成8。
它会返回一个MatrixFactorizationModel对象,包括了user和item的RDD,以(id。factor)对的形式,它们是userFeatures和productFeatures。
println(model.userFeatures.count)
println(model.productFeatures.count)
MatrixFactorizationModel类有有一个很方便的方法predict,会针对某个用户和物品的组合预測分数。
val predictedRating = model.predict(789, 123)
这里选择的用户id为789。计算他对电影123可能的评分。结果例如以下:
你得到的结果可能跟我这的不一样,由于ALS模型是随机初始化的。
predict方法会创建一个RDD(user,item),为某个用户进行个性化推荐,MatrixFactorizationModel提供了一个很方便的方法——recommendProducts。输入參数:user,num。user是用户id,num是将要推荐的个数。
如今为用户789推荐10部电影:
val userID = 789
val K = 10
val topKRecs = model.recommendProducts(userID, K);
println(topKRecs.mkString("\n"))
结果例如以下:
以下取到电影的名字:
val movies = sc.textFile("F:\\ScalaWorkSpace\\data\\ml-100k\\u.item")
val titles = movies.map(line => line.split("\\|").take(2)).map(array => (array(0).toInt, array(1))).collectAsMap()
println(titles(123))
结果例如以下:
我们再来看看用户789对多少部电影进行了评分:
val moviesForUser = ratings.keyBy(_.user).lookup(789)
println(moviesForUser.size)
结果例如以下:
能够看到用户789对33部电影进行了评分。
接下来我们将要取得前10个评分最高的电影,使用Rating对象的rating字段。而且得到依据电影的id得打电影的名字:
moviesForUser.sortBy(-_.rating).take(10).map(rating => (titles(rating.product), rating.rating)).foreach(println)
结果例如以下:
然后我们再来看看为这个用户推荐的是哪10部电影:
topKRecs.map(rating => (titles(rating.product), rating.rating)).foreach(println)
结果例如以下:
找到类似电影
通过计算两个向量的夹角的余弦值来推断类似度,假设是1,那么说明全然一样,假设是0那么说明没有相关性,假设是-1则表明这两者是全然相反的。首先编写计算两个向量夹角余弦值的方法:
def cosineSimilarity(vec1: DoubleMatrix, vec2: DoubleMatrix): Double = {
vec1.dot(vec2) / (vec1.norm2() * vec2.norm2())
}
如今来检測下是否正确,选一个电影。看看它与它本身类似度是否是1:
val itemId = 567
val itemFactor = model.productFeatures.lookup(itemId).head
val itemVector = new DoubleMatrix(itemFactor)
println(cosineSimilarity(itemVector, itemVector))
能够看到得出的结果是1!
接下来我们计算其它电影与它的类似度:
val sims = model.productFeatures.map{ case (id, factor) =>
val factorVector = new DoubleMatrix(factor)
val sim = cosineSimilarity(factorVector, itemVector)
(id,sim)
}
然后取得前10个:
val sortedSims = sims.top(K)(Ordering.by[(Int, Double), Double]{
case(id, similarity) => similarity
})
println(sortedSims.take(10).mkString("\n"))
结果例如以下:
如今来看看电影名字:
val sortedSims2 = sims.top(K+1)(Ordering.by[(Int, Double), Double]{
case(id, similarity) => similarity
})
println(sortedSims2.slice(1, 11).map{case (id, sim) => (titles(id), sim)}.mkString("\n"))
结果例如以下:
Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)的更多相关文章
- Machine Learning With Spark学习笔记(提取10万电影数据特征)
注:原文中的代码是在spark-shell中编写运行的,本人的是在eclipse中编写运行,所以结果输出形式可能会与这本书中的不太一样. 首先将用户数据u.data读入SparkContext中.然后 ...
- Deep learning with Python 学习笔记(10)
生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...
- Coursera 机器学习 第6章(下) Machine Learning System Design 学习笔记
Machine Learning System Design下面会讨论机器学习系统的设计.分析在设计复杂机器学习系统时将会遇到的主要问题,给出如何巧妙构造一个复杂的机器学习系统的建议.6.4 Buil ...
- Machine Learning(Andrew Ng)学习笔记
1.监督学习(supervised learning)&非监督学习(unsupervised learning) 监督学习:处理具有若干属性且返回值不同的对象.分为回归型和分类型:回归型的返回 ...
- Deep learning with Python 学习笔记(11)
总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...
- Deep learning with Python 学习笔记(9)
神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...
- 机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据
机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据 关键字:PCA.主成分分析.降维作者:米仓山下时间:2018-11-15机器学习实战(Ma ...
- Spark学习笔记之SparkRDD
Spark学习笔记之SparkRDD 一. 基本概念 RDD(resilient distributed datasets)弹性分布式数据集. 来自于两方面 ① 内存集合和外部存储系统 ② ...
- spark学习笔记总结-spark入门资料精化
Spark学习笔记 Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用. ...
随机推荐
- Java lock 能被中断, synchronized 不能被中断
1.lock是可中断锁,而synchronized 不是可中断锁 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定, 如果使用 synchronized ,如果A不释放, ...
- ftp protocol
RFC http://www.w3.org/Protocols/rfc959/4_FileTransfer.html http://blog.chinaunix.net/uid-17238776-id ...
- C-常用构造哈希函数
1.定址法(比如0-100岁的人数统计, 可以按年龄作为散列地址, 1980年后每年出生人数的统计, 可以把"年限 - 1980"作为散列地址) 2.取余法 3.数字分析法(比如一 ...
- c# 操作Word总结
在医疗管理系统中为保存患者的体检和治疗记录,方便以后的医生或其他人查看.当把数据保存到数据库中,需要新建很多的字段,而且操作很繁琐,于是想到网页的信息创建到一个word文本中,在显示的时,可以在线打开 ...
- android 屏幕上面画线
作业如下:在android屏幕上面任意画线 package feng.f121.drawline;//本人创建的包名,每人有每人的不同的包 import java.security.PublicKey ...
- Tomcat服务器配置https协议(Tomcat HTTPS/SSL 配置)
通常商用服务器使用https协议需要申请SSL证书,证书都是收费的,价格有贵的有便宜的.它们的区别是发行证书的机构不同,贵的证书机构更权威,证书被浏览器否决的几率更小. 非商业版本可以通过keytoo ...
- Kernel ridge regression(KRR)
作者:桂. 时间:2017-05-23 15:52:51 链接:http://www.cnblogs.com/xingshansi/p/6895710.html 一.理论描述 Kernel ridg ...
- Spring Cloud概述
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...
- Atitit. 软件GUI按钮与仪表盘--web服务器区--获取apache配置文件路径 linux and apache的启动、停止、重启
Atitit. 软件GUI按钮与仪表盘--web服务器区--获取apache配置文件路径 linux and apache的启动.停止.重启 可以通过"netstat -anp" ...
- 【转】搞清楚LzoCodec和LzopCodec
使用LZO过程会发现它有两种压缩编码可以使用,即LzoCodec和LzopCodec,下面说说它们区别: LzoCodec比LzopCodec更快, LzopCodec为了兼容LZOP程序添加了如 b ...