首先给出代码:
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.ml.recommendation._
import org.apache.spark.mllib.recommendation.{Rating,ALS,MatrixFactorizationModel}
import org.apache.spark.rdd._
import org.apache.spark.mllib.recommendation.Rating
/***
* time : 2016年5月4日
* author : hongdd
* function : spark用户推荐系统
*/
object FilmAdv{
def main(args: Array[String]): Unit = {
//运行环境
val sconf = new SparkConf().setMaster("local[4]").setAppName("MLlib")
val sc = new SparkContext(sconf)
//加载用户评分数据
val data= sc.textFile("D:\\movie\\ratings.dat")
val ratings = data.map(_.split("::") match {
case Array(user,item,rate,time) => Rating(user.toInt,item.toInt,rate.toDouble)
}).cache();
//统计人数、商品数和数据总量
val users=ratings.map(_.user).distinct().count();
val products=ratings.map(_.product).distinct().count();
val rates = ratings.count();
println("count:"+rates+",from user:"+users+" with pro:"+products)
//随机抽取训练集和测试集
//randomSplit 第一个参数是分组每份的权限,和必须为1;第二个参数可省略,是随机数种子
val splits=ratings.randomSplit(Array(0.8,0.2), seed=111L)
val numPartitions=4
val training=splits(0).repartition(numPartitions)
val test=splits(1).repartition(numPartitions)
//训练模型
val rank=12 //隐藏因子数
val lambad=0.01 //ALS算法中正则化参数
val numIteration=5 //迭代次数 越大消耗内存越多
val model=ALS.train(ratings, rank, numIteration,lambad)
//用户和商品的特征向量
//model.userFeatures
//model.productFeatures
//评分初始数据中的(用户,商品)列表
val userProducts=ratings.map{case Rating(user,product,rate) => (user,product)}
//使用模型对用户商品就行预测
var predictions=model.predict(userProducts).map { case Rating(user,product,rate) => ((user,product),rate) }
//合并真实评分和预测评分数据
val ratesAndPreds=ratings.map { case Rating(user,product,rate) => ((user,product),rate) }.join(predictions)
//模型指标
val rmse = math.sqrt(ratesAndPreds.map{case ((user,product),(r1,r2)) =>
val err=(r1-r2)
err*err
}.mean())
println(s"RMSE=$rmse")
//保存评分结果
// ratesAndPreds.sortByKey().repartition(1).sortBy(_._1).map({
// case ((user,product),(rate,pred)) => (user+","+product+","+rate+","+pred)
// }).saveAsTextFile("")
//位用户推荐商品
val topK = model.recommendProducts(1, 3);
topK.foreach { println }
}
}
算法核心思想就是:通过你已经评论过得电影,找到和你有相同喜好的其他人,通过他们的评分数据来预测你对还未看过的评分,将分数从高往低排序就是给你推荐的电影顺序。