基于Spark的电影推荐系统的设计与实现(源码+万字报告+讲解)

目 录
摘 要 II
ABSTRACT III
第一章 前言 1
1.1选题背景和意义 1
1.2 国内外研究现状及发展趋势 2
1.3 主要研究内容 3
第二章 基础理论与算法实现 4
2.1 Spark简介 4
2.2 机器学习 4
2.3 可视化控件 4
2.4 基于协同过滤的推荐算法 6
2.5 其他推荐算法 8
第三章 系统需求分析与设计 10
3.1 需求分析 10
3.2 可行性分析 11
3.3 系统功能结构 12
3.4 数据库设计 13
3.5 系统模块设计 20
第四章 系统实现与可视化效果 25
4.1 系统实现环境 25
4.2 系统推荐模块实现 25
4.3 系统可视化模块实现 26
第五章 系统测试 29
5.1 测试方法 29
5.2 系统推荐功能测试 29
5.3 可用性测试 30
5.4 性能测试 30
6.5 测试结果 30
结 论 32
参考文献 33
致 谢 34
附录A: 35

第一章 前言
1.1研究背景
随着互联网的发展、大数据时代来,中国网民的规模也在逐年增加,各互联网平台的数据产生量也急剧扩增。调查显示,到2020年6月,我国的网民数已达9.40亿,网络视频用户数己经达到8.88亿,占总体网民的94.5%。网络视频中电影又是很重要的组成部分,国内多款著名影视软件DAU日活用户数均已达到亿级规模[1]。为了在规模巨大的电影数量中找到用户想看的电影,搜索技术通过指定关键词去查询匹配到的结果只达到了初步的效果。如何让电影网站根据用户的个人行为数据从被动获取用户请求转变为主动感知用户需求,让用户在不需要输入搜索关键词的情况下主动将其感兴趣的电影推荐给用户,推荐系统就是能很好解决这一需求的技术。
目前推荐系统已经成为各大电影网站的标配,在其数据规模不断增大的情况下,单机版的推荐系统显然已不能满足业务需求。而分布式的推荐系统能将所有机器的存储和计算资源进行连接并统一规划调度,己成为各大公司的首选。即使在分布式环境下的电影推荐系统,仍然存在推荐模式单一、推荐实时性不够高等问题,具体有以下几点:
1)推荐模式单一。大多电影推荐侧重于计算电影之间的相似性,仅以此作为推荐的依据,而没有组合基于相似性推荐之外的其他推荐方式,以至于推荐的电影过于单一。缺乏新颖性。
2)忽略电影自身属性,仅利用电影的得分值,而没有将电影名称、电影简介和电影类别等特征融合考虑,使得推荐效果一般。
3)缺乏实时性。多基于用户之前某一固定时间段的行为去做离线计算,推荐过程耗时较长缺乏实时性[5]。
鉴于此,本文选取了spark分布式框架作为电影推荐系统的计算引擎。spark是一个基于内存计算的通用框架,支持对结构化数据的处理、机器学习、流式处理和图处理等功能。它拥有良好的大数据生态圈,能够与各种主流的大数据工具进行整合,比如Hive、HBase、Kafka等。相较于Hadoop,spark解决了其计算模型单一、重复计算和大量I/O操作导致执行效率低等问题,让计算效率得到极大的提升。
1.2研究意义
随着互联网时代数据量急剧上升,传统的建议系统已不能在单一服务器框架下处理大规模数据和进行快速统计。所以,如何妥善应对网络级别的数据集是推荐系统亟需重新思考的课题。在此背景下,为了增强系统的工作效能和高效减轻信息的负担,分布式计数技术在处理众多数据至多台机器之间的存储需求中逐渐兴起。同时,对所使用的模型进行并行优化后,推荐系统的计算效率也实现了持续的加快。在目前这个阶段,Hadoop和Spark被视为大众更为普遍且相对成熟的大数据处理技术应用。Hadoop比Spark更早地问世了,Hadoop的数据处理技术采用了MapReduce,但由于某些实用性限制,Spark也随其而诞生。由于Spark在处理大数据的过程中不仅成功规避了Hadoop的某些局限性,而且还因其操作简便、速度快、高度灵活等特质,使得这款平台迅速赢得了众多用户的喜爱,并迅速成为了一个热门应用。Spark因具备实时操作和适用于多次迭代计算等应用场景的特性,因此得到了广大领域的青睐。比如,在淘宝网上的商品推送服务以及腾讯的广点通推广中,Spark都被广泛采用。Spark提供的大数据处理技术不仅稳固、高效,而且易于操作,为了增强推荐系统在大数据场景中的运行效率,将其与推荐系统相融合具备深远的理论和实践意义。
目前的电影推介系统主要依赖于读者昨天的行为记录进行离线分析,从而提供当天的推荐答案。或者根据用户目前正在观赏的电影来推荐相应类别的电影。所有的推荐策略主要依赖于电影间相似性的计算,它们的推荐框架过于简单,并不具备多种推荐结果或者实时建议的特点。因此,本研究构筑了一套基于spark数据库的电影推荐系统。利用spark机器学习库中的特征处理功能,对不同类型的特征进行捕获和转换,借助spark学习库内的高效算法设计,形成了多种推荐模型。
1.3 国内外研究现状分析
推荐系统[1]最早可以追溯到上世纪九十年代,从它产生到现在已经有20余年了。在这期间,榫荐系统研究一直没有间断过,甚至日益受到人们重视。
在2010年以前,传统推荐算法占据主导地位,如协同过滤(CollaborativeFiltering,CF)[2]、矩阵分解、逻辑回归(LogisticRegression,LR)等。之后,因子分解机与梯度提升决策树,这些近深度学习模型出现[3]。直到2015年才开始闪亮登场的深度学习推荐模型,五花八门的模型架构层出不穷[4]。其中CF算法原理为基于用户历史行为产生用户-项目共现矩阵,再分别使用用户间相似性和项目间相似性进行推荐。因原理简单且直接而得到广泛使用,但是对稀疏数据处理效果不佳,建议结果头部效应显着[5];矩阵分解对用户与物品共现矩阵进行分解,得到用户隐向矩阵与物品隐向矩阵并用其内积进行推荐。与协同过滤相比较[6],它在稀疏矩阵处理方面得到了一定程度的提高,但是很难对其他属性进行整合考虑。LR算法把推荐问题变成一个分类问题,它的模型把用户,物品和上下文的各种特征变成一个向量[7],然后输入到模型中进行CTR值的计算,最终对CTR值进行排序和推荐。这种模型能够融合多个特征,而这在矩阵分解模型中并不存在。但是因为是线性模型所以特征组合的能力差[8];FM算法有能力抽取组合特征,通过对每个特征进行隐向量训练,然后以不同特征隐向量内积为交叉特征权重[9]。所以FM模型表达能力强于LR,但是不便于推广至三阶交叉特征提取。
深度学习时代,有很多好的推荐算法,如NCF算法(NeuralCollaborativeFiltering)等,它是对协同过滤进行改进,把矩阵分解时用户向量与物品向量之间的点积操作替换为神经网络,增强矩阵分解的表达能力[10];也有将FM因子分解机的二阶隐向量交叉操作换为用神经网络代替的NFM(NeuralFactorizationMachine)模型,它比FM模型有更强的表达能力和特征交叉能力;DeepFMf模型用FM代替线性Wide局部,加强Wide局部特征组合的学习;还有引入时间信号的序列建模,让模型考虑了与时间相关的用户行为序列中的有效信息,增强了系统对用户兴趣迁移的学习能力。在强化学习方面,DRN[11]模型可以对推荐模型进行线上实时学习,大大增强模型对实时性数据的利用。上述方法多依赖深度学习进行建模,使得工程上难以实现,可解释性也不高[12]。
从应用的角度来看,该推荐系统涵盖了电商,电影和音乐多个领域。在电影推荐方面,目前国外已有Criticker,Jinni,IMDB,MovieLens,Nanocrowd,RottenTomatoes等热门的电影推荐网站[13],这些网站都依据自己独特的电影特征和业务侧重点开发了各具特色的电影推荐系统。目前国内多数影视网站[14]还拥有各自推荐系统如腾讯视频主页“猜猜看就能追到”栏目、爱奇艺主页“猜猜看,你们喜欢吗”栏目、优酷主页“今日推荐”栏目。通用计算引擎Spark为处理推荐系统海量计算数据而被互联网公司所使用,包括腾讯和优酷土豆这样的在线视频软件公司。Spark在流式处理,数据分析,机器学习以及图计算能力等方面都可以给电影推荐系统带来很大方便[15]。
1.4 主要研究内容
本次设计以推荐系统建设领域知名的经过修改过的 MovieLens 数据集作为依托,以某科技公司电影网站真实业务数据架构为基础,构建了符合教学体系的一体化的电影推荐系统,包含了离线推荐与实时推荐体系,综合利用了协同过滤算法以及基于内容的推荐方法来提供混合推荐。提供了从前端应用、后台服务、算法设计实现、平台部署等多方位的闭环的业务实现。
1.5 论文组织结构

