基于Spark的电影推荐系统

首先给出代码:

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 }

  }
}

算法核心思想就是:通过你已经评论过得电影,找到和你有相同喜好的其他人,通过他们的评分数据来预测你对还未看过的评分,将分数从高往低排序就是给你推荐的电影顺序。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值