Apriori算法在大数据集上的高效应用

来源 :智能计算机与应用 | 被引量 : 0次 | 上传用户:BNBNBN668
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:Apriori算法是经典的挖掘频繁项集和关联规则的数据挖掘算法。本文通过实例使用Python语言将Apriori算法用到电影推荐上,从大量电影打分数据形成的大数据集中找到可用于电影推荐的关联规则。整个过程由两个阶段构成,先借助Apriori算法寻找数据中的频繁项集,然后根据找到的频繁项集,生成关联规则。由此算法得到结果更高效、快捷、灵活,也取得了良好的电影推荐效果。同时也为下一步针对Apriori算法的改进及更大范围的应用提供了方向,具有较大的应用价值。
  关键词:Apriori算法; 数据挖掘; 电影推荐; 大数据集
  Abstract: Apriori algorithm is a classical data mining algorithm for mining frequent itemsets and association rules. This article uses Python language to apply Apriori algorithm to movie recommendations. It can be used for movie recommendation from large data sets formed by a large number of movie scoring data, and association rules are given out. The whole process is divided into two major stages. First, the Apriori algorithm is used to find frequent itemsets in the data. Then, based on the found frequent itemsets, an association rule is generated. The result of this algorithm is more efficient, faster, and more flexible. It also achieves good movie recommendations. At the same time, it also provides direction for the improvement of the Apriori algorithm and a wider range of applications in the next step, and has great application value.
  Key words: Apriori algorithm; data mining; movie recommendation; large data set
  引言
  產品推荐是一项在大数据集中进行应用的重要技术。如网上商店经常基于此来向潜在用户推荐潜在的产品。 而一个好的建议算法可以带来更高的销售业绩,据统计每年至少有上亿用户网上购买,通过向人们推荐更多产品,有着更为可观的潜在收益。
  本文中Apriori算法是通过数据集中频繁出现的数据中选取共同出现的数据组成频繁项集(frequent itemset),避免了出现因复杂度呈指数级增长的问题。一旦找到频繁项集,生成关联规则就很容易了。近年来,如何高效的处理大数据集并从中获取有价值的信息一直是一个焦点问题,而本文通过实例就Apriori算法如何高效的应用在大数据集中展开研究。
  1 相关介绍
  1.1 Apriori算法简述
  Apriori算法背后的原理简洁却不失巧妙。首先,确保了规则在数据集中有足够的支持度。Apriori算法的一个重要参数就是最小支持度。比如,要生成包含商品A、B的频繁项集(A, B),要求支持度至少为30,那么A和B都必须至少在数据集中出现30次。更大的频繁项集也要遵守该项约定,比如要生成频繁项集(A, B, C, D),那么子集(A, B, C)必须是频繁项集(当然D也要满足最小支持度标准)。生成频繁项集后,将不再考虑其它可能的却不够频繁的项集(这样的集合有很多),从而大大减少测试新规则所需的时间。
  1.2 选择参数
  挖掘亲和性分析所用的关联规则之前,先用Apriori算法生成频繁项集。接着,通过检测频繁项集中前提和结论的组合,生成关联规则(例如,如果用户喜欢电影X,那么该用户很可能喜欢电影Y)。
  首先,需要为Apriori算法指定一个项集成为频繁项集所需的最小支持度,任何小于最小支持度的项集将不再考虑。如果最小支持度值过小,Apriori算法要检测大量的项集,会拖慢运行速度;最小支持度值过大的话,则只有很少的频繁项集。
  找出频繁项集后,根据置信度选取关联规则。可以设定最小置信度,返回一部分规则,或者返回所有规则,让用户自己选。本文中设定最小置信度,只返回高于其规则。置信度过低将会导致规则支持度高,正确率低;置信度过高,导致正确率高,但是返回的规则少。
  2 算法应用
  2.1 获取数据集
  在网上下载包含100万条数据的MovieLens数据集。在IPython Notebook笔记本,输入以下代码:
  import os
  import pandas as pd
  data_folder = os.path.join(os.path.expanduser("~"),"Data","m1-100k")
  ratings_filename=os.path.join(data_folder."u.data")
  2.2 用 pandas 加载数据   MovieLens数据集非常规整,但是有几点跟 pandas.read_csv 方法的默认设置有出入,所以要调整参数设置。数据集每行的几个数据之间用制表符而不是逗号分隔。其次,没有表头,这表示数据集的第一行就是数据部分。
  加载数据集时,把分隔符设置为制表符,告诉pandas不要把第一行作为表头( header=None ),设置好各列的名称。解析时间戳数据如下:
  all_ratings=pd.read_csv(ratings_filename,delimiter="\\t",
  header=None,names=["UserID","MovieID","Rating", Datetime])
  all_ratings["Datetime"]=pd.to_datetime(all-ratings[’Date time’], unit=’s’)
  all_ratings[:5]
  这是一个稀疏数据集,可以将每一行想象成巨大特征矩阵的一个格子,在这个矩阵中,每一行表示一个用户,每一列为一部电影。第一列为每位用户给第一部电影打的分数,第二列为每位用户给第二部电影打的分数,以此类推。
  数据集中有1 000名用户和1 700部电影,这就意味着整个矩阵很大。将矩阵读到内存中及在其基础上进行计算可能存在难度。然而,这个矩阵的很多格子都是空的,也就是对大部分用户来说,人们只给少数几部电影打过分。比如用户#213没有为电影#675打过分。用表1中的格式也能表示矩阵,且更为紧凑。序号为0的那一行表示,用户#196为电影#242打了3分(满分是5分)。
  任何没有出现在数据集中的用户和电影组合表示自己实际上是不存在的。这比起在内存中保存大量的0,节省了很多空间。这种格式叫作稀疏矩阵(sparse matrix)。根据经验,如果数据集中60%或以上的数据为0,就应该考虑使用稀疏矩阵,从而节省空间。
  在对稀疏矩阵进行计算时,关注的通常不是那些不存在的数据,不会去比较众多的0值,相反关注的是现有数据,并对其进行比较。
  3 算法的实现及结果分析
  本文中算法实现的目标是生成如下形式的规则:如果用户喜欢某些电影,那么该用户也会喜欢这部电影。作为对上述规则的扩展,还将讨论喜欢某几部电影的用户,是否喜欢另一部电影。为此创建新特征 Favorable ,若用户喜欢该电影,值为 True 。
  在数据集中看一下这个新特征。all_ratings[10:15],得出结果见表2。
  从数据集中选取一部分数据用作训练集,这能有效减少搜索空间,提升Apriori算法的速度。接下来,新建一个数据集,只包括用户喜欢某部电影的数据行。在生成项集时,需要知道每个用户各喜欢哪些电影,按照User ID进行分组,并遍历每个用户看过的每一部电影。
  favorable_reviews_by_users=dict((k,frozenset(v.values))
  for k,v in favorable_ratings
  groupby("UserID")["MovieID"])
  上面把 v.values 存储为 frozenset ,便于快速判断用户是否为某部电影打过分。对于这种操作,集合比列表速度快,在后面还会用到。最后,创建一个数据框,以便了解每部电影的影迷数量。查看最受欢迎的5部电影, 输出结果见表3。
  3.1 Apriori算法过程
  Apriori算法是亲和性分析的一部分,专门用于查找数据集中的频繁项集。基本流程是从前一步找到的频繁项集中找到新的备选集合,接着检测备选集合的频繁程度是否够高,算法迭代步骤如下:
  (1)把各项目放到只包含自己的项集中,生成最初的频繁项集。只使用达到最小支持度的项目。
  (2)查找现有频繁项集的超集,发现新的频繁项集,并用其生成新的备选项集。
  (3)测试新生成的备选项集的频繁程度,如果不够频繁,则舍弃。如果没有新的频繁项集,跳到最后一步。
  (4)存储新发现的频繁项集,返回步骤(2)。
  (5)返回发现的所有频繁项集。
  整个过程如图1所示。
  3.2 算法实现
  Apriori算法在进行第一次迭代后,可以找到的项集长度为2,是步骤(1)中创建的项集的超集。第二次迭代(经过步骤(4))中,新发现的项集长度为3。这有助于快速识别步骤(2)所需的项集。把发现的频繁项集保存到以项集长度为键的字典中,便于根据长度查找,这样就可以找到最新发现的频繁项集。下面的代码初始化一个字典。
  还需要确定项集要成为频繁项集所需的最小支持度。這个值需要根据数据集的具体情况来设定,可自行尝试其它值,建议每次仅改动10个百分点,即使这样也会使算法运行时间变动很大!设置最小支持度。
  先来实现Apriori算法的第一步,为每一部电影生成只包含其自己的项集,检测其是否够频繁。电影编号使用 frozenset。此外,也可以用作字典的键(普通集合不可以)。
  接着,用一个函数来实现步骤(2)和(3),其接收新发现的频繁项集,创建超集,检测频繁程度。通过函数声明及字典初始化代码。
  通过以往数据结果,要尽量减少遍历数据的次数,因此每次调用函数时,再遍历数据。这样做效果不是很明显(因为数据集相对较小),但是数据集较大的情况下,就很有必要。
  接下来,以确定当前评分项集的子集为判断的依据来遍历之前找到的项集。 如果是,则表示用户已经评过了子集中的电影;遍历用户已评过但不出现在项目集中的影片,使用其来生成超集并更新项目集的计数。   函数最后检测达到支持度要求的项集,判断频繁程度是否满足,并返回其中的频繁项集。创建循环,运行Apriori算法,存储算法运行过程中发现的新项集。循环体中,k表示即将发现的频繁项集的长度,用键k1可以从 frequent_itemsets 字典中获取刚发现的频繁项集。新发现的频繁项集以长度为键,将其保存到字典中。如果在上述循环中没能找到任何新的频繁项集,就跳出循环(输出信息,告知没能找到长度为k的频繁项集)
  如果找到频繁项集,程序输出信息,告知会再次运行。因为算法运行时间很长,所以每隔一段时间输出一下状态是很有必要的。最后,循环结束,对只有一个元素的项集不再保留,删除长度为1的项集。
  最后返回了不同长度的1 718个频繁项集。会发现随着项集长度的增加,项集数随着可用规则的增加而增长一段时间后才开始变少,减少是因为项集达不到最低支持度要求。项集的减少是Apriori算法的优点之一。如果搜索所有可能的项集(不只是频繁项集的超集),判断多余项集的频繁程度需要成千上万次查询。
  3.3 抽取关联规则
  Apriori算法结束后,得到了一系列频繁项集,这还不是真正意义上的关联规则,。频繁项集是一组达到最小支持度的项目,而关联规则由前提和结论组成。可以从频繁项集中抽取出关联规则,把其中几部电影作为前提,另一部电影作为结论组成如下形式的规则:如果用户喜欢前提中的所有电影,那么也会喜欢结论中的电影。
  每一个项集都可用这种方式生成一条规则。通过遍历不同长度的频繁项集,为每个项集生成规则。然后,遍历项集中的每一部电影,把其作为结论。项集中的其它电影作为前提,用前提和结论组成备选规则。这样就能得到大量备选规则。
  通过查看前5条规则。得出如下结果:
  [(frozenset({79}), 258), (frozenset({258}), 79), (frozenset({50}), 64), (frozenset({64}), 50), (frozenset({127}), 181)]
  在上述这些规则中,第一部分( frozenset )是作为规则前提的电影编号,后面的数字表示作为结论的电影编号。第一组数据表示如果用户喜欢电影79,那很可能喜欢电影258。接下来,计算每条规则的置信度。需要先创建2个字典,用来存储规则应验(正例)和规则不适用(反例)的次数。代码如下:
  correct_counts = defaultdict(int);incorrect_counts = defaultdict(int)
  遍历所有用户及其喜欢的电影数据,在这个过程中遍历每条关联规则。测试每条规则的前提对用户是否适用。如果前提符合,看一下用户是否喜欢结论中的电影。如果是的话,规则适用,反之,规则不适用。用规则应验的次数除以前提条件出现的总次数,计算每条规则的置信度。结果如下:
  3.4 评估分析
  首先,抽取所有没有用于训练的数据作为测试集。训练集采用前200名用户的打分数据,其余作为测试集的数据。就训练集来说,会为该数据集中的每一位用户获取最喜欢的电影。,方法跟之前相似。唯一的不同就是这次使用的是测试数据而不是训练数据。接下来,计算所有应验规则的置信度。最后输出用电影名称而不是电影编号表示的最佳关联规则。代码如下:
  从以上实验结果的数据中可以得出,基于第二条规则,在训练集中置信度为1,但在测试集上正确率只有60%。但前10条规则中,其它几条规则在测试集上置信度也很高,所以实验结果表明用Apriori算法来推荐电影效果不错。
  4 结束语
  本文把亲和性分析中的Apriori算法用到电影推荐上,从大量电影打分数据中找到可用于电影推荐的关联规则。借助Apriori算法寻找数据中的频繁项集。不难看出,在数据挖掘中:虽然解决该问题可以用一些更笨的方法如层次分析法,但通过该算法较大的改善了由于时间复杂度呈指数级增长出现的问题。不过该算法离大规模数据集中的应用仍需要较大的改进,所以进一步的研究方向将会放在如何在更小的时间复杂度内更好提升Apriori算法的精度。同时已存在的较大改进空间及应用范围,如结合 Apriori的性质,提出的VGApriori(Vector-Graph Apriori) 算法是基于位向量和无向图的或基于数据库及其属性列DPApriori-N算法。
  参考文献
  [1] HAN J W,KAMBER M,PEI J. 数据挖掘: 概念与技术[M]. 3版. 范明, 孟小峰, 译.北京: 机械工业出版社, 2012.
  [2] AGRAWAL R, IMIELINSKI T, SWAMI A. Mining association rules between sets of items in very large databases[C]//Proceedings of the ACM SIGMOD Conference on Management of Data. Washington D C, USA: ACM, 1993: 207-216.
  [3] 刘独玉, 杨晋浩, 钟守铭. 关联规則挖掘研究综述[J]. 成都大学学报: 自然科学版, 2006, 25(1): 54-58.
  [4] HILLS J, BAGNALL A, IGLESIA B D L, et al. BruteSuppression:A size reduction method for Apriori rule sets [J]. Journal of Intelligent Information Systems, 2013,40(3) : 431-454.
  [5] 张宗郁, 张亚平, 张静远,等. 改进关联规则算法在高校教学管理中的应用[J]. 计 算 机 工 程, 2012, 38(2): 75-77,81.
  [6] 胡志伟. 增量关联规则算法在手机病毒挖掘中的应用研究与实现[D]. 北京:北京邮电大学, 2012.
  [7] 邵佳炜. 基于关联矩阵和学习自动机的电影推荐研究[J]. 电脑知识与技术 , 2012, 8(8): 1721-1722.
