1. 程式人生 > >協同過濾算法

協同過濾算法

mov oca print only reg nco 2.7 cor see

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

協同過濾算法