admin 管理员组

文章数量: 1086019


2024年4月16日发(作者:逗号表达式和赋值表达式)

基于Spark的协同过滤推荐算法研究

焦健

(三峡大学计算机与信息学院,湖北宜昌443002)

摘要院目前,经过国内外专家和学者长时间的应用与研究,协同过滤推荐算法的优势日益明显,并

且逐步成为推荐系统的主流算法。新兴的计算框架Spark得益于基于内存计算的优势,与传统的

MapReduce大数据计算框架在运算效率上比较有着显著的提高。通过在Spark计算框架下进行各种协同

有较高准确率。

关键词院Spark框架;协同过滤;ALS算法;隐语义模型

过滤推荐算法的准确识别率的对比得出结论,基于ALS优化的隐语义模型,在几种协同过滤算法中具

1Spark计算框架

写好的程序分发到各个节点袁并让每个工作节点并行运

Spark是一个开源的大数据计算引擎框架

[1]

遥它将编

orativeFiltering袁简称Item-CF冤袁基于物品的协同过滤

推荐在计算时只考虑利用物品本身信息袁并不用从用户

的角度考虑问题遥对于物品相似度的度量基于用户对于

物品的喜好袁利用该喜好程度发掘相似的物品袁将它推

荐给喜好相似物品的用户遥

2.1.3相似度算法

因为在两种基于邻域的协同过滤推荐算法中都需要

算自己的任务遥Spark的主要开发语言为Scala袁它与

Java十分类似袁但它又具有函数式编程思想袁为开发人

员提供更好的编程模型遥Spark吸取了计算框架MapRe鄄

duce的许多宝贵经验袁近些年它的性能提升很快袁

Spark与MapReduce相比袁在理想状态下它在内存计算

的速度比MapReduce要快100倍袁甚至在硬盘上的计

算速度也要快10倍以上遥主要是因为Spark拥有弹性

数据集RDD袁在执行任务时将中间结果读取到内存里

[2]

不像MapReduce通过对磁盘进行读写来传递里面的结

果袁通过充分使用内存资源提升了计算的效率

[3]

计算相似度来确定一定数量的用户或物品近邻袁然后才

能进行推荐袁所以需要用到相应的相似度计算方法袁目

前主要的相似度计算方法有两种院

渊1冤余弦相似度

余弦相似度这种评价两者相似性的度量袁依据两向

量夹角余弦确定遥具体公式如下院

2

2.1基于邻域的协同过滤

协同过滤推荐算法

2.1.1基于用户的协同过滤算法

公式渊1冤

渊2冤皮尔逊相似度

基于用户的协同过滤算法渊User-BasedCollabora鄄

tiveFiltering袁简称User-CF冤袁是推荐系统中早期的经

典算法袁它是基于系统使用者过去留下的活动数据对用

户的喜好进行归纳渊评分尧购物尧点赞等冤袁并且对喜

好的程度进行度量

[4]

遥通常情况下袁是基于使用者对物

品评价来作为喜好程度袁从而来挖掘和当前使用者相似

的邻域对象袁邻域对象的计算一般使用野K-邻居冶算

法袁找到K个最相似邻域对象的历史喜好数据中程度

最高袁并且当前使用者没有过任何行为的物品袁推荐给

当前的使用者遥

2.1.2基于物品的协同过滤算法

2020.03

皮尔逊相关系数是在两个项目之间有交集的偏好的

集合上进行相似度的计算遥公式如下院

公式渊2冤

2.2基于模型的协同过滤

2.2.1矩阵分解

在隐语义模型中进行矩阵分解的的主要原理为对用

户-物品矩阵进行偏好建模袁通常情况下就是构建用户-

物品评分矩阵袁并且用矩阵分解的形式将稀疏的用户-

物品评分矩阵转化成稠密的用户-物品评分矩阵袁预测

基于物品的协同过滤推荐算法渊Item-BasedCollab鄄

40

使用者对某物品的喜好程度袁最后针对该使用者进行推

荐遥其原理为将用户-物品评分矩阵分解为两个U*K和

I*K

