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