美文网首页大数据技术分享
推荐系统 —— 实践 Spark ALS算法

推荐系统 —— 实践 Spark ALS算法

作者: code_solve | 来源:发表于2019-04-10 18:14 被阅读0次

    这里就不啰嗦了,直接贴代码,然后拿来运行就可以看到结果了,不过请注意该代码是基于 movelens 数据,所以想要运行你还得去下载一下这个数据,百度一下就有了噢
    ALS算法也是spark提供的唯一的协同过滤推荐算法,其基本原理类似与 LFM,基于矩阵分解的隐因子算法。嗯,纯属过一把推经瘾。。。哈哈

    package com.text
    
    import org.apache.spark.ml.recommendation
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.ml.recommendation.{ALS, ALSModel}
    import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
    import org.apache.spark.sql.Row
    
    /**
      * create by liuhuang
      * date: 2019/4/10
      */
    object MLTest {
    
      def main(args: Array[String]): Unit = {
        val conf = new SparkConf()
          .setMaster("local[4]")
          .setAppName("test")
        
        val sc = new SparkContext(conf)
        sc.setLogLevel("WARN")
        
        val sqlContext = new org.apache.spark.sql.SQLContext(sc)
        import sqlContext.implicits._
        
        // 数据加载
        val data = sc.textFile("ratings.csv")
          .map(x => {
            val Array(uid, iid, score, ts) = x.split(",")
            recommendation.ALS.Rating[String](uid, iid, score.toFloat)
          })
          .toDF("u", "i", "r")
        
        //切分数据
        val Array(training, test) = data.randomSplit(Array(0.8, 0.2), seed = 100)
    
        /**
          *  关于参数的解释
          *
          * numBlocks (defaults to 10).
          * 用于并行计算,同时设置User和Item的block数目,还可以使用numUserBlocks和numItemBlocks分别设置User和Item的block数目。
          *
          * rank i(defaults to 10). 
          * 表示latent factors的长度。对于这个值的设置参见What is recommended number of latent factors for the implicit collaborative filtering using ALS
          *
          * maxIter  (defaults to 10). 
          * 交替计算User和Item的latent factors的迭代次数。
          *
          * regParam (defaults to 1.0). 
          * L2正则的系数lambda
          *
          * implicitPrefs (defaults to false which means using explicit feedback). 
          * 表示原始User和Item的rating矩阵的值是否是评判的打分值,False表示是打分值,True表示是矩阵的值是某种偏好。
          *
          * alpha (defaults to 1.0). 
          * 当implicitPrefs为true时,表示对原始rating的一个置信度系数,用于和rate相乘,是一个常值。可以根据对于原始数据的观察,统计先设置一个值,然后再进行后续的tuning。
          *
          * nonnegative  (defaults to false). 
          * 对应于选择求解最小二乘的方法:if (nonnegative) new NNLSSolver else new CholeskySolver。如果True就是用非负正则化最小二乘(NNLS),False就是用乔里斯基分解(Cholesky)
          */
    
        val als = new ALS()
          .setMaxIter(5)
          .setRank(20)
          .setUserCol("u")
          .setItemCol("i")
          .setRatingCol("r")
          .setRegParam(0.01)
        //训练模型
        val model = als.fit(data.toDF())
        //从文件中加载模型
        //    val model = ALSModel.load("result/model")
        model.userFactors.show(10)
        model.itemFactors.show(10)
        //检测预测结果
        val predict = model.transform(test.toDF().sample(withReplacement = false, 0.1))
        predict.show()
      }
    }
    

    相关文章

      网友评论

        本文标题:推荐系统 —— 实践 Spark ALS算法

        本文链接:https://www.haomeiwen.com/subject/uxmoiqtx.html