协同过滤算法
Posted soyosuyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了协同过滤算法相关的知识,希望对你有一定的参考价值。
package Spark_MLlib import org.apache.spark.ml.evaluation.RegressionEvaluator import org.apache.spark.ml.recommendation.ALS import org.apache.spark.sql.SparkSession /** * * numBlocks 是用于并行化计算的用户和商品的分块个数 (默认为10)。 * rank 是模型中隐语义因子的个数(默认为10)。 * maxIter 是迭代的次数(默认为10)。 * regParam 是ALS的正则化参数(默认为1.0)。 * implicitPrefs 决定了是用显性反馈ALS的版本还是用适用隐性反馈数据集的版本(默认是false,即用显性反馈)。 * alpha 是一个针对于隐性反馈 ALS 版本的参数,这个参数决定了偏好行为强度的基准(默认为1.0)。 * nonnegative 决定是否对最小二乘法使用非负的限制(默认为false)。 */ case class schema_data(userId:Int,movieId:Int,score:Float,timestamp:Long) object 协同过滤算法 { val spark=SparkSession.builder().master("local[2]").getOrCreate() import spark.implicits._ def main(args: Array[String]): Unit = { val data=spark.sparkContext.textFile("file:///usr/local2/spark/data/mllib/als/sample_movielens_ratings.txt") .map(_.split("::")).map(x=>schema_data(x(0).toInt,x(1).toInt,x(2).toFloat,x(3).toLong)).toDF() data.show() val Array(trainData,testData)=data.randomSplit(Array(0.9,0.1)) //ALS建立推荐模型,显性反馈--->显性反馈数值代表偏好程度 val als_Explicit=new ALS().setMaxIter(5).setRegParam(0.02).setNonnegative(true).setUserCol("userId").setItemCol("movieId").setRatingCol("score") //ALS建立推荐模型,隐性反馈--->隐性反馈数值代表置信度,隐性反馈的数值通常是动作的频次,频次越多,并不代表偏好值越大. val als_Implicit=new ALS().setMaxIter(5).setRegParam(0.02).setImplicitPrefs(true).setNonnegative(true).setUserCol("userId").setItemCol("movieId").setRatingCol("score") //训练模型(显性) val modelExplicit=als_Explicit.fit(trainData) //训练模型(隐性) val modelImplicit=als_Implicit.fit(trainData) //测试数据 val predictionExplicit=modelExplicit.transform(testData) val predictionImplicit=modelImplicit.transform(testData) predictionExplicit.show(100) predictionImplicit.show(100) //模型评估 val evaluator=new RegressionEvaluator().setMetricName("rmse").setLabelCol("score").setPredictionCol("prediction") val rmseExplicit=evaluator.evaluate(predictionExplicit) val rmseImplicit=evaluator.evaluate(predictionImplicit) println("显性反馈-->均方根误差为:"+rmseExplicit) println("隐性反馈-->均方根误差为:"+rmseImplicit) } }
结果:
+------+-------+-----+----------+ |userId|movieId|score| 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| +------+-------+-----+----------+ only showing top 20 rows +------+-------+-----+----------+----------+ |userId|movieId|score| timestamp|prediction| +------+-------+-----+----------+----------+ | 8| 31| 3.0|1424380312| 2.4570484| | 18| 31| 1.0|1424380312|0.60119224| | 20| 85| 2.0|1424380312| 1.8387821| | 8| 85| 5.0|1424380312| 2.9083385| | 3| 65| 2.0|1424380312| 1.7750756| | 7| 53| 1.0|1424380312| 1.1291304| | 12| 78| 1.0|1424380312| 0.7771935| | 2| 78| 1.0|1424380312| 1.1305643| | 15| 34| 1.0|1424380312| 1.0356392| | 14| 34| 1.0|1424380312| 2.097709| | 22| 81| 1.0|1424380312| 1.983547| | 5| 81| 2.0|1424380312| 1.3752384| | 7| 81| 1.0|1424380312|0.77412045| | 11| 81| 4.0|1424380312| 2.211118| | 14| 76| 5.0|1424380312| 3.0459225| | 25| 26| 2.0|1424380312| 1.7270002| | 5| 27| 1.0|1424380312| 3.0168698| | 1| 44| 1.0|1424380312| 1.1609333| | 16| 12| 1.0|1424380312| 1.4277761| | 11| 12| 1.0|1424380312| 1.9335879| | 26| 91| 1.0|1424380312| 2.1294951| | 12| 91| 3.0|1424380312| 1.3804724| | 17| 22| 4.0|1424380312| 2.6021044| | 20| 93| 1.0|1424380312| 1.2132858| | 19| 1| 1.0|1424380312| 1.3188484| | 28| 6| 1.0|1424380312| 1.111893| | 13| 6| 1.0|1424380312| 1.3093886| | 16| 6| 2.0|1424380312| 2.0035424| | 26| 16| 1.0|1424380312| 1.6791773| | 1| 16| 1.0|1424380312| 0.7425094| | 10| 16| 2.0|1424380312|0.29579037| | 1| 86| 2.0|1424380312| 1.1269969| | 6| 86| 1.0|1424380312| 1.0449469| | 29| 86| 1.0|1424380312| 1.6339351| | 28| 3| 1.0|1424380312| 0.562241| | 1| 3| 1.0|1424380312| 1.0160028| | 26| 20| 1.0|1424380312| 3.0878766| | 13| 20| 1.0|1424380312| 0.6198076| | 6| 20| 1.0|1424380312| 0.8041513| | 18| 40| 1.0|1424380312| 0.9127865| | 25| 94| 1.0|1424380312| 1.5682412| | 17| 57| 1.0|1424380312| 1.2655325| | 6| 54| 1.0|1424380312| 1.5092647| | 19| 54| 3.0|1424380312| 2.8020463| | 14| 54| 1.0|1424380312| 1.3696795| | 24| 96| 5.0|1424380312| 3.5427802| | 16| 48| 1.0|1424380312| 1.3953786| | 24| 48| 1.0|1424380312| 2.0032256| | 6| 5| 1.0|1424380312| 2.119866| | 8| 5| 1.0|1424380312| 1.116945| | 27| 19| 3.0|1424380312| 1.7329689| | 5| 19| 1.0|1424380312| 1.2273856| | 11| 19| 4.0|1424380312| 2.9701395| | 0| 19| 1.0|1424380312|0.92967427| | 22| 92| 3.0|1424380312| 3.065112| | 17| 92| 1.0|1424380312| 2.455468| | 24| 92| 1.0|1424380312| 0.8927136| | 9| 64| 3.0|1424380312| 3.871644| | 5| 15| 1.0|1424380312|0.84061193| | 3| 43| 1.0|1424380312| 1.6770943| | 23| 43| 1.0|1424380312| 2.1360009| | 10| 43| 1.0|1424380312| 1.3365115| | 24| 43| 3.0|1424380312| 1.8317266| | 18| 43| 1.0|1424380312| 0.6444825| | 15| 37| 1.0|1424380312|0.80135894| | 27| 61| 1.0|1424380312|0.81836975| | 12| 88| 1.0|1424380312| 0.8018843| | 4| 88| 3.0|1424380312| 1.4929094| | 16| 9| 1.0|1424380312| 0.8400431| | 8| 9| 1.0|1424380312| 1.1389248| | 25| 9| 1.0|1424380312| 1.7319403| | 29| 9| 1.0|1424380312| 1.6388568| | 2| 9| 1.0|1424380312| 2.9496799| | 13| 17| 1.0|1424380312|0.53986716| | 21| 17| 1.0|1424380312| 0.9916594| | 3| 35| 1.0|1424380312| 1.1793748| | 10| 35| 1.0|1424380312|0.16790456| | 9| 4| 1.0|1424380312| 1.6638172| | 7| 4| 1.0|1424380312| 1.4791847| | 24| 4| 1.0|1424380312|0.96306944| | 7| 59| 1.0|1424380312| 1.2983887| | 5| 8| 1.0|1424380312|0.64408076| | 4| 23| 1.0|1424380312|0.96895725| | 25| 23| 1.0|1424380312| 2.3846273| | 0| 23| 1.0|1424380312| 2.5598388| | 9| 39| 1.0|1424380312| 1.5484433| | 14| 49| 1.0|1424380312|0.74014354| | 10| 7| 1.0|1424380312| 2.7203274| | 12| 84| 1.0|1424380312| 1.0389518| | 3| 87| 2.0|1424380312| 1.733399| | 6| 69| 1.0|1424380312| 0.603121| | 9| 69| 1.0|1424380312| 1.6795955| | 23| 69| 1.0|1424380312| 2.125524| | 8| 97| 1.0|1424380312| 1.1257324| | 29| 97| 1.0|1424380312| 1.1273563| | 17| 63| 1.0|1424380312| 1.1061692| | 18| 63| 1.0|1424380312| 1.0475957| | 7| 77| 1.0|1424380312| 1.3795763| | 10| 77| 1.0|1424380312| 1.8526626| | 28| 50| 1.0|1424380312| 1.4274787| +------+-------+-----+----------+----------+ only showing top 100 rows +------+-------+-----+----------+-----------+ |userId|movieId|score| timestamp| prediction| +------+-------+-----+----------+-----------+ | 8| 31| 3.0|1424380312| 1.1638187| | 18| 31| 1.0|1424380312| 0.12646629| | 20| 85| 2.0|1424380312| 0.6745924| | 8| 85| 5.0|1424380312| 0.7617616| | 3| 65| 2.0|1424380312| 0.14364278| | 7| 53| 1.0|1424380312| 0.8924422| | 12| 78| 1.0|1424380312| 0.29862988| | 2| 78| 1.0|1424380312| 0.6950371| | 15| 34| 1.0|1424380312| 0.13631839| | 14| 34| 1.0|1424380312| 0.56720567| | 22| 81| 1.0|1424380312| 0.40694| | 5| 81| 2.0|1424380312| 0.8160672| | 7| 81| 1.0|1424380312| 0.20443052| | 11| 81| 4.0|1424380312| 0.33110243| | 14| 76| 5.0|1424380312| 0.3799219| | 25| 26| 2.0|1424380312| 0.35697508| | 5| 27| 1.0|1424380312| 0.37440786| | 1| 44| 1.0|1424380312|0.040944923| | 16| 12| 1.0|1424380312| 0.40569857| | 11| 12| 1.0|1424380312| 0.75514376| | 26| 91| 1.0|1424380312| 0.66252863| | 12| 91| 3.0|1424380312| 0.19431645| | 17| 22| 4.0|1424380312| 0.3836255| | 20| 93| 1.0|1424380312| 0.34414247| | 19| 1| 1.0|1424380312| 0.3412655| | 28| 6| 1.0|1424380312| 0.31466073| | 13| 6| 1.0|1424380312| 0.39903712| | 16| 6| 2.0|1424380312| 0.71858686| | 26| 16| 1.0|1424380312| 0.4245502| | 1| 16| 1.0|1424380312| 0.0| | 10| 16| 2.0|1424380312| 0.73909914| | 1| 86| 2.0|1424380312| 0.13196747| | 6| 86| 1.0|1424380312| 0.3061665| | 29| 86| 1.0|1424380312| 0.87776923| | 28| 3| 1.0|1424380312| 0.4625695| | 1| 3| 1.0|1424380312| 0.07132247| | 26| 20| 1.0|1424380312| 0.7656446| | 13| 20| 1.0|1424380312| 0.5308014| | 6| 20| 1.0|1424380312| 0.33695522| | 18| 40| 1.0|1424380312| 0.45171544| | 25| 94| 1.0|1424380312| 0.74206364| | 17| 57| 1.0|1424380312| 0.3950837| | 6| 54| 1.0|1424380312| 0.16447417| | 19| 54| 3.0|1424380312| 0.6679663| | 14| 54| 1.0|1424380312| 0.84000915| | 24| 96| 5.0|1424380312| 0.15456103| | 16| 48| 1.0|1424380312| 0.51199657| | 24| 48| 1.0|1424380312| 0.32028285| | 6| 5| 1.0|1424380312|0.028364778| | 8| 5| 1.0|1424380312| 0.54273874| | 27| 19| 3.0|1424380312| 0.50554377| | 5| 19| 1.0|1424380312| 0.635036| | 11| 19| 4.0|1424380312| 0.2738139| | 0| 19| 1.0|1424380312| 0.37420133| | 22| 92| 3.0|1424380312| 0.4822457| | 17| 92| 1.0|1424380312| 0.31314456| | 24| 92| 1.0|1424380312| 0.4466191| | 9| 64| 3.0|1424380312| 0.5337775| | 5| 15| 1.0|1424380312| 0.31713688| | 3| 43| 1.0|1424380312| 0.10127184| | 23| 43| 1.0|1424380312| 0.83384585| | 10| 43| 1.0|1424380312| 0.38206303| | 24| 43| 3.0|1424380312| 0.640584| | 18| 43| 1.0|1424380312| 0.06851719| | 15| 37| 1.0|1424380312| 0.22462659| | 27| 61| 1.0|1424380312| 0.45275673| | 12| 88| 1.0|1424380312| 0.5995199| | 4| 88| 3.0|1424380312| 0.7880553| | 16| 9| 1.0|1424380312| 0.36774087| | 8| 9| 1.0|1424380312| 0.37451363| | 25| 9| 1.0|1424380312| 0.75478166| | 29| 9| 1.0|1424380312| 0.50819284| | 2| 9| 1.0|1424380312| 0.7215726| | 13| 17| 1.0|1424380312| 0.6289339| | 21| 17| 1.0|1424380312| 0.26022512| | 3| 35| 1.0|1424380312| 0.34481457| | 10| 35| 1.0|1424380312| 0.5252005| | 9| 4| 1.0|1424380312| 0.3180048| | 7| 4| 1.0|1424380312| 0.7470219| | 24| 4| 1.0|1424380312| 0.31083214| | 7| 59| 1.0|1424380312| 0.21556722| | 5| 8| 1.0|1424380312| 0.31538156| | 4| 23| 1.0|1424380312| 0.30400288| | 25| 23| 1.0|1424380312| 0.26133725| | 0| 23| 1.0|1424380312| 0.46130672| | 9| 39| 1.0|1424380312| 0.6066674| | 14| 49| 1.0|1424380312| 0.7116656| | 10| 7| 1.0|1424380312| 0.44484153| | 12| 84| 1.0|1424380312| 0.6609127| | 3| 87| 2.0|1424380312| 0.0| | 6| 69| 1.0|1424380312|0.046083845| | 9| 69| 1.0|1424380312| 0.6174374| | 23| 69| 1.0|1424380312| 0.06908774| | 8| 97| 1.0|1424380312| 0.16748522| | 29| 97| 1.0|1424380312| 0.6499037| | 17| 63| 1.0|1424380312| 0.61871755| | 18| 63| 1.0|1424380312| 0.0| | 7| 77| 1.0|1424380312| 0.43695626| | 10| 77| 1.0|1424380312| 0.35513023| | 28| 50| 1.0|1424380312| 0.3410134| +------+-------+-----+----------+-----------+ only showing top 100 rows 显性反馈-->均方根误差为:0.8912904280114428 隐性反馈-->均方根误差为:1.6099045328620325
以上是关于协同过滤算法的主要内容,如果未能解决你的问题,请参考以下文章
Python+Django+Mysql志愿者活动推荐系统 基于用户项目内容的协同过滤推荐算法 SimpleWebActivityCFRSPython python实现协同过滤推荐算法实现源代码下载