摘要
ABSTRACT
第1章 绪论
1.1 研究背景
1.2 研究意义
1.3 国内外研究现状分析
1.4 主要研究内容
1.5 论文组织结构
第2章 基础理论与相关技术
2.1 数据采集和整理技术
2.2 机器学习/深度学习模型
2.3 可视化控件
2.4 本章小结
第3章 基于数据的算法优化/基于数据的算法实现
3.1 爬虫算法
3.2 数据准备
3.3 模型实现
3.4 实验结果和分析
3.5 本章小结
第4章 系统需求分析与设计
4.1 系统概述
4.2 系统功能需求
4.3 系统非功能需求
4.4 系统设计架构
4.5 系统模块设计
4.6 本章小结
第5章 系统实现与可视化效果
5.1 系统实现环境
5.2 信息采集模块实现
5.3 系统可视化模块的实现
5.4 系统
算法模块的实现
5.5 系统管理员模块的实现
5.6 本章小结
总结和展望
考文献
致谢

第二章 基础理论与相关技术
2.1 数据采集和整理技术
(1)Flume
Flume是由Cloudera公司提供的一个高度可使用、高度可靠并且分布式的大量日志的收集、汇总和传送系统,Flume能够在这些日志数据中为不同的数据发送方提供定制服务,以便他们方便地搜集数据;此外,Flume为用户提供简化数据处理的功能,并可以将结果记录给各类数据接收者,这些数据是可以个性化设定的。目前,在Flume平台上,存在两个版本,其中一个版本被称为Flume-og,而另一个版本则被简称为Flume-ng。因为Flume-ng经过了一次重大的重塑,它与Flume-og的区别很大,所以在应用时需要小心区别。最早由Cloudera所推出的Flume日志收集系统是在Apache项目下进行的一个孵化环节,Flume系统支持在日志管理中为各种数据提供者进行定制,以便于数据的收集工作。Flume具有为数据提供简化操作,并向各种不同的数据接收者编写(可定制)的技能。Flume平台具备了多种数据收集能力,包括控制台Console、Thrift-RPC、文件文件格式的text、UNIX tail、以及日志系统syslog。除此之外,该平台支持两种模式——TCP和UDP——以及命令执行(exec)——即可在这些数据源上收集数据。
(2)Kafka
Kafka是一个分布式的、具有高吞吐量的发布订阅消息引擎系统,其具备处理用户在网站内的所有动作流量数据的能力。这类行为(包括网页浏览权,搜索引擎搜索以及其他用户活动)在当代网络中成为很多社会功能的核心元素。通常,由于数据处理的流量需求,这部分数据是通过日志的处理和聚合来达到处理的。对于与Hadoop类似的日志数据及离线的分析系统,其需要实时数据处理的约束,此方法显得十分实用。Kafka致力于利用Hadoop的双重加载功能来协调在线性和离线状态下的信息处理工作,并同时通过集群技术来实时发布相关消息。实际上,简单地说,这就是系统A把信号发送给kafka(消息引擎系统),然后系统B就从kafka那里读取A发给的信息。kafka在商业活动中担任中间商人的角色。

