Spark2.1.0入门:协同过滤算法

协同过滤是一种基于一组兴趣相同的用户或项目进行的推荐,它根据邻居用户(与目标用户兴趣相似的用户)的偏好信息产生对目标用户的推荐列表。

关于协同过滤的一个经典的例子就是看电影。如果你不知道哪一部电影是自己喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看最近有什么好的电影推荐。而在问的时候,肯定都习惯于问跟自己口味差不多的朋友,这就是协同过滤的核心思想。因此,协同过滤是在海量数据中挖掘出小部分与你品味类似的用户,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的东西组织成一个排序的目录推荐给你(如下图所示)。

importorg.apache.spark.ml.evaluation.RegressionEvaluatorimportorg.apache.spark.ml.recommendation.ALS2.根据数据结构创建读取规范:

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

scala>caseclassRating(userId:Int,movieId:Int,rating:Float,timestamp:Long)definedclassRatingscala>defparseRating(str:String):Rating={|valfields=str.split("::")|assert(fields.size==4)|Rating(fields(0).toInt,fields(1).toInt,fields(2).toFloat,fields(3).toLong)|}parseRating:(str:String)Rating3.读取数据:导入implicits,读取MovieLens数据集,把数据转化成Rating类型;

scala>importspark.implicits._importspark.implicits._scala>valratings=spark.sparkContext.textFile("file:///usr/local/spark/data/mllib/als/sample_movielens_ratings.txt").map(parseRating).toDF()ratings:org.apache.spark.sql.DataFrame=[userId:int,movieId:int...2morefields]然后,我们把数据打印看一下:

scala>ratings.show()+------+-------+------+----------+|userId|movieId|rating|timestamp|+------+-------+------+----------+|0|2|3.0|1424380312||0|3|1.0|1424380312||0|5|2.0|1424380312||0|9|4.0|1424380312||0|11|1.0|1424380312||0|12|2.0|1424380312||0|15|1.0|1424380312||0|17|1.0|1424380312||0|19|1.0|1424380312||0|21|1.0|1424380312||0|23|1.0|1424380312||0|26|3.0|1424380312||0|27|1.0|1424380312||0|28|1.0|1424380312||0|29|1.0|1424380312||0|30|1.0|1424380312||0|31|1.0|1424380312||0|34|1.0|1424380312||0|37|1.0|1424380312||0|41|2.0|1424380312|+------+-------+------+----------+onlyshowingtop20rows3.构建模型把MovieLens数据集划分训练集和测试集

scala>valArray(training,test)=ratings.randomSplit(Array(0.8,0.2))training:org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]=[userId:int,movieId:int...2morefields]test:org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]=[userId:int,movieId:int...2morefields]使用ALS来建立推荐模型,这里我们构建了两个模型,一个是显性反馈,一个是隐性反馈

scala>valalsExplicit=newALS().setMaxIter(5).setRegParam(0.01).setUserCol("userId").setItemCol("movieId").setRatingCol("rating")alsExplicit:org.apache.spark.ml.recommendation.ALS=als_05fe5d65ffc3scala>valalsImplicit=newALS().setMaxIter(5).setRegParam(0.01).setImplicitPrefs(true).setUserCol("userId").setItemCol("movieId").setRatingCol("rating")alsImplicit:org.apache.spark.ml.recommendation.ALS=als_7e9b959fbdae在ML中的实现有如下的参数:

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

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

scala>valmodelExplicit=alsExplicit.fit(training)modelExplicit:org.apache.spark.ml.recommendation.ALSModel=als_05fe5d65ffc3scala>valmodelImplicit=alsImplicit.fit(training)modelImplicit:org.apache.spark.ml.recommendation.ALSModel=als_7e9b959fbdae4.模型预测使用训练好的推荐模型对测试集中的用户商品进行预测评分,得到预测评分的数据集

scala>valpredictionsExplicit=modelExplicit.transform(test)predictionsExplicit:org.apache.spark.sql.DataFrame=[userId:int,movieId:int...3morefields]scala>valpredictionsImplicit=modelImplicit.transform(test)predictionsImplicit:org.apache.spark.sql.DataFrame=[userId:int,movieId:int...3morefields]我们把结果输出,对比一下真实结果与预测结果:

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

scala>valevaluator=newRegressionEvaluator().setMetricName("rmse").setLabelCol("rating").setPredictionCol("prediction")evaluator:org.apache.spark.ml.evaluation.RegressionEvaluator=regEval_bc9d91ae7b1ascala>valrmseExplicit=evaluator.evaluate(predictionsExplicit)rmseExplicit:Double=1.6995189118765517scala>valrmseImplicit=evaluator.evaluate(predictionsImplicit)rmseImplicit:Double=1.8011620822359165打印出两个模型的均方根误差:

