APP下载

基于Apache Spark的协同过滤系统设计与实现

2015-03-02陈斌等

软件导刊 2015年1期
关键词:协同过滤推荐系统

陈斌等

摘要:随着Web技术的发展,互联网用户数量持续增长,快速为用户生成精确推荐变得愈加困难。提出了项目协同过滤算法,采用余弦相似性计算项目间相似度并用加权平均值的方法为用户生成推荐结果。在Apache Spark上构建该系统,对抓取到的某电商商品数据进行测试。实验结果表明,基于Spark的推荐系统可以显著提高推荐生成的速度和有效性。

关键词:Apache Spark;协同过滤;推荐系统

DOIDOI:10.11907/rjdk.143871

中图分类号:TP319

文献标识码:A 文章编号文章编号:16727800(2015)001009703

0 引言

协同过滤推荐在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该用户的喜好程度预测。

Spark[1]是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发,是MapReduce模型的实现之一,它提供的框架自动执行任务分解、发送、执行、归并、容错工作,免去了二次开发和定制专用的分布式调度系统。和Hadoop一样,建立在HDFS基础上,但它的Job中间输出和结果可保存在内存中,减少了硬盘I/O次数,因而可以有较高的速度,对迭代和多步骤运算有更好的支持能力。鉴于此,很多机器学习相关工作者都在研究和使用它。本文在学习Spark基础上,搭建了一个Spark平台,并在其上设计实现了一个协同过滤系统。

1 协同过滤算法设计

协同过滤系统一般分为基于用户的协同过滤、基于项目的协同过滤和基于模型的协同过滤[2]。基于用户的协同过滤假设:对同样的项目,如果用户间的评分结果较为相似,则他们对其它项目的评分也比较相似。此假设弊端是运算量随用户量和项目数量的增长而急剧增长。基于项目的协同过滤系统则通过计算基本稳定的项目间相似性作出推荐,意味着用户的偏好由系统中的项目唯一确定,因而有更好的可扩展性。

在一个典型的协同过滤场景中,有n个项目Ι={i1,i2,…,in}和k个用户U={u1,u2,...,uk},令Mk*n为基本用户对各项目的偏好矩阵。其中,Mu,i表示用户u对项目i的偏好,如评分,其值为实数或空,空表示当前用户尚未对项目作出评价。推荐系统的任务就是根据目标用户u∈U的评分历史,预测出用户最喜欢的项目。本文采用基于项目的协同过滤算法,使用余弦相似性计算项目间相似性,然后采用加权平均值的方法为用户生成推荐结果。

1.1 相似性度量方法

本文主要采用余弦相似性度量方法[2]计算用户间、项目间的相似性,这里以计算用户间相似性为例,其计算方法可表示为:

sim(ux,uy)=∑i∈Cux,uyrux,iruy,i∑i∈Cux,uyrux,i2∑i∈Cux,uyruy,i2(1)

其中,Cux,uy表示用户ux和uy共同评价过的项目i∈Ι的集,rux,i表示用户ux对项目i的评分,ruy,i表示用户uy对项目i的评分。相似性即两向量ux,uy的夹角余弦值,因为用户评分均为正数,故相似性取值范围为[0,1]。

1.2 加权平均值

在协同过滤算法中,计算出所有用户间的相似度后,就可以采用一种方法为给定的用户u∈U,预测出用户对所有尚未评价项目的评分。这里介绍一种最为简单、常用并且效果良好的方法:加权求和,表示为:pux,i=ux+∑uy∈Nux(ruy,i-uy)*sim(ux,uy)∑uy∈Nuxsim(ux,uy)(2)

其中,Nux 表示用户ux的邻居,sim(ux,uy)表示用户ux和uy的相似度。

2 推荐系统部署与设计

由于推荐系统的高度计算密集性,将推荐系统部署到单台机器上会有很大的限制,例如,CPU运算速度、内存大小和硬盘I/O能力等,更为重要的是如果此计算机发生故障,将面临数据丢失的风险。使用分布式计算环境可以大大缓解此类问题,如可在分布式运算框架Hadoop/MapReduce下实现推荐系统[4-6]。Spark是一个开源的Hadoop/MapReduce并行计算框架,本文在Spark平台上构建一个协同过滤系统。

2.1 软硬件配置

