Spark入门:协同过滤算法

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

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

下面代码读取spark的示例文件,文件中每一行包括一个用户id、商品id和评分。我们使用默认的ALS.train()方法来构建推荐模型并评估模型的均方差。

importorg.apache.spark.SparkConfimportorg.apache.spark.SparkContextimportorg.apache.spark.mllib.recommendation.ALSimportorg.apache.spark.mllib.recommendation.MatrixFactorizationModelimportorg.apache.spark.mllib.recommendation.Rating2.读取数据:首先,读取文本文件,把数据转化成rating类型,即[Int,Int,Double]的RDD;

scala>valdata=sc.textFile("../data/mllib/als/test.data")data:org.apache.spark.rdd.RDD[String]=../data/mllib/als/test.dataMapPartitionsRDD[1]attextFileat:21scala>valratings=data.map(_.split(',')match{caseArray(user,item,rate)=>Rating(user.toInt,item.toInt,rate.toDouble)})ratings:org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating]=MapPartitionsRDD[2]atmapat:26可以把数据打印出来看一下:

scala>ratings.foreach{x=>println(x)}Rating(1,1,5.0)Rating(3,2,5.0)Rating(1,2,1.0)Rating(3,3,1.0)Rating(1,3,5.0)Rating(3,4,5.0)Rating(1,4,1.0)Rating(4,1,1.0)Rating(2,1,5.0)Rating(4,2,5.0)Rating(2,2,1.0)Rating(4,3,1.0)Rating(2,3,5.0)Rating(4,4,5.0)Rating(2,4,1.0)Rating(3,1,1.0)其中Rating中的第一个int是user编号,第二个int是item编号,最后的double是user对item的评分。

划分训练集和测试集,比例分别是0.8和0.2。

scala>valsplits=ratings.randomSplit(Array(0.8,0.2))splits:Array[org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating]]=Array(MapPartitionsRDD[5]atrandomSplitat:30,MapPartitionsRDD[6]atrandomSplitat:30)scala>valtraining=splits(0)training:org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating]=MapPartitionsRDD[5]atrandomSplitat:30scala>valtest=splits(1)test:org.apache.spark.rdd.RDD[org.apache.spark.mllib.recommendation.Rating]=MapPartitionsRDD[6]atrandomSplitat:30指定参数值,然后使用ALS训练数据建立推荐模型:

scala>valrank=10rank:Int=10scala>valnumIterations=10numIterations:Int=10scala>valmodel=ALS.train(training,rank,numIterations,0.01)model:org.apache.spark.mllib.recommendation.MatrixFactorizationModel=org.apache.spark.mllib.recommendation.MatrixFactorizationModel@1f14d4a在MLlib中的实现有如下的参数:

可以调整这些参数,不断优化结果,使均方差变小。比如:iterations越多,lambda较小,均方差会较小,推荐结果较优。上面的例子中调用了ALS.train(ratings,rank,numIterations,0.01),我们还可以设置其他参数,调用方式如下:

valmodel=newALS().setRank(params.rank).setIterations(params.numIterations).setLambda(params.lambda).setImplicitPrefs(params.implicitPrefs).setUserBlocks(params.numUserBlocks).setProductBlocks(params.numProductBlocks).run(training)4.利用模型进行预测从test训练集中获得只包含用户和商品的数据集:

scala>valtestUsersProducts=test.map{caseRating(user,product,rate)=>|(user,product)|}usersProducts:org.apache.spark.rdd.RDD[(Int,Int)]=MapPartitionsRDD[3868]atmapat:34使用训练好的推荐模型对用户商品进行预测评分,得到预测评分的数据集:

scala>valpredictions=|model.predict(testUsersProducts).map{caseRating(user,product,rate)|=>((user,product),rate)|}predictions:org.apache.spark.rdd.RDD[((Int,Int),Double)]=MapPartitionsRDD[3877]atmapat:45将真实评分数据集与预测评分数据集进行合并。这里,Join操作类似于SQL的innerjoin操作,返回结果是前面和后面集合中配对成功的,过滤掉关联不上的。

scala>valratesAndPreds=test.map{caseRating(user,product,rate)=>|((user,product),rate)|}.join(predictions)ratesAndPreds:org.apache.spark.rdd.RDD[((Int,Int),(Double,Double))]=MapPartitionsRDD[3881]atjoinat:48我们把结果输出,对比一下真实结果与预测结果:

