2. 新疆医科大学 医学工程技术学院, 乌鲁木齐 830011;
3. 新疆大学 信息科学与工程学院, 乌鲁木齐 830008;
4. 清华大学 软件学院, 北京 100084
2. College of Medical Engineering and Technology, Xinjiang Medical University, Urumqi Xinjiang 830011, China;
3. School of Information Science and Engineering, Xinjiang University, Urumqi Xinjiang 830008, China;
4. School of Software, Tsinghua University, Beijing 100084, China
据互联网数据中心(Internet Data Center)发布的报告显示,2015年全球产生的数据量达到近10 ZB,而2020年全球产生的数据量将达到40 ZB[1]。数据的产生过程在经历被动和主动两种产生过程后,发展到了自动产生阶段,标志着大数据时代的来临。数据从简单的处理对象开始转变为一种基础性资源,如何更好地管理和利用大数据已经成为普遍关注的话题,大数据的规模效应给数据存储、管理以及数据分析带来了极大的挑战[2],进而高效率低成本的大数据处理技术成为学术界及工业界的研究热点。推荐算法作为大数据挖掘类算法中最常见的一种,由于可以快速地在海量信息中筛选并过滤出用户可能最感兴趣的内容,在帮助用户获取有效信息的同时实现信息提供商与用户之间的双赢,得到了快速的发展,而协同过滤推荐(Collaborative Filtering Recommendation)是其中最经典的推荐算法。
自2003年Google发表论文公开分布式存储系统GFS(Google File System)[3]及分布式数据处理模型MapReduce[4-5]以来,由于MapReduce具有可扩展性(Scalable)、低成本(Economical)、高效性(Efficient)及可靠性(Reliable)等优点[6],使其成为诸多大数据计算系统(如:Hadoop、Spark、Pig、Hive、Hbase和Dryad等)最通用的并行计算框架(MapReduce生态系统如图 1[7]所示)。MapReduce与以往的并行计算模式相比,最大的区别是它“移动计算”而非“移动数据”的理念,即将任务调度到离数据最近的节点,因为这样可以最小化大数据作业计算过程中数据的网络传输量,而这正是MapReduce发展如此壮大的根本原因。
在此背景下,随着MapReduce计算框架的不断发展壮大,已有的推荐算法大多基于MapReduce框架实现,但MapReduce计算场景下,复杂的大数据挖掘类算法通常需要多个MapReduce作业协作完成,但多个作业之间严重的冗余磁盘读写及重复的资源申请操作,使得算法的计算及能耗等效率严重降低[8-10]。而协同过滤推荐算法则属于典型的大数据挖掘类算法,所以本文以基于物品(ItemBased)的协同过滤算法为例,研究提高算法性能的优化方法。本文作了如下几个方面的工作:首先,对基于MapReduce的ItemBased协同过滤算法实现及性能缺陷进行了分析;其次,在性能缺陷分析的基础上,提出基于Spark平台重写算法,进而提高ItemBased推荐算法的性能;最后,通过实验验证了算法优化效果的有效性。
1 相关研究由于应用领域及场景的不同,最常见的协同过滤算法[11]有基于用户、物品及混合协同过滤3种,除此之外还有基于内容的协同过滤[12-13]、基于规则的协同过滤[14-15]、基于人口统计信息的协同过滤[16-17]、基于网络结构的协同过滤[18-19]及混合过滤[20]等。已有的推荐算法研究工作主要目的都是以提高算法在特定应用领域的推荐质量为首要目标,主要评价指标有准确率(Precision)、召回率(Recall)、F值(F-Measure)、E值(E-Measure)、平均正确率(Average Precision)等。很少工作关注到算法的计算效率、算法执行环境等方面,但在算法处理数据量的爆炸式增长及分布式计算模型MapReduce逐渐普及的背景下,推荐算法从单机模型逐渐向MapReduce发展,并且算法的执行效率也逐渐受到学术界及工业界的重视。
文献[21-22]将基于用户(User-Based)的协同过滤算法移植到Hadoop平台,以提高算法并行计算的能力,并通过修改作业map及reduce子任务的数量,达到提高MapReduce模型下算法计算效率的目的。Schelter等[23]面对用户数据量快速增长的问题,开发了基于MapReduce的近邻(Similarity-based neighborhood)协同过滤算法,并通过7亿Yahoo音乐数据的实验证明了算法在效率上的提升。文献[24]将MinHash聚类、概率潜在语义索引(Probabilistic Latent Semantic Indexing, PLSI)及Covisitation计数技术引入到Google news的协同过滤算法中,有效地提高了算法的性能。文献[25]开发并实现了MapReduce平台下基于物品(ItemBased)协同过滤算法,将算法的计算步骤切分为Map及Reduce子任务,并通过数据本地化策略最小化通信成本,大大提高了Hadoop中算法的执行效率。但是,不管是UserBased还是ItemBased协同过滤算法,MapReduce环境下的计算任务都需要多个作业协作完成,作业之间难免存在冗余的I/O及资源重复申请操作,算法效率上还存在着较大的优化空间。所以,本文与以往工作不同的是:在分析基于MapReduce的ItemBase协同过滤算法性能缺陷的基础上,利用Spark在迭代计算和内存计算上的优势,提高算法的执行效率。
2 基于MapReduce的ItemBased推荐算法分析选择ItemBased的协同过滤算法为研究对象主要原因是:为了让相似度矩阵计算规模最小化,ItemBased算法更加适用于用户数据量比物品数据量大的场景,而UserBased则适用于用户数比物品数小的场景。除此之外,相对于其他协同过滤算法,item与item之间的相似度比较稳定,适合离线计算,能够实现定期更新的功能,这使得ItemBased协同过滤算法的应用场景相比其他推荐算法更为广泛。
ItemBased算法假设能够引起用户兴趣的item必定与其评分高的item相似。算法首先计算用户对物品的喜好程度,然后根据用户的喜好计算item之间的相似度,最后找出与每个item最相似的前N个item。其中,相似性计算包含3个步骤:1) 统计每个item的好评用户数; 2) item好评键值对统计,即统计任意两个有关联item的相同好评用户数; 3) item相似性计算(可采用Jaccard系数作为计算两个item的相似性方法),即计算任意两个有关联item的相似度。而找出最相似的前N个item步骤中,首先需要对item相似性归一化,再进行相似性评分整合,最后得出每个item相似性最高的前N个item。MapReduce的ItemBased推荐算法,其最经典的实现代码是Mahout中的RecommenderJob类,其源码在org.apache.mahout.cf.taste.hadoop.item包下,其主要参数及意义如表 1所示。
通过对ItemBased推荐算法在Hadoop中的运行过程监控及日志分析,发现执行一次算法总共包含12个MapReduce作业,根据不同MapReduce作业的功能,可分解为如下10个计算步骤,每个MapReduce作业所对应的计算步骤及功能如表 2。
即使将MapReduce Job1(MR Job1)、MapReduce Job11等这样的非核心的计算步骤去掉,最精简的ItemBased推荐算法也至少需要7个MapReduce作业才能完成计算。如图 2所示为精简后的MapReduce作业与HDFS(Hadoop Distributed File System)文件系统的调用关系。
根据MapReduce计算模型的原理,每个MapReduce作业会被切分为多个map及reduce任务。其中map任务执行过程中需要将数据从HDFS中读取进来,当map任务计算完毕后,通过Shuffle与Sort操作将〈key, value〉键值对发送给对应的reduce任务,reduce阶段以〈key, Iterator〈value〉〉作为数据输入,计算完毕后将处理结果写入到HDFS中。由于MapReduce作业之间相互独立,即每个MapReduce作业都要进行输入数据的读取及将计算结果写入HDFS的操作。由于ItemBased推荐算法总共包含12个MapReduce作业,意味着算法执行过程中需要进行总共24次的HDFS读取及写入操作。这些重复的数据读写操作耗费集群资源的同时,严重降低了算法的执行的效率;并且,由于磁盘I/O资源是集群计算性能的瓶颈,高频次的I/O资源申请及释放容易产生资源竞争,导致map与reduce任务之间容易出现等待现象,进而不同程度上进一步降低了算法的执行效率。
通过以上分析发现MapReduce环境下的ItemBased算法性能优化并不能单从优化算法本身入手,MapReduce作业之间的独立性所带来的重复I/O操作是导致算法的计算效率低下的根本原因。
3 基于Spark的ItemBased推荐算法第2章分析了ItemBased推荐算法在MapReduce平台下效率低下是由于MapReduce作业之间的独立性及资源的不合理利用造成,Spark相比MapReduce主要有以下两方面的优势。
1) Spark能够将计算过程中产生的中间数据缓存到内存,与MapReduce相比,迭代计算效率更高。这是由于Spark的RDD(Resilient Distributed Dataset)能够直接cache到内存中。Action或Transformation算子对RDD数据集的计算结果缓存到内存中,使得下一个算子的输入数据直接从内存中读取,相比MapReduce省去了大量的重复磁盘I/O操作。
2) Spark实现推荐算法业务逻辑比MapReduce更简单灵活。这是由于MapReduce只提供map与reduce两种基本操作,而Spark则提供包含Transfromation及Action两类操作集。其中,Transfromation中包含map、filter、flatMap、sample、groupByKey、reduceByKey、union、join、cogroup、mapValues、sort和partionBy等操作;Action中拥有count、collect、reduce、lookup和save等操作。除此之外,Spark能够将这些算子之间的业务逻辑(计算流程)通过有向非循环图(Directed Acyclic Graph, DAG)模型进行组织调度。
由于目前Spark MLlib中已有的推荐算法只有ALS(Alternating Least Squares)一种,并没有ItemBased推荐算法。所以,本文对Spark平台下基于Scala语言对算法进行了实现。算法核心主要包含以下3个部分。
1) 数据输入模型构建。
ItemBased推荐算法输入数据格式为:(userID, itemID, ratingScore)意义分别为用户ID、物品ID和评分值。构造用户数据输入模型核心代码如下:
def UserData (
sc:SparkContext, input:String, split:String):(RDD[(String, String, Double)])={
val u_rdd1=sc.textFile(input, 10)
val u_rdd2=u_rdd1.map(line=>{
val fileds=line.split("split")
(fileds(0), fileds(1), fileds(2).toDouble)
})
u_rdd2
}
2) 相似度矩阵模型构建及计算。
可将相似度计算的输入数据抽象的表示为两个关系模式:Features(id, feature)和Relationship(id, fid)。其中Features表示每个对象(如用户、文本、商品等)所具有的特征信息;而Relationship表示Features中的对象之间存在的关系。相似度计算的流程是:首先,通过Relationship表中的关系对(id, fid),关联到Features表中id及fid中所对应的feature字段的值(即〈f1, f2, …, fn〉的值);其次,将两组feature的值作为输入参数,交给相似度计算函数SC(Similarity Calculation)进行计算。最后,将每次SC函数计算结果输出到结果表中。可根据具体的应用场景不同而选择不同的相似度计算函数,常用的相似度计算函数SC有Cosine Correlation函数、Spearman Rank Correlation函数、Pearson Correlation函数及欧氏距离相似度函数等。本文采用欧氏相似度函数,其中输入参数u_rdd表示用户评分表,输出参数u_rdd9表示相似矩阵,数据格式为:(itemID1, itemID2, 相似度)。其核心代码EuclideanDistanceSimilarity如下:
def EuclideanDistanceSimilarity(
u_rdd:RDD[(String, String, Double)]):(RDD[(String, String, Double)])={
val u_rdd2=u_rdd.map(f=>(f._1, (f._2, f._3))).sortByKey()
u_rdd2.cache
val u_rdd3=u_rdd2.join(u_rdd2)
val u_rdd4=u_rdd3.map(f=>((f._2._1._1, f._2._2._1),
(f._2._1._2, f._2._2._2)))
val u_rdd5=u_rdd4.map(f=>(f._1, (f._2._1-f._2._2) *
(f._2._1-f._2._2))).reduceByKey(_+_)
val u_rdd6=u_rdd4.map(f=>(f._1, 1)).reduceByKey(_+_)
val u_rdd7=u_rdd5.filter(f=>f._1._1!=f._1._2)
val u_rdd8=u_rdd7.join(u_rdd6)
valu_rdd9=u_rdd8.map(f=>(f._1._1, f._1._2, f._2._2/
(1+sqrt(f._2._1))))
u_rdd9
}
3) 推荐算法模型构建及业务实现。
在构建用户输入模型及相似度计算模型的基础上,推荐模型根据物品相似矩阵以及用户对物品的评分表,计算用户的推荐列表。其中,输入参数items_similar表示物品相似矩阵,user_perf表示用户评分表,r_number表示推荐个数;而输出参数rdd7表示用户推荐列表,格式为:(userID, itemID, ratingScore)。其核心代码Recommend如下。
def Recommend (
items_similar:RDD[(String, String, Double)], user_perf:RDD[(String, String, Double)], r_number:Int):(RDD[(String, String, Double)])={
val rdd2=items_similar.map(f=>(f._2, (f._1, f._3))).
join(user_perf.map(f=>(f._2, (f._1, f._3))))
val rdd3=rdd2.map(f=>((f._2._2._1, f._2._1._1),
f._2._2._2*f._2._1._2))
val rdd4=rdd3.reduceByKey((x, y)=>x+y).
map(f=>(f._1._1, (f._1._2, f._2)))
val rdd5=rdd4.groupByKey()
val rdd6=rdd5.map(f=>{
val i2=f._2.toBuffer
val i2_2=i2.sortBy(_._2)
if (i2_2.length>r_number)i2_2.remove(0, (i2_2.
length-r_number))(f._1, i2_2.toIterable)
})
val rdd7=rdd6.flatMap(f=>{
val id2=f._2
for (w<-id2) yield(f._1, w._1, w._2)
})
rdd7
}
算法在Spark环境中的计算流程,RDD数据集之间的转化操作及关系,请参见图 3。
为了对比算法在MapReduce与Spark平台下的执行效率,本文利用测试数据生成工具DataFactory生成测试数据8亿条。将测试数据生成到数据库表中后,将数据库表中的测试数据导出为TXT数据后上传到HDFS中。HDFS中数据块的大小设置为16 MB,数据的切分及存储情况由机架感知的数据块存储策略随机确定。测试数据的格式为(userid,itemid,ratingScore),其含义表示用户(userid)对物品(itemid)的评分结果为ratingScore。实验在2组不同规模集群上进行测试,第1组节点规模为10,第2组节点规模为20。实验节点的配置参数如表 3所示。
为了对比算法在MapReduce与Spark平台下的执行效率,在输入数据相同的条件下,分别将MapReduce及Spark平台下的算法在节点为10与20的集群中运行10次,得到的实验数据如表 4所示。其中:在MapReduce 10节点的集群环境下算法运行10次的平均时间为13 226.7 s,在集群节点规模为20时平均时间缩短到7 117.4 s;Spark集群规模为10个节点时平均时间为3 380.5 s,当Spark集群规模扩大到20个节点时平均时间缩短至2 194.4 s。
从表 3中数据可以看出,由于算法执行的并行性,无论是MapReduce还是Spark平台,随着集群规模的扩大,算法运行时间有所缩短。其中MapReduce集群规模从10节点扩充到20后,算法平均执行时间缩短了6 109.3 s,效率提升了近46.2%;而Spark集群规模的扩大,算法平均执行时间缩短了1 186.1 s,效率提升了35.1%左右。当集群规模都为10节点时,Spark整体上比MapReduce平均执行时间缩短9 846.2 s,Spark算法运行时间只有MapReduce的25.6%;而当集群规模为20时,Spark整体上比MapReduce平均执行时间缩短4 923 s,Spark算法运行时间只有MapReduce的30.8%。
4.3 算法执行效率分析如图 3所示为算法在Spark环境中的计算流程分析,整个算法在Spark环境中运行分为8个Stage,涉及到18个RDD数据集,图 3描述了RDD数据集之间的转化关系。将图 3的计算过程与图 2进行对比,可以看出相对于MapReduce平台,Spark平台下对算法的执行时间及资源利用效率提升主要有以下3个方面的原因。
1) 当RDD缓存到内存时,相比直接从HDFS中读取数据,效率提高很多。当算法在Spark平台中执行时,中间数据以RDD的方式缓存在内存中,相对于MapReduce每个作业都需要进行磁盘的读写操作,大大地提高了磁盘I/O资源的利用效率。RDD的Cache机制减少磁盘I/O压力的同时,还能提高数据并行读取的能力,比如RDD3进行Cache后,RDD4和RDD7都可以同时访问RDD3的数据,这比MapReduce作业之间重复从HDFS中读取相同数据的问题, 数据访问效率再次提升。
2) Spark作业启动后会立即申请所需的Executor资源,并且所有Stage的Tasks以线程的方式运行,共用Executors资源。这相对于MapReduce以心跳的方式管理slot资源,Spark申请资源的次数大大减少,导致资源管理效率高于MapReduce。
3) MapReduce中算法总共需要执行多达12个Job,即使优化后能够减少到7个,但作业的数量仍然较多。而通过Spark中的DAG编程模型,可以实现将多个MapReduce作业简化为单个Spark DAG作业。而DAG作业会进一步分解为多个Stage,每个Stage包含多个可并行执行的Task,由于Spark资源管理效率比MapReduce高,使得Spark中的Task并行执行效率比MapReduce更高。
5 结语大数据的规模效应给数据存储、管理以及数据分析带来了极大挑战,高效率低成本的大数据处理技术成为学术界及工业界的研究热点。随着MapReduce生态系统的日趋完善,MapReduce逐渐成为工业与学术届事实上的海量数据并行处理标准,但MapReduce的优势在于处理批处理作业。对于具有复杂业务处理逻辑的互联网数据挖掘类作业,由于这些算法通常需要多个MapReduce作业协作完成,但多个作业之间严重的冗余磁盘读写及重复的资源申请操作,使得算法的性能较低。在此背景下,本文选择ItemBased作为研究对象,首先对基于MapReduce的ItemBased协同过滤算法实现及性能缺陷进行了分析;并在此基础上提出利用Spark在迭代计算和内存计算上的优势,提高算法的执行效率的方法,进而在Spark平台下对ItemBased算法进行了实现;最后通过对比实验,验证了Spark平台下算法性能相对MapReduce平台的优越性,并对算法效率提高的原因进行了分析。
下一步工作主要是在本文的基础上,研究利用JVM(Java Virtual Machine)参数优化、矩阵计算优化及并行度调优等方法进一步提高算法的计算效率。
[1] | The digital universe in 2020:big data, bigger digital shadows, and biggest growth in the far east[EB/OL].[2017-03-15]. http://www.emc.com/collateral/analyst-reports/idc-the-digitaluniverse-in-2020.pdf. |
[2] | 孟小峰, 慈祥. 大数据管理:概念、技术与挑战[J]. 计算机研究与发展, 2013, 50(1): 146-149. (MENG X F, CI X. Big data management:concepts, techniques and challenges[J]. Journal of Computer Research and Development, 2013, 50(1): 146-149. DOI:10.7544/issn1000-1239.2013.20121130) |
[3] | GHEMAWAT S, GOBIOFF H, LEUNG S T. The Google file system[C]//Proceedings of the 19th ACM Symposium on Operating System Principles. New York:ACM, 2003:29-43. |
[4] | DEAN J, GHEMAWAT S. MapReduce:simplified data processing on large clusters[C]//OSDI 2004:Proceedings of the 2004 Conference on Operating System Design and Implementation. New York:ACM, 2004:137-150. |
[5] | 廖彬, 张陶, 于炯, 等. MapReduce能耗建模及优化分析[J]. 计算机研究与发展, 2016, 53(9): 2107-2131. (LIAO B, ZHANG T, YU J, et al. Energy consumption modeling and optimization analysis for MapReduce[J]. Journal of Computer Research and Development, 2016, 53(9): 2107-2131. DOI:10.7544/issn1000-1239.2016.20148443) |
[6] | 廖彬, 于炯, 张陶, 等. 基于分布式文件系统HDFS的节能算法[J]. 计算机学报, 2013, 36(5): 1047-1064. (LIAO B, YU J, ZHANG T, et al. Energy-efficient algorithms for distributed file system HDFS[J]. Chinese Journal of Computers, 2013, 36(5): 1047-1064.) |
[7] | 张陶, 于炯, 廖彬, 等. 基于GraphX的传球网络构建及分析研究[J]. 计算机研究与发展, 2016, 53(12): 2729-2752. (ZHANG T, YU J, LIAO B, et al. The construction and analysis of pass network graph based on GraphX[J]. Journal of Computer Research and Development, 2016, 53(12): 2729-2752. DOI:10.7544/issn1000-1239.2016.20160568) |
[8] | 宋杰, 刘雪冰, 朱志良, 等. 一种能效优化的MapReduce资源比模型[J]. 计算机学报, 2015, 38(1): 59-73. (SONG J, LIU X B, ZHU Z L, et al. An energy-efficiency optimized resource ratio model for MapReduce[J]. Chinese Journal of Computers, 2015, 38(1): 59-73.) |
[9] | 廖彬, 张陶, 于炯, 等. 温度感知的MapReduce节能任务调度策略[J]. 通信学报, 2016, 37(1): 61-75. (LIAO B, ZHANG T, YU J, et al. Temperature aware energy-efficient task scheduling strategies for MapReduce[J]. Journal on Communications, 2016, 37(1): 61-75. DOI:10.11959/j.issn.1000-436x.2016008) |
[10] | 廖彬, 张陶, 于炯, 等. 适应节能与异构环境的MapReduce数据布局策略[J]. 中山大学学报(自然科学版), 2015, 54(6): 55-66. (LIAO B, ZHANG T, YU J, et al. An energy-efficient and heterogeneous environment adaptive data layout strategy for MapReduce[J]. Acta Scientiarum Naturalium Universitatis Sunyatseni, 2015, 54(6): 55-66.) |
[11] | 杨兴耀, 于炯, 吐尔根·依布拉音, 等. 融合奇异性和扩散过程的协同过滤模型[J]. 软件学报, 2013, 24(8): 1868-1884. (YANG X Y, YU J, IBRAHIM T, et al. Collaborative filtering model fusing singularity and diffusion process[J]. Journal of Software, 2013, 24(8): 1868-1884.) |
[12] | GHAUTH K I, ABDULLAH N A. Learning materials recommendation using good learners' ratings and content-based filtering[J]. Educational Technology Research and Development, 2010, 58(6): 711-727. DOI:10.1007/s11423-010-9155-4 |
[13] | UDDIN M N, SHRESTHA J, JO G S. Enhanced content-based filtering using diverse collaborative prediction for movie recommendation[C]//Proceedings of the 1st Asian Conference on Intelligent Information and Database Systems. Piscataway, NJ:IEEE, 2009:132-137. |
[14] | NGUYEN A T, DENOS N, BERRUT C. Improving new user recommendations with rule-based induction on cold user data[C]//Proceedings of the 2007 ACM Conference on Recommender Systems. New York:ACM, 2007:121-128. |
[15] | CHUN J, OH J Y, KWON S, et al. Simulating the effectiveness of using association rules for recommendation systems[C]//Proceedings of the 2005 Systems Modeling and Simulation:Theory and Applications. Berlin:Springer, 2005:306-314. |
[16] | QIU L Y, BENBASAT I. A study of demographic embodiments of product recommendation agents in electronic commerce[J]. International Journal of Human-Computer Studies, 2010, 68(10): 669-688. DOI:10.1016/j.ijhcs.2010.05.005 |
[17] | CHEN T, HE L. Collaborative filtering based on demographic attribute vector[C]//Proceedings of the 2009 ETP International Conference on Future Computer and Communication. Piscataway, NJ:IEEE, 2009:225-229. |
[18] | JIA C X, LIU R R, SUN D, et al. A new weighting method in network-based recommendation[J]. Physica A-Statistical Mechanics and Its Applications, 2008, 387(23): 5887-5891. DOI:10.1016/j.physa.2008.06.046 |
[19] | ZHOU T, REN J, MEDO M, et al. Bipartite network projection and personal recommendation[J]. Physical Review E, 2007, 76(4): 1-7. |
[20] | LIU Z B, QU W Y, LI H T, et al. A hybrid collaborative filtering recommendation mechanism for P2P networks[J]. Future Generation Computer Systems, 2010, 26(8): 1409-1417. DOI:10.1016/j.future.2010.04.002 |
[21] | ZHAO Z D, SHANG M S. User-based collaborative-filtering recommendation algorithms on Hadoop[C]//Proceedings of the 2010 International Conference on Knowledge Discovery and Data Mining. Piscataway, NJ:IEEE, 2010:478-481. |
[22] | MA M M, WANG S P. Research of user-based collaborative filtering recommendation algorithm based on Hadoop[C]//Proceedings of the 2015 International Conference on Computer Information Systems and Industrial Applications. Amsterdam:Atlantis Press, 2015:63-66. |
[23] | SCHELTER S, BODEN C, MARKL V. Scalable similarity-based neighborhood methods with MapReduce[C]//Proceedings of the 2012 ACM Conference on Recommender Systems. New York:ACM, 2012:163-170. |
[24] | DAS A S, DATAR M, GARG A, et al. Google news personalization:scalable online collaborative filtering[C]//Proceedings of the 2007 International Conference on World Wide Web. New York:ACM, 2007:271-280. |
[25] | JIANG J, LU J, ZHANG G, et al. Scaling-up item-based collaborative filtering recommendation algorithm based on Hadoop[C]//Proceedings of the 2011 IEEE World Congress on Services. Piscataway, NJ:IEEE, 2011:490-497. |