大数据技术分享

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

2019-04-10  本文已影响0人  code_solve

这里就不啰嗦了,直接贴代码,然后拿来运行就可以看到结果了,不过请注意该代码是基于 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()
  }
}
上一篇 下一篇

猜你喜欢

热点阅读