scala>ratesAndPreds.foreach(println)((3,1),(1.0,-0.22756397347958202))((4,2),(5.0,4.388061223429636))((4,1),(1.0,-0.1847678805249373))比如,第一条结果记录((3,1),(1.0,-0.22756397347958202))中,(3,1)分别表示3号用户和1号商品,而1.0是实际的估计分值,-0.22756397347958202是经过推荐的预测分值。

然后计算均方差,这里的r1就是真实结果,r2就是预测结果:

scala>valMSE=ratesAndPreds.map{case((user,product),(r1,r2))=>|valerr=(r1-r2)|err*err|}.mean()MSE:Double=1.0950191019929887打印出均方差值:

scala>println("MeanSquaredError="+MSE)MeanSquaredError=1.0950191019929887我们可以看到打分的均方差值为1.09左右。由于本例的数据量很少,预测的结果和实际相比有一定的差距。上面的例子只是对测试集进行了评分,我们还可以进一步的通过调用model.recommendProducts给特定的用户推荐商品以及model.recommendUsers来给特定商品推荐潜在用户。

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

THE END
1.推荐算法——基于物品的协同过滤算法标签: 算法 收藏 基于用户的协同过滤算法在用户增长的时候,相似度计算的计算会越来越困难。基于物品的算法给用户推荐他们之前喜欢的物品相似的物品。 算法步骤 计算物品之间的相似度 根据物品的相似度和用户的历史行为给用户生成推荐列表 相似度公式如下: wij=|N(i)∩N(j)||N(i)||N(j)|...https://www.imooc.com/article/27099
1.协同过滤推荐算法(python代码)协同过滤算法python代码协同过滤推荐算法(python代码) 协同过滤(Collaborative Filtering,简写CF)简单来说就是根据已有数据来推测未知的数据的一种算法。在推荐系统中协同过滤算法一般是指在海量用户中发掘一小部分和你品味比较类似的,在协同过滤中,这些用户成为你的邻居,从而基于这些邻居的信息为你推荐商品。基于启发式的协同过滤算法可以分为...https://blog.csdn.net/net19880504/article/details/137772131
2.python实现协同过滤推荐算法完整代码示例python这篇文章主要介绍了python实现协同过滤推荐算法完整代码示例,具有一定借鉴价值,需要的朋友可以参考下。测试数据 http://grouplens.org/datasets/movielens/ 协同过滤推荐算法主要分为: 1、基于用户。根据相邻用户,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表进行推荐 2、基于物品。如喜欢物品A的用户...https://www.jb51.net/article/130674.htm
3.java代码实现协同过滤算法商品推荐基于协同过滤算法java代码实现协同过滤算法商品推荐 基于协同过滤算法 一.基于用户的协同过滤算法简介 在推荐系统的众多方法之中,基于用户的协同过滤是诞最早的,原理也比较简单。基于协同过滤的推荐算法被广泛的运用在推荐系统中,比如影视推荐、猜你喜欢等、邮件过滤等。该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens ...https://blog.51cto.com/u_16213604/10293525
4.推荐算法之:DeepFM及使用DeepCTR测试腾讯云开发者社区协同过滤推荐算法代码实现(rsa算法例题) 编程算法推荐系统httpsjava网络安全 协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐...https://cloud.tencent.com/developer/article/1729503
5.百度算法岗武功秘籍(中)● BPR(贝叶斯个性化排序)系列,CDL(基于MF架构引入自编码器提取item特征),CML(度量学习范畴),NCF,RRN(基于RNN建模用户历史偏好),基于强化学习的推荐算法等算法的了解? ● 协同过滤了解吗? ● 基于用户和基于item的协同过滤讲一下 ● 用户冷启动和item冷启动应该用什么策略? https://www.flyai.com/article/948
6.推荐系统协同过滤算法用户相似度计算:可以采用余弦相似度、皮尔曼相关系数等;在对传统协同过滤改进的工作中,研究人员也是通过对相似度定义的改进来解决传统的协同过滤算法存在的一些缺陷。下式中, 分别表示用户i,j对应的向量。 表示用户 对物品 的评分, 表示用户 对所有物品的平均评分, ...https://www.jianshu.com/p/0023df43622a
7.王乐怡应用个性化推荐算法的网络平台在著作权侵权中的注意义务...可见,无论是基于内容的推荐还是协同过滤推荐,算法不关心也不需要知道具体的信息内容是什么,它只关心从相关信息中抽象出来的模型。对于平台运营者而言,其在后台能直接接触到的也只是相关的数据代码,而非具体的内容。 退一步来讲,即使平台在技术层面上能够接触到算法推荐的信息,从商业的角度来看,平台也不可能去一一...https://www.jfdaily.com/sgh/detail?id=753384