scala>println(s"Explicit:Root-mean-squareerror=$rmseExplicit")Explicit:Root-mean-squareerror=1.6995189118765517scala>println(s"Implicit:Root-mean-squareerror=$rmseImplicit")Implicit:Root-mean-squareerror=1.8011620822359165可以看到打分的均方差值为1.69和1.80左右。由于本例的数据量很少,预测的结果和实际相比有一定的差距。

厦门大学软件工程系副教授,2009年毕业于中国人民大学计算机系获工学博士学位。主要研究方向是网络数据管理,车载网络,大数据分析和管理。

THE END
1.协同过滤——推荐系统算法原理在探讨推荐算法原理之前,先说一个概念:协同过滤(Collaborative Filtering)。 协同过滤一般是在海量的用户中发掘出一小部分和你品位比较类似的,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的其他东西组织成一个排序的目录作为推荐给你。 为了方便了解,举个简单的例子。最近新上映了10部电影,你不知道看哪一部,问你...https://www.jianshu.com/p/de1ae0e88b27
2.通过社交网络关系的图卷积协同过滤实现的产品推荐方法基于用户的协同过滤算法原理是利用其相似用户对该物品的所有评分的加权平均值,以此来 预测用户对某项物品的未知评分,而基于物品的协同过滤算法是预测用户对某项物品的评分是基 于用户对相似物品的平均评分。基于邻域的cf方法的关键问题是计算相似度和如何加权汇总评 分。 https://www.xjishu.com/zhuanli/55/202111235556.html
3.人工智能基础与应用宋楚平课后习题答案(30页)A.提高数据处理速度 B.节省存储空间 C.方便算法计算 D.形成商品交易矩阵 二、亮一亮 1.协同过滤推荐与关联规则推荐的区别是什么?他们各自适用在哪些场合?参考答案:协同过滤 (Collaborative filtering),是指通过收集群体用户的偏好信息,自动化预测(过滤)个体用户可能感兴趣的内容。协同过滤基于如下基本假设:如果一个人...https://max.book118.com/html/2021/0824/8011073132003137.shtm
1.协同过滤算法原理51CTO博客已为您找到关于协同过滤算法原理的相关内容,包含IT学习相关文档代码介绍、相关教程视频课程,以及协同过滤算法原理问答内容。更多协同过滤算法原理相关解答可以来51CTO博客参与分享和学习,帮助广大IT技术人实现成长和进步。https://blog.51cto.com/topic/780fa7612181653.html
2.协同过滤算法原理介绍基于用户的协同过滤协同过滤算法原理介绍 协同过滤推荐算法是诞生最早,并且较为著名的推荐算法。主要的功能是预测和推荐。算法通过对用户历史行为数据的挖掘发现用户的偏好,基于不同的偏好对用户进行群组划分并推荐品味相似的商品。协同过滤推荐算法分为两类,分别是基于用户的协同过滤算法(user-based collaboratIve filtering),和基于物品的...https://blog.csdn.net/shenxiaoming77/article/details/51217289
3.Python利用遗传算法探索迷宫出路实例深究python使用遗传算法解决迷宫问题涉及将上述原理应用到迷宫的搜索过程中。基于迷宫的二维数组表示,个体编码将是代表路径的序列。适应度函数将评估路径的有效性和质量,即路径是否能成功走出迷宫。选择、交叉和变异操作将在不断迭代中产生出下一代更优秀的路径,最终找到出路。 结合遗传算法的基本原理和迷宫问题的特点,可以设计一个...https://www.jb51.net/python/310407cm8.htm
4.平台算法的概述与原理.pptx算法优化原理03平台算法分类与比较03依据算法原理平台算法还可以根据其算法原理进行分类,例如基于内容的推荐算法、协同过滤推荐算法等。01依据算法功能平台算法可以根据其功能进行分类,例如推荐算法、排序算法、匹配算法等。02依据应用场景平台算法也可以根据其应用场景进行分类,例如电商平台的推荐算法、社交平台的匹配算法等。https://m.renrendoc.com/paper/302579979.html
5.王沛然从控制走向训导:通用人工智能的“直觉”与治理路径不管是梯度下降算法、反向传播算法,还是协同过滤算法,其实都是一套清晰的规则,“算法=逻辑+控制”。由此梳理算法、模型、参数等概念及其关系。算法是一组方法或步骤,用于实现某种特定的任务或解决某个问题。模型是在算法使用数据进行训练后输出的文件,通常是具有特定流程和结构的计算机程序。参数是模型中需要训练和优化...https://www.thepaper.cn/newsDetail_forward_25330840?commTag=true
6.推荐算法理论(一):协同过滤腾讯云开发者社区所以这篇文章主要是详细介绍这两种方法,从基本思想到原理,最后再进行一个编程的例子实战。 主要内容如下: 基于用户的协同协同过滤 基于物品的协同过滤算法 应用场景及存在问题分析 1. 基于用户的协同过滤 基于用户的协同过滤(UserCF)可以追溯到1993年, 可以说是非常早的一种算法了, 这种算法的思想其实比较简单,当一...https://cloud.tencent.com/developer/article/1981069