其他文献
【摘 要】语言是一门艺术,在教育教学活动中,发挥好语言这门艺术,能够有效提高学生参与课堂活动的积极性,营造轻松有趣的学习氛围,对此,教师要做好准备工作,并注重和学生进行课堂沟通,以提高学生和教师、同学互动的动力。对此,本文将结合实际,对小学语文教学师生互动中的话语沟通重要性及相关策略展开简要论述。  【关键词】小学语文;师生互动;话语沟通   语言是搭建师生沟通的桥梁,富有启发性、情感性、趣味性、
摘要:随着计算机科学的迅猛发展和推广,各行各业以及人们日常生活越来越依赖计算机和互联网。在应用广泛的同时,其安全性和稳定性也越来越被人们所重视。而大家关注的焦点又是数据的安全性,故而数据备份手段成为热点问题。目前,解决这一问题的最有效手段就是双机热备份技术。  关键词:双机热备份; 廉价冗余磁盘阵列; 心跳线  中图分类号:TP309.1 文献标识码:A 文章编号:2095-2163(2013)0
以水稻Ⅱ优3027(耐铝基因型)和红良优166(铝敏感基因型)为材料,采用悬空培养法,在根尖附着和移除边缘细胞(root border cell,RBCs)条件下,比较研究水稻生长、根尖铝含量和细胞壁组
一、从对《小学生日常行为规范》和《小学生守则》的学习为切入点,开启基础性养成教育  由于小学生年龄小,缺乏是非明辨能力,很有必要先让学生进行熟记、理解规范条文的训练,利用晨检时间和班会课指导学生进行学习,定期指导学生理解贴在墙上的《小学生日常行为规范》和《小学生守则》,并人手一份,让学生拿回家,让家长指导、训练、督促学生执行行为规范。开展有针对性的行为训练,如“不骂人,不打架”“在操场楼道不乱跑”
本文在分析软件职业技术人才计算机专业基础培养特点基础上,以离散数学课程为例,研究了理论教学、相关应用、计算机上的实现三阶段渐进进行教学方法各阶段的教学内容与方法以
针对高等医学院校解剖实验教学中存在的问题,改善在校医学生的解剖实验教学,提高解剖学实验教学质量。建设数字化的解剖实验教学系统,将分割和三维重建技术用到该系统中,采用C#和VTK编程实现图像的处理算法和操作界面,使医学生能够立体、直观、动态地学习解剖学知识,训练解剖技能。
目的分析新型冠状病毒肺炎疫情期间社区预防接种情况,探索新冠肺炎期间基层医疗卫生机构预防接种工作策略,为完善重大疫情下日常预防接种工作提供决策依据。方法选取观澜街道
儒家孝观念表现为养亲、敬亲、谏亲、慎终、追远、全体、贵生。儒家孝观念对提升个人品德素质,维护家庭内部和谐,促进社会、国家进步有重要作用。但其中"愚孝"等落后思想会阻