图2.1 架构图
(3)Spark简介
此项目所依赖的关键技术名为Spark,它构成了一个大数据分析和计算的动力结构,并能够高效地完成企业数据批次处理任务。Spark框架显示了以下几个显著之处:
1) Spark选用Scala作为其函数式编程语言,该语言能够兼容Java,不仅语法表达简明扼要,而且其数据结构形式多样,这使得Spark具备了强劲的编程实力。
2) Spark选择了一个内部存储器来保存中间数据的方法,这与MapReduce的磁盘存储方式截然不同,这也让Spark在迭代计算时更为高效。这一手段大幅提高了处理数据的效率,同时大幅缩短了磁盘I/O的时间消耗。
3) Spark具备处理大规模复杂格式数据变换的能力,同时它的操作也相当直观简单。该数据核心RDD(弹性分布式数据集)选用Java对象作为其数据基础格式,从而减少了对反序列化和对象序列化程序的依赖。完成任务所达到的效率。此外,Spark生态系统集成了众多实用组件,使得开发人员能够更便捷地执行业务逻辑、打印实时数据处理,同时也大大降低了创建机器学习组件时所遇到的困难。鉴于其多方面的优越性,该项目选择了Spark技术进行性能优化,不仅支持并行处理大量数据,还能够灵活地利用各种不同的组件以满足多样化的需求。
(4)可视化控件
可视化控件是现代web开发不可或缺的一部分,为开发人员提供了构建丰富交互式用户界面的能力。在该项目中,视觉控件不仅用于显示数据,还可以作为用户与系统沟通的桥梁,提高整个系统的可用性和用户体验。视觉控件的核心在于其直观性和交互性。通过图表、图像、按钮和文本框等控件,开发人员可以以简洁明了的方式向用户呈现复杂的数据和逻辑。用户可以直观地查看和理解数据,并通过控件与系统交互,执行各种操作。可以使用多个视觉控件来构建电影推荐系统的用户界面。这些控件包括:用于显示统计数据的图表控件,可以图形化地显示电影类型、时长、收视率等关键信息的分布;用于显示详细信息的数据表控件,允许用户通过这些表查看有关电影的特定信息;以及用于用户交互的按钮和搜索框等控件,使用户可以轻松地搜索电影、过滤推荐结果或执行其他操作。这些视觉控件的选择和应用使电影推荐系统的界面更加直观和用户友好。用户可以通过简单的操作获得必要的信息,并进行个性化的推荐设置,从而提高用户的效率和满意度。
2.2 机器学习/深度学习模型
机器学习是一个跨学科的领域,涉及统计学等多个学科。通常,计算机数据的一部分用于训练,并且在训练之后,可以获得可预测的模型,该模型可以用于预测剩余的数据。其核心是使用算法分析数据,并在学习后预测新的数据,这类似于人类的学习过程,根据自己的经验预测新的问题。
作为用户和信息之间的桥梁,推荐系统可以将它们匹配起来,实现用户和信息提供者之间的双赢。目前,它在的工作和生活中随处可见,比如在京东和拼多多等平台上向用户推荐产品,在YouTube等平台上为用户推荐视频和个性化广告推荐。
2.2.1 基于协同过滤的推荐算法
推荐算法中使用最广泛的算法是协同过滤(CF)。当Glodberg等人首次提出协同过滤的概念时,主要是为了帮助用户过滤垃圾邮件。后来,随着GroupLens将该算法应用于推荐电影和新闻,协同过滤算法开始在行业中广泛传播。协同过滤的算法原理是基于用户对目标对象的行为数据来预测用户当前或未来的行为。随着算法的发展,目前主要分为三类:基于用户的协同过滤(UserCF)、基于项目的协同过滤和基于模型的协同过滤。下面,将逐一介绍这三类算法。
(1)基于用户的协同过滤
作为最早提出的推荐算法,其主要思想是利用用户对项目的历史行为数据来表示用户的兴趣特征,然后基于该兴趣特征计算用户之间的兴趣相似度。然后,基于相似性大小,选择与目标用户最相似的用户,最后,使用相似用户喜欢的项目作为该用户的推荐结果。在计算用户之间相似度的过程中,余弦相似度是行业中常用的相似度计算公式之一,公式表示如下:

                                                               (2.1)

