简单介绍
spark的协同过滤的矩阵分解采用ALS来计算,具体实现了算法以下参数
- numBlocks:数据划分为多少block进行并行计算,设置成-1时为自动配置
- rank:模型的潜在因子(主特征数目)
- iterations:模型运行迭代次数
- lambda:ALS的规则化参数
- implicitPrefs:是采用显式评分方式还是隐式反馈数据,即是用户打分,还是用户访问等隐式分数
- alpha:采用隐式打分方式的置信度权重值
样例
import org.apache.spark.mllib.recommendation.Rating
定义了评分的数据类型,里面有三个属性,分别是:
product int
user int
rating double
进行电影协同过滤的代码样例
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.ml.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating
val rawdata = sc.textFile("D:\\ml-100k\\u.data")
val raw_table = rawdata.map(_.split("\t")).map(x=>Rating(x(0).toInt,x(1).toInt,x(2).toDouble)).toDF
val model = new ALS()
.setRank(10) //主要因子个数
.setRegParam(0.01) //规则化参数lambda
.setMaxIter(10) // 最大迭代次数
.setItemCol("product")
.setUserCol("user")
.setRatingCol("rating")
val alsmodel = model.fit(raw_table)
val predict = alsmodel.transform(raw_table)
//给用户234进行前五的产品推荐
val recomm = predict.where("user=234").orderBy($"prediction".desc).show(5)
进行模型评估
- 均方差:显示评分评估
- K值平均准确率:隐式评分评估,给用户做推荐的前K个商品的与实际用户购买的前K个的准确度
import org.apache.spark.ml.evaluation.RegressionEvaluator
// 回归输出结果评估
val predictval = new RegressionEvaluator()
.setLabelCol("rating")
.setPredictionCol("prediction")
.setMetricName("mse")//mse评估,还有rmse、r2、mae
predictval.evaluate(predict)