• Stars
    star
    247
  • Rank 164,117 (Top 4 %)
  • Language
    Scala
  • Created over 8 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

基于Apache Spark的Netflix电影的离线与实时推荐系统

基于Spark的Netflix Prize电影推荐系统(包括离线推荐与实时推荐)

数据集:我的百度云分享

离线推荐

  • 基于Spark MLlib自带的ALS最小二乘法矩阵分解算法,比较简单,文档也比较多,就不详细说了:-D。。。
  • 选择的迭代次数iterations=5,物品、用户特征个数K=50
  • 使用了RMSE方法评价推荐精度,结果为0.5757

不同iterations、K值组合下,RMSE值表现

result1

实时推荐

实时推荐算法设计

设计的实时算法的大体思想是:

当用户u对电影p进行了评分,将触发一次对u的推荐结果的更新。由于用户u对电影p评分,对于用户u来说,他与p最相似的电影们之间的推荐强度将发生变化,所以选取与电影p最相似的K个电影作为候选电影。 每个候选电影按照“推荐优先级”这一权重作为衡量这个电影被推荐给用户u的优先级。 这些电影将根据用户u最近的若干评分计算出各自对用户u的推荐优先级,然后与上次对用户u的实时推荐结果的进行基于推荐优先级的合并、替换得到更新后的推荐结果。

注意:由于Netflix Prize数据电影间相似度无法直接计算,这里利用ALS算法的物品矩阵进行cos计算得到各个电影间相似度,详情见Doc下文档

具体算法设计实现文档在目录Doc下

实时推荐延迟测试

下面的数据结果分别是瞬间产生1000、5000、10000、30000、50000个评分数据情况下实时推荐系统的响应时间表现

batchDuration选择了2s

result2 result3 result4 result5 result6

将以上这些测试结果汇总对比如图

result7

保持一定的速度逐渐产生大量评分时实时推荐系统的响应时间表现

a.速度为500个数据量每秒时

result8

横坐标没有数学意义,而是作为每个评分的标识;纵坐标表示了对应横坐标上的评分的实时推荐响应时间,单位为秒。在每秒产生500个评分数据的速率下,实时推荐系统性能良好,最慢的实时推荐也在6s内完成。

b.速度为1000个数据量每秒时

result9

横纵坐标意义同上。从图中可以看到,在每秒产生1000个评分数据的速率下,实时推荐系统性能良好,最慢的实时推荐也在6s内完成。与每秒500个评分的速率下实时表现差不多。

c.速度为1500个数据量每秒时

result10 横纵坐标意义同上。在每秒产生1500个评分数据的速率下,实时推荐系统性能良好,最慢的实时推荐也在5s内完成。与每秒500、1000个评分的速率下实时表现差不多。

d.速度为2000个数据量每秒时

result11 横纵坐标意义同上。横纵坐标意义同上。在每秒产生1500个评分数据的速率下,实时推荐系统性能良好,最慢的实时推荐也在5s内完成。与每秒500、1000、1500个评分的速率下实时表现差不多。

e.速度为2500个数据量每秒时

result12

横纵坐标意义同上。在每秒产生2500个评分数据的速率下,实时推荐系统随着时间推移性能开始下降,这是由于数据堆积产生的问题:当新数据到来时,还有旧数据没有处理完成,造成新数据堆积等待处理,使得被堆积的数据实时响应时间增大。可以看到,在1分钟内实时推荐响应时间逐渐升至20s。可以预见,2500个评分数据/s的速率保持时间越长,实时推荐响应时间越慢。

f.速度为3000个数据量每秒时

result13

项目结构

  • alsBatchRecommender.scala: ALS离线推荐,以及计算电影间相似度
  • streamingRecommender.scala: 实时推荐

More Repositories

1

Data-Structures-and-Algorithms-in-C

所有基础数据结构和算法的纯C语言实现,如各自排序、链表、栈、队列、各种树以及应用、图算法、字符串匹配算法、回溯、并查集等,献丑了
C
835
star
2

Easy-Reactor

Easy-Reactor是一个Linux C++高性能TCP服务框架,基于Reactor模式,支持单线程、多线程Reactor,也支持UDP服务
C++
501
star
3

Ring-Log

Ring-Log是一个高效简洁的C++异步日志, 其特点是效率高(每秒支持至少125万+日志写入)、易拓展,尤其适用于频繁写日志的场景
C++
411
star
4

My-Compiler-Designer

利用java语言写的编译器,自己设计了语言、文法、设计了词法分析、语法分析、语义分析和汇编代码生成
Java
122
star
5

Library-Manage-System

基于JSP struts2和hibernate3的 图书馆管理系统 包括读者和图书的基本管理和检索、排序
Java
68
star
6

Easy-Load-Balancer

Easy-Load-Balancer(ELB)是一个易用、稳定、高性能的服务间远程调用的管理、调度、负载系统
C++
57
star
7

sona

简单的、高可用、高效的基于共享内存的分布式配置中心,集中式管理各类后台配置,配置修改实时推送,且业务API相当简单(两行搞定,一个init+一个get,见readme),已轻量级支持Golang/C++/Java/Python等语言API
Go
39
star
8

KNN-Website-Classifier-System

一种基于改进的KNN网站分类系统,特点是快速、高准确率
Python
21
star
9

ekko-idgenerator

golang实现的分布式唯一ID生成器distributed id generator,有全局趋势递增、严防时钟漂移、高可用、高性能等特点
Go
11
star
10

Redis-StringCAS

Redis为String类型存储增加CAS操作, API包括getcas, getcas, and delcas
C
2
star