前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >推荐系统 —— 实践 Spark ALS算法

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

作者头像
solve
发布2019-10-30 18:35:13
1.4K0
发布2019-10-30 18:35:13
举报
文章被收录于专栏:大数据技术栈大数据技术栈

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

代码语言:javascript
复制
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()
  }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档