在公式中,u和v表示两个不同的用户,N(u)和N(v)表示用户u和v参与行为的项目集。计算用户相似度后,根据相似度大小选择一组相似用户和一组相似的用户喜欢的项目。然后,结合用户相似性和相似用户对项目的偏好程度,计算目标用户对这些项目的兴趣。公式如下:

                                                               (2.2)

在公式中,S(u,k)表示数量为k的一组相似用户,N(i)表示对物品i有历史行为的一组用户,wuv表示目标用户u和v之间的相似性。根据购买、评估、点击等不同行为,使用yvi来量化偏好程度。当使用单个用户行为作为兴趣反馈数据时,yvi的值为1。最后,根据公式2.2计算的值,对前n个项目进行排序,并将其选为推荐结果。
(2)基于物品的最近邻算法
基于项目的最近邻算法的主要思想是使用项目之间的相似性而不是用户之间的相似度来计算预测值。该算法认为,项目A和项目B具有高度相似性的原因是,大多数喜欢项目A的用户也喜欢项目B。
基于物品的最近邻推荐主要包括两个步骤:
1) 计算项目之间的相似性;
2) 根据项目的相似性及其历史行为为用户生成推荐列表。公式2.3可用于计算两个项目之间的相似性:

                                                                   (2.3)
其中,|N(i)|表示喜欢项目i的用户数量,|N(j)|表示喜欢项目j的用户数量。分子|N(i)N(j)|表示同时喜欢项目i和项目j的使用者数量。在获得项目之间的相似性之后,基于项目最近邻推荐,使用公式2.4计算用户u对项目j的兴趣:

                                                               (2.4)