户和物品的

的因子矩阵

K个属性或特征

袁其中对K因子的解释为隐性的关于用

袁并且不需要刻意去在意

每个因子的具体含义是什么袁只需要选取合适的值袁将

两个因子矩阵相乘后袁就可以使用重新计算的矩阵结果

进行评分预测遥

2.2.2

在实现隐语义模型的矩阵分解时

基于最小二乘法的矩阵分解(ALS

用户和物品都会

映射到一个多维的因子矩阵中袁用户-物品的偏好矩阵

为这两个矩阵相乘的结果袁两个用户和物品的因子矩阵

分别表示为u和m袁现在的问题就是求解结果矩阵的

最优值袁这时损失函数可表示为院

公式渊3冤

此时最小二乘法便可以作为一个求解方法加入到最

优化求解过程中袁其原理就是在每一次进行迭代的时候

固定其中一个因子矩阵袁更新另一个因子矩阵袁之后反

复重复这个过程进行迭代直至模型收敛袁当实际使用

时袁往往会自己设置迭代次数来求解遥

以上就是对协同过滤推荐算法的研究袁接下来将对

以上的算法在Spark计算框架上做出实验来进行比较袁

得出在Spark平台上推荐效果较好的协同过滤算法袁从

而为以后搭建Spark推荐系统打好基础遥

3

3.1

实验及结果分析

使用的

搭建实验平台

Hdoop分布式大数据平台袁数据存储在

HDFS

平台由

存储系统

3台虚拟机组成

袁计算框架为

袁虚拟机分别配置为

Spark计算框架

4

核心

分布式

袁2G

内存袁使用CentOS6.8操作系统遥3台虚拟机主要包括

一个Master节点袁两个Slave节点袁所有节点配置SSH

无密码远程登录遥

3.2

采用了经典的推荐系统公开数据集

实验数据集

MovieLens

揖13铱

要选取用户评分表的数据袁主要字段有userId袁movieId袁

袁主

rating袁

字段袁在前期的数据预处理中将其删除

timestamp袁其中时间戳字段在本实验中为无用

遥本实验选用的

是100K渊约10万条冤袁1M渊约100万条冤袁和从数据集

中随机抽取出1万条评分数据这3种规模的数据进行实

验袁分别随机取数据集中的80%作为训练集袁20%作

为测试集遥

3.3

实验是典型的基于推荐算法的实验

实验评测标准

袁所以实验最注

重的就是结果的准确性袁对于测试算法的准确性袁一般

采用均方根误差渊RMSE冤以评价算法的准确程度遥误

差的大小代表着准确率的高低遥其中r

i

表示真实评分袁

p

i

表示预测评分袁其具体公式为院

公式渊4冤

3.4

于皮尔逊相似度受到稀疏矩阵的影响较大

ALS

实验结果及分析

算法的运行效果受所选取参数的影响

袁基于近邻的

袁同时由

两种协同过滤算法将采用余弦相似度算法遥ALS算法受

所选取的迭代次数和隐因子的数目影响较大袁所以应该

先经过多次试验选取出最佳参数来进行对比遥

先通过100K的数据集ALS算法的迭代次数在达到

10

的提升变得缓慢

次后就趋于收敛

袁为了不增加更高的计算量

袁同时隐因子数量在40左右准确率

袁实验选取

ALS

数确定后

的迭代次数为

袁用这3个算法对

10袁隐因子数目为

3个不同规模数据集进行实

40遥将合适的参

验袁结果如图1所示遥

0.9

1

User-Based

0.8

Item-Based

0.7

ALS

0.6

0.5

0.4

0.3

0.2

0.1

0

10K

数据集规模

100K1M

图1

他两种算法

Spark计算框架中

袁之前通过对

ALS算法的整体准确率要优于其

Spark框架的了解和研究袁

Spark

正是需要多次迭代的算法

计算框架对迭代计算具有较好的支持

袁所以这个结果不出预料

袁并且

ALS

一方面看出袁对于数据量的增大基于邻域的协同过滤算

法并未出现十分明显的准确率变化袁但是ALS却有较

大的提高袁是因为ALS是基于模型的算法袁随着数据

量的提升袁数据更加丰富袁模型训练量也变大袁大大提

(下转第73页)

2020.03

41

//变化

update-|-1.1.1.04-|-010_020__system_

|-020_010__user_

由于多个水平扩展的微服务实例连接的是同一个数

据库实例袁所以可以通过数据库表锁来实现多个微服务

实例之间的同步执行数据库脚本遥如图2所示袁是多个

微服务实例在数据库同步锁下袁并发执行完本次版本中

所有需要的数据库SQL脚本文件遥

4

4.1数据库脚本执行顺序控制

数据库脚本并发执行

数据库中有版本记录表schema_version袁把有序的

SQL文件列表与schema_version表中最大的版本号比

较袁找到需要执行的SQL文件的版本号袁再与schema_

确定需要执行的SQL脚本文件遥

4.2数据库脚本并发执行控制

version表中对应版本号的最大模块号_序号比较袁最终

5结语

微服务架构专注于将应用程序模块化袁将业务分解

成较小相互独立的服务袁解决了单体架构中的诸多问

题袁例如院程序构建和维护困难袁技术栈难以更新袁每

一项变更需要重构整个应用程序等遥

在微服务架构成为主流的今天袁为了解决相同微服

务实例水平扩展袁带来的数据库脚本初始化执行与升级

的问题遥在此提出了微服务的数据库安装脚本和升级脚

本的版本控制尧目录规划尧文件名定义解决办法袁并为

水平扩展的多个微服务实例提供了一种并发执行数据库

脚本的方案遥

参考文献

[1]

工业出版社,2019.

2017.

[美]克里斯窑理查森.微服务架构设计模式.机械

在微服务水平扩展时袁相同版本的微服务会有多个

微服务实例运行袁这会导致多个进程同时初始化数据库

表数据袁造成冲突遥需要通过同步机制控制多个微服务

实例执行数据库脚本遥

微服务1

循环

未执行SQL文件数跃0

获取到锁袁执行SQL脚本

未获取到锁袁等待

未获取到锁袁等待

执行一个SQL脚本

1

2

n

微服务2微服务n

数据库

表锁

[2]李艳鹏,杨彪.分布式服务架构.电子工业出版社,

执行一个SQL脚本结束袁唤醒后续微服务

唤醒微服务2

执行下一个SQL脚本

[3]jonson_jackson微服务理论与实践.什么是微服务.

执行一个SQL脚本结束袁唤醒后续微服务

图2多微服务实例并发执行SQL文件

(上接第41页)

高了模型的推荐效果遥

以找到算法的不足之处并对其进行改进遥

参考文献

[1]ZahariaM,ChowdhuryM,FranklinMJ,:

clustercomputingwithworkingsets[C]//UsenixCon鄄

ferenceonHotTopicsinCloudComputing.2010.

系统仿真技术,2016.

4结语

主要研究了当前比较流行的协同过滤推荐算法袁深

入研究它们的算法原理袁并且对Spark计算框架的原理

和应用有了一定的了解遥通过对比试验袁ALS算法在

Spark计算框架下比基于邻域的协同过滤算法有更高的

准确性袁这主要得益于Spark计算框架对迭代计算较好

的支持遥通过研究对Spark计算框架下的协同过滤推荐

算法有了一定的了解和应用能力袁对往后搭建基于

Spark的推荐系统打下了一定基础遥虽然取得了不错的

典的协同过滤算法袁但是如果进行更深入的研究应该可

实验效果袁但是还有不足之处袁比如这些算法虽然是经

[2]于娜娜.基于Spark的协同过滤算法的研究[J].

[3]吴信东,嵇圣硙.MapReduce与Spark用于大数据分

析之比较[J].软件学报,2018,29(6):260-281.

[4]ZhangZ,KudoY,orselectionforus鄄

er-basedcollaborativefilteringusingcovering-based

roughsets[J].AnnalsofOperationsResearch,2017,

256(2):359-374.

2020.03

73


本文标签: 算法 计算 协同 推荐 过滤