实验平台硬件采用Intel Core i5双核的普通PC,网络带宽为100Mbps,为提高虚拟机I/O速度,采用1条4G和1条8G DRR1333内存条,并搭载128GSanDisk固态硬盘。主机采用Windows 8.1 x64位系统,虚拟机采用开源的Oracle VM VirtualBox 4.3,虚拟主机系统采用开源的Linux/CentOS6.5,具体如表1所示。

2.2 网络规划

在VirtualBox中建立HostOnly网络,虚拟主机规划如下:(master/worker,169.254.80.3);(Worker1,169.254.80.4);(Worker2,169.254.80.5)。

2.3 SSH通信配置

SSH通信协议(Secure Shell)[7]是集群中各个节点通信所采用的协议,主节点可以通过SSH启动或关闭集群中节点。在配置SSH之前,需要保证各节点能相互通信。在各节点的终端中通过sshkeygen命令生成公私钥,将各节点的公钥内容写入authorized_keys文件中,并发布到各节点的~${USER}/.ssh目录下,权限为600。

2.4 Java环境安装

从官网下载安装包文件,使用rpmi jdk.rpm命令安装,之后编辑~user/.bash_profile文件,添加JAVA_HOME环境变量为jdk安装目录,添加$JAVA_HOME/bin到Path变量。

2.5 Spark安装配置

首先需要配置Hadoop。从官网下载合适版本的Hadoop,安装后修改配置文件:conf/coresite.xml, conf/hdfssite.xml, conf/yarnsite.xml和conf/mapredsite.xml,并添加对应的环境变量,具体参考官网对应版本配置介绍。然后从官网下载Hadoop版本编译过的Spark程序并安装。配置Spark最为简单的方式就是以独立方式部署。成功部署并启动后,Spark会运行master服务器和worker服务器,注意:所有节点必须从master节点启动。然后将worker节点信息添加到master节点中的conf/slaves文件中,具体请参考官网文档。本文中配置如下:

SPARK_MEM=2g #指定单个worker节点所使用的内存值

SPARK_JAVA_OPTS=”Dspark.storage.memoryFraction=0.4 Xmx3g” #第1个参数:可用来作为cache的内存比例,剩余内存用来满足任务运行内存空间的需要;第2个参数:设定jvm最大可用内存为3G。

3 实验结果分析

3.1 性能评估

为了验证基于Spark分布式平台对协同过滤推荐引擎的执行性能,我们从单节点到多节点进行实验。实验数据由10W用户和3900个商品构成的69W条记录构成,使用随机抽样将数据分为测试数据和训练数据两部分,比例为1∶9。采用Top20方法实验,最近邻居个数为50个。

图1 不同节点数推荐计算时间

图1显示执行时间开始随节点增加而减少,但是当节点增加为3个时,加速效果则不明显。我们认为是CPU瓶颈,因所采用CPU为双核酷睿i5型号;另外,根据Amdahl定律,并行化的程序所获得的加速比,与程序中可并行执行代码所占比例有直接关系,所以加速效果并不是线性增长的。

3.2 推荐质量评估

推荐质量评估一般采用平均绝对误差MAE(mean absolute error)方法,MAE越小则推荐质量越高[8],MAE计算公式可表示为:

MAE=∑a∈URa,i-Pa,iN(3)

其中,N表示总推荐个数,Ra,i表示用户a对项目i的实际评分,Pa,i表示系统预测用户a对项目i的评分。

采用余弦相似度方法,通过修改不同个数的最近邻居,得出相应的MAE,结果如图2所示。

从图2可以看出,MAE整体随邻居个数增加而降低,但其下降速度逐渐降低,即过多增加最近邻居个数对推荐质量的提高贡献有限,反而消耗了更多的计算资源,因而需要在计算资源和推荐质量之间取一个折衷值。

图2 不同邻居个数的MAE值

4 结语

本文首先给出一种协同过滤推荐算法的设计和实现方法,然后介绍了Apache Spark框架以及本文实验环境搭建过程,并进行了算法实验。由于本文所采用设备性能的限制,未能进行较大数据集的实验测试。在接下来的工作中,应继续研究如何对Spark进行优化,并研究较为适合的应用场景。

猜你喜欢

协同过滤推荐系统
基于用户偏好的信任网络随机游走推荐模型