其中,N(u)表示用户喜欢的项目集合,S(i,K)是与项目i最相似的K个项目集合,Sij表示项目i和j之间的相似性,ruj表示用户u对项目i的兴趣。
(3)基于模型的协同过滤
上面介绍的两种协同过滤是业内最经典的推荐算法,但都存在泛化能力弱、易受热门项目影响等局限性。随着机器学习的发展,训练算法模型来拟合协同过滤的用户项目评级矩阵,不仅提高了推荐算法的泛化能力,而且增强了模型处理数据稀疏性问题的能力。矩阵分解是这一类中的经典算法之一,下面将介绍该算法的原理。
矩阵分解的主要思想是将用户对一个项目的评分矩阵R分解为两个特征矩阵,即用户特征矩阵P和项目特征矩阵Q。公式如下:
R≈PQT
(2.5)
公式中的矩阵R是m×n维的,分解矩阵P和Q的维数分别为m×k和n×k。m表示用户数量,n表示项目数量,k表示特征矩阵的隐藏向量维度。k的值越大,隐藏向量的表达能力越强,但削弱了模型的泛化能力。尺寸k的值需要根据实验结果和实际情况进行设置。根据公式2.5的思想,项目的预测用户评级可以表示为:

                                                               (2.6)

在公式中,pu表示用户u在矩阵P中的潜在特征向量,qi表示矩阵Q中项目i的潜在特征矢量。在获得预测得分后,需要使用机器学习方法确定训练的目标函数,该目标函数以最小化平方误差的形式确定。在确定目标函数后,通常使用交替最小二乘法和随机梯度下降法来优化目标函数。最后,可以通过模型训练获得每个用户和项目的特征向量,并使用公式2.6获得所有用户对所有电影的预测评分值。
2.2.2 其他推荐算法
(1)基于内容的推荐算法
基于内容的推荐算法是最早应用于工程实践的推荐算法,在推荐系统中占有重要地位。很大一部分新闻和信息推荐是基于内容的推荐算法。所谓基于内容的推荐算法是基于项目相关信息、用户相关信息和用户操作行为生成推荐算法模型,从而为用户提供推荐服务。项目相关信息可以包括文本描述、标签、用户评论、手动注释信息等。用户相关信息是指用户的年龄、性别、偏好、地理位置和收入等人口统计信息。用户对项目的行为可以包括评论、书签、点赞、查看和观看时长、点击、添加购物车、进行购买等。基于内容的推荐算法通常只依赖于用户自己的行为和项目的相关信息来向用户提供推荐,而不涉及其他用户的行为和其他项目的相关消息。基于内容的推荐算法的项目特征通常可以使用显式标签来表示。例如,如果标签按一定的顺序排列,并且每个标签表示一个维度,那么每个项目可以由这些标签组成的N维向量表示。标签可以通过算法获得,例如使用自然语言处理技术从项目标题和描述等文本信息中提取关键词作为标签;它也可以由用户主动添加,例如,当电子商务产品推出时,要求卖家填写详细的标签、类别和产品描述。
(2)基于知识的推荐算法
基于知识的建议由于能够为金融服务、技术设备或商品等复杂产品生成建议而变得越来越重要。基于知识的推荐利用用户和产品相关知识来推断满足用户需求的产品并生成推荐。这种推荐方法可以分为两种基本类型:基于实例的推荐和基于约束的推荐。基于实例的推荐通过基于现有推荐实例计算相似度来从目录中检索项目;基于约束的推荐需要预先定义一些约束条件,然后根据这些约束条件搜索合适的推荐项目。基于知识的推荐不依赖于用户评分等历史行为数据,因此冷启动没有问题。此外,由于基于知识的推荐算法不需要任何训练,因此它们可以对用户对推荐的需求和偏好的变化做出迅速响应。同时,由于基于知识的推荐不依赖于用户历史数据,这种类型的推荐算法特别适合于难以获得用户数据进行推荐的平台。基于知识的推荐算法的缺点是知识获取相对困难,通常需要相关知识领域的专家将知识组织成标准化和可用的表达形式。
(3)混合推荐算法
对于每种推荐算法,都有一定的优缺点。如果多个推荐算法以混合的方式组合,以避免单个算法的问题,这也是提高推荐质量的一种方法。此外,当面临用户推荐质量的提高时,单一的推荐算法很难满足用户体验。因此,出现了好坏参半的建议。基于机器学习中的集成学习思想,混合推荐主要将不同的算法与不同的混合策略相结合,以提高推荐质量。

