• 大数据课程K19——Spark的电影推荐案例&&推荐系统的冷启动问题


    文章作者邮箱:yugongshiye@sina.cn              地址:广东惠州

     ▲ 本章节目的

    ⚪ 掌握Spark的案例——电影推荐;

    ⚪ 掌握Spark的模型存储;

    ⚪ 掌握Spark的模型加载;

    ⚪ 掌握Spark的推荐系统的冷启动问题;

    一、案例——电影推荐

    1. 基于用户的推荐

    1. 说明

    我们现在要针对ml-100k数据集进行处理,其中的u.data文件包含了10万条数据,主要是用户对电影的评分。

    2. 代码

    import org.apache.spark._

    import org.apache.spark.mllib.recommendation.{ALS,Rating}

    object Demo11{

    def main(args:Array[String]):Unit={

    val conf=new SparkConf().setMaster("local").setAppName("ml-100k")

    val sc=new SparkContext(conf)

    val rawData=sc.textFile("d://ml-100k/u.data")

    val rawRatings=rawData.map(_.split("\t").take(3))

    val ratings=rawRatings.map{

    case Array(user,movie,rating)=>

    Rating(user.toInt,movie.toInt,rating.toDouble)

    }

    val model=ALS.train(ratings,50,10,0.01)

    val rs1=model.predict(789,123)//预测789号用户对于123号电影的评分

    val rs2=model.recommendProducts(789,10)//为789编号的用户推荐10部电影(top10)

    }

    }

    2. 检验推荐内容

    1. 说明

    要直观地检验推荐的效果,可以简单比对下用户所评级过的电影的标题和被推荐的那些电影的电影名。

    代码

    val movies=sc.textFile("d://ml-100k/u.item")

    val titles=movies.map(line=>line.split("\\|").take(2))

    .map(array=>(array(0).toInt,array(1))).collectAsMap()

    println(titles(123))//查看编号123的电影名称

    2. 说明

    对用户789,我们可以找出他所接触过的电影、给出最高评级的前10部电影及名称。具体实现时,可先用Spark的keyBy函数来从ratings RDD来创建一个键值对RDD。其主键为用户ID。然后利用lookup函数来只返回给定键值(即特定用户ID)对应的那些评级数据到驱动程序。

    代码

    val movieForUser789=ratings.keyBy(_.user).lookup(789)

    println(movieForUser789.size)//查看789用户评价了多少部电影

    3. 说明

    接下来,我们要获取这个用户评分最高的前10部电影,具体做法是利用Rating对象的rating属性来对moviesForUser集合进行排序并选出排名前10的评级(含相应电影ID)。之后以其为输入,借助titles映射为“(电影名称,具体评级)”形式。再将名称与具体评级打印出来:

    代码1

    movieForUser789.sortBy(-_.rating).take(10)

    .map(rating=>(titles(rating.product),rating.rating))

    .foreach(println)

    结果1

    (Godfather, The (1972),5.0)

    (Trainspotting (1996),5.0)

    (Dead Man Walking (1995),5.0)

    (Star Wars (1977),5.0)

    (Swingers (1996),5.0)

    (Leaving Las Vegas (1995),5.0)

    (Bound (1996),5.0)

    (Fargo (1996),5.0)

    (Last Supper, The (1995),5.0)

    (Private Parts (1997),4.0)

    代码2

  • 相关阅读:
    Redis
    Games101笔记-线性代数回顾
    1、Flink DataStreamAPI 概述(上)
    【Unity】RenderFeature笔记
    OpenGL编程(一):三角形大作
    寻找旋转排序数组中的最小值 II[经典抽象二分 + 如何破局左中右三者相等]
    40-SpringBoot
    排序算法-插入排序详解
    【Java并发编程六】多线程越界问题
    C#唯一进程的处理Winform/WPF
  • 原文地址:https://blog.csdn.net/u013955758/article/details/132567577