当前位置: 首页 > news >正文

大数据课程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

http://www.lryc.cn/news/155532.html

相关文章:

  • Docker-安装(Linux,Windows)
  • 若依富文本 html样式 被过滤问题
  • VS Code 快速消除前置空格和常用快捷键
  • 【跟小嘉学 Rust 编程】二十五、Rust命令行参数解析库(clap)
  • gRPC远程进程调用
  • 什么是继承
  • QT连接数据库
  • navicat访问orcal数据库
  • Linux中查找某路径下,包含某个字符串的所有文件
  • 常见信号滤波方法(卡尔曼滤波、滑动平均、异常值剔除)的原理解析与C语言实现
  • WebGL模型矩阵
  • Flutter:WebSocket封装-实现心跳、重连机制
  • c语言中:struct timespec
  • Mendix如何实现导出文件
  • 在IIS服务器上安装SSL证书(2023配置启用HTTPS部署教程)内容来源SSL市场网
  • 如何处理ChatGPT与用户之间的互动和反馈?
  • 微服务-gateway鉴权
  • NET7快速开发一个商品管理模块-商品列表开发(一)
  • 0829|C++day7 auto、lambda、C++数据类型转换、C++标准模板库(STL)、list、文件操作
  • SpringBoot连接MySQL数据库实例【tk.mybatis连接mysql数据库】
  • node基础之三:http 模块
  • 【高阶数据结构】AVL树 {概念及实现;节点的定义;插入并调整平衡因子;旋转操作:左单旋,右单旋,左右双旋,右左双旋;AVL树的验证及性能分析}
  • Netty—FuturePromise
  • 固定资产卡片乱怎么管理
  • AutoHotkey(AHK)脚本,自动截图当前屏幕并发送给微信窗口
  • Golang - go build打包文件
  • Java的归并排序
  • B. The Walkway Codeforces Round 893 (Div. 2)
  • 第四篇 DirectShow 采集调用结构关系
  • 2605. 从两个数字数组里生成最小数字