第3章 混合推荐算法的设计与实现
3.1 爬虫算法
本文实现爬虫算法用于爬取电影数据是系统设计的第一步。以下是一个简化的爬虫算法概述,用于从某个电影网站(如IMDb、豆瓣等)抓取电影数据。
(1)确定目标网站:
选择一个包含丰富电影信息的网站,如IMDb或豆瓣电影,分析该网站的URL结构、反爬策略(如是否需要登录、是否有频率限制等)。
(2)发送HTTP请求:
使用Python的requests库或其他HTTP客户端库发送GET请求到目标URL设置请求头(如User-Agent)以模拟浏览器行为。
(3)解析HTML/JSON内容:
如果目标网站返回的是HTML内容,使用BeautifulSoup、lxml等库解析HTML文档如果目标网站返回的是JSON内容,直接解析JSON数据。
(4)提取电影信息:
根据HTML/JSON的结构,定位并提取所需的电影信息,如电影标题、导演、演员、评分、简介等。使用CSS选择器、XPath表达式或JSON路径来定位信息。
(5)存储数据:
将提取的电影信息存储到本地文件(如CSV、JSON、数据库等)。考虑数据格式和存储方式,以便后续使用Spark进行数据处理和分析。
3.2 数据准备
实验所用数据是通过编写爬虫从豆瓣电影(https://movie.douban.com/)获取。数据资料涵盖了电影的相关内容以及用户对电影的打分。影片涵盖了诸如导演、表演者和影片种类之类的元素:用户的评分资料包含了他们的用户id、电影id以及得分。
3.3 混合推荐算法模型实现
3.2.1 基于ALS的矩阵分解模型算法
在协同过滤推荐算法的应用中,最核心的任务是生成用户对物品的评分。在这里,假定有m个用户需要对n个物品进行评分,这样就可以构建一个名为A(mn)的评分矩阵A(mn)。ALS的核心思想是:如果存在一个近似低秩的mxn评分矩阵A,那么可以使用两个小矩阵U(mxk)和V(nxk)的乘积来近似表示A,其中A~UV k《m, n。通过这种方式,系统的自由度从0(mn)降低到0(m+n)·k)。类似地,用一个低维向量U表示一个人的喜好,用相同维度的向量V表示一部电影的特征,这样这个人和这部电影的相似度就可以通过两个向量的内积来表示。
在这里,可以将矩阵的评分视为一种计算相似度的方法。如果设定一个评分矩阵为A(mn),一个用户偏好的特征矩阵记为U(mk),以及一个产品特性矩阵记为V(n*k),那么这个评分矩阵可以被视为用户偏好特征矩阵与产品特性矩阵的乘积UVT的近似表示。这一技术被命名为概率矩阵分解算法(probabilistic matrixfactorization PMF)。ALS算法代表了PMF在数值分析领域的实际运用。在这里,为了让低秩矩阵X和Y尽量接近R,有必要最小化以下的平方误差损失函数:

