协同过滤算法

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

 

以上是关于协同过滤算法的主要内容,如果未能解决你的问题,请参考以下文章

推荐算法的基于协同过滤的推荐

spark协同过滤算法-附scala代码

推荐算法-协同过滤代码问题汇总

推荐算法-协同过滤代码问题汇总

Python+Django+Mysql志愿者活动推荐系统 基于用户项目内容的协同过滤推荐算法 SimpleWebActivityCFRSPython python实现协同过滤推荐算法实现源代码下载

推荐算法之模型协同过滤(1)-关联规则