考虑到矩阵的稳定性问题,这里需要使用到吉洪诺夫正则化Tikhonov regularization,通过对上面的损失函数进行吉洪诺夫正则化后,则上面的平方误差损失函数变为:

所以对于整个矩阵分解模型的损失函数就变为:

对于上面得到的损失函数,需要对其进行优化处理。这里本文使用交 叉最小二乘法(ALS)来对损失函数进行优化处理,从而达到最优化损失函数 的目的。

3.2.2 离线推荐算法实现
电影推荐系统的离线推荐环节是基于用户全部历史数据进行整合,通过应用预设的离线统计和离线推荐算法周期性地进行结果统计和存储。由于离线计算结果在某一特定时间段内保持稳定,因此这里采用Azkaban工具对离线推荐算法执行任务调度。这一系统的离线推荐部分的实施步骤,可参见图3.1所示:

图3.1 离线推荐部分执行流程图
关于电影的推荐系统,离线推荐的操作步骤如下:首步是利用Azkaban来配置离线推荐服务和离线统计服务的调度频次,这样可以确保它们在一个确定的时期内顺利开展调度工作。接着,离线统计服务利用Spark SQL软件来对系统需要的一些统计指标数据进行数据汇总,这些数据主要是从业务数据库MongoDB中调用过来的,并会将这些数据结果重新编写回MongoDB。最终,离线推荐服务采用了离线统计数据指标和MongoDB的历史资料。使用基于ALS的协同筛选推荐方法来完成推荐,并将推荐结果返回给MongoDB。
3.2.3实时推荐算法实现
实时推荐算法的实现主要分为以下几个步骤:
1.实时推荐算法实现的前提条件:
对于实时推荐算法的执行,首先需要完成一些准备工作,从而来为实时推 荐的执行完成先决条件,其具体准备工作如下:
在Redis集群中存储了每一个用户最近对电影的K次评分。 (2)离线推荐算法已经将电影相似度矩阵提前计算到了MongoDB中。 (3)Kafka已经获取到了用户实时的评分数据。
2.算法执行过程如下:
对于实时推荐算法来说,用户的输入可以是一个包括<userId, movieId, rate, timestamp>的评分,而用户需要执行的核心内容主要包括以下几部分:首先, 用户需要获取到userId的最近K次评分以及movieId的最相似K个电影,然 后需要计算候选电影的推荐优先级,最后则需要更新userId的实时推荐结果。 以下是用户需要执行的几个核心内容:
(1)获取用户的K次最近评分
业务服务器在接收用户评分的时候,系统会将这些评分处理为默认的 userId, movieId, rate, timestamp格式,并将这些默认格式的评分信息插入到 Redis中该用户对应的队列中,因此在实时计算时,只需要获取Redis队列中 相对应的内容即可。
(2)获取当前电影最相似的K个电影
由于本系统的离线推荐部分已经将电影的相似度矩阵计算出来了,因此, 对于每部电影的最相似的k部电影不难获取,其获取的方式可以简单概括为: 首先,需要将MovieRecs数据从MongoDB中读出,然后找到movieId在simHash 中对应的子哈希表,最后将该表中相似度前K大的那些电影获取即可。
(3)电影推荐优先级计算
对于电影推荐优先级的计算,这里主要涉及到一些优先级策略的定义,通 过遵循这些策略来完成电影推荐的优先级计算。
3.更新实时推荐结果
更新实时推荐的结果主要涉及三个核心步骤,它们是合并、替换和选择TopK。首先,在这里,需要将updatedRecommends集合和recentRecommends集合合并为一个并集集合。当合并完成后,由于这两个集合都会包含相同的推荐信息,因此需要用recentRecommends集合中相同的推荐信息来替换它们,因为updatedRecommends集合是更新后的结果。最后根据推荐的优先级排序结果,选择前K大的作为本次实时推荐的最终结果。
4.实时推荐的整体计算过程
(1)对于实时推荐计算过程第一步的工作主要是生成DStream,而 DStream主要是Kafka集群里面的一些数据信息,它主要是利用KafkaUtils工 具从Kafka消费者获得的;
(2)根据上面生成的DStream结果,对于其中的每个RDD-0,这里将对 其进行简单的数据格式化操作,从而得到对应的RDD-1,对于RDD-1中的每 条记录的形式为<userId,movieId,rate,timestamp>;
(3)对于RDD-1中的每条数据记录,分别做如下处理:
a.第一步的工作为以userd的信息为依托,获取来自于MongoDB中的userld对应的最近K次评分记录recentRatings;
b.与上一步类似,第二步是根据movied的信息,从而在广播变量中获取与movield最相似的K个电影的集合candidateMovies;
c.第三步的工作为,对于每个电影qecandidateMovies,这里的工作主要是通过运用公式计算出其推荐优先级Eug,在此基础之上从而产生其<qId,Eug>对应的的列表updatedRecommends;
d.最后,通过将updatedRecommends与MongoDB中上一次的推荐结果进行合并,并且按照推荐优先级进行排序,排序完成之后将其推荐结果进行更新。
(4)最终,按照之前获得的更新推荐内容,将其设定为实时推荐的依据。
3.4 实验结果和分析
对于进行对比的实验,首先要考虑的是实验所收集的数据集合。此文的核心内容是采用了在经过处理后的开源MovieLens数据集进行研究,此数据集包括200k、1M和10M等数据大小。在数据集中,主要可以找到三种文件,它们是:Movies数据集、Ratings和Tag数据集。Movies数据集的主要功能是描述关于电影的核心信息;Ratings数据集专注于与电影评分有关的内容;而Tag数据集的主要功能是为电影添加标签信息。当数据集准备完全后,接下来是仿真实验的详细设计方案。在本研究中,首轮对比试验是利用10M数据组,其中一个数据集大小固定,用于在Spark平台和单个计算机系统中分别执行常见和本系统设计的混合推荐算法。通过比较各算法的执行时间来确认本研究提出的混合推荐算法的明显优越性,并以下图为您所示不同算法的执行效率比较,如图3.2所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值