今日数据挖掘课学习了Apriori算法,特意总结下,因为自己是大三弱鸡,很多地方参考了下面dalao的博文
https://blog.csdn.net/baimafujinji/article/details/53456931
非常感谢!
Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。而且算法已经被广泛的应用到商业、网络安全等各个领域。
许多商业企业在日复一日的运营中积聚了大量的交易数据。例如,超市的收银台每天都收集大量的顾客购物数据。例如,下表给出了一个这种数据集的例子,我们通常称其为购物篮交易(market basket transaction)。表中每一行对应一个交易,包含一个唯一标识TID和特定顾客购买的商品集合。零售商对分析这些数据很感兴趣,以便了解其顾客的购买行为。可以使用这种有价值的信息来支持各种商业中的实际应用,如市场促销,库存管理和顾客关系管理等等。
令I={i1,i2,⋯,id}是购物篮数据中所有项的集合,而T={t1,t2,⋯,tN}是所有交易的集合。包含0个或多个项的集合被称为项集(itemset)。如果一个项集包含k个项,则称它为 k-项集。显然,每个交易ti包含的项集都是I的子集。
关联规则是形如X→Y的蕴涵式,其中且, X和Y分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后继(consequent或right-hand-side, RHS) 。其中X和Y是不相交的项集,即 X∩Y=∅。关联规则的强度可以用它的支持度(support)和置信度(confidence)来度量。支持度确定规则可以用于给定数据集的频繁程度,而置信度确定Y在包含X的交易中出现的频繁程度。支持度(s)和置信度(c)这两种度量的形式定义如下:
例如考虑规则{Milk, Diaper}→→{Beer},则易得
强规则:同时满足最小支持度阈值和最小置信度阈值的规则。
频繁项集:满足最小支持度阈值的项集。
所以一般来说,排除空集后,一个包含k个项的数据集可能产生2^k−1个频繁项集。在这发现搜索频繁项集的规模是指数级别。普通的模式匹配算法(BF)计算将非常复杂,所以下面将提及一种新的算法也就Apriori算法
Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然后利用L1找频繁2项集的集合L2,L2找L3,如此下去,直到不能再找到任何频繁k项集。最后再在所有的频繁集中找出强规则,即产生用户感兴趣的关联规则。
1. 单趟扫描数据库D;计算出各个1项集的支持度,得到频繁1项集的集合,即L1。
2. 从2项集开始循环,由频繁k-1项集生成频繁频繁k项集。
2.1 连接
2.2 剪枝
2.3 扫描数据库,计算2.3步中过滤后的k项集的支持度,舍弃掉支持度小于阈值的项集,生成频繁k项集。
3. 当当前生成的频繁k项集中只有一个项集时循环结束
在剪枝的步骤中采用Apriori中两个定律进行剪枝
Apriori定律1:如果一个集合是频繁项集,则它的所有子集都是频繁项集。
例如:假设一个集合{A,B}是频繁项集,即A、B同时出现在一条记录的次数大于等于最小支持度min_support,则它的子集{A},{B}出现次数必定大于等于min_support,即它的子集都是频繁项集。
Apriori定律2:如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。
举例:假设集合{A}不是频繁项集,即A出现的次数小于 min_support,则它的任何超集如{A,B}出现的次数必定小于min_support,因此其超集必定也不是频繁项集。
最开始数据库里有4条交易,{A、C、D},{B、C、E},{A、B、C、E},{B、E},使用min_support=2作为支持度阈值,最后我们筛选出来的频繁集为{B、C、E}
自己分析:
1.首先扫描1项集,将低于min_support的删去得到L1
2.L1的基础上进行连接操作实质形成2项集,即C2
3.在C2上做第二次扫描得到每一项的相应的支持度
4.然后做剪枝操作得到相应的L2,删除掉了{A,B},{B,E}还是因为它们的支持度小于min_support
5.在L2上做连接操作,其中只能BCE,那么为什么不能得到ABC、ACE这两个呢?其实观察ABC(含有AB)、ACE含有(AE),而AB、AE已在C2剪枝中小于min_support舍弃掉了
6.再次扫描数据库得到相应的支持度
最后我们可以根据结果写出关联规则,而根据经验将选取这些关联规则中支持度较小,可信度较高的
(1)由频繁k-1项集进行自连接生成的候选频繁k项集数量巨大。(2)在验证候选频繁k项集的时候需要对整个数据库进行扫描,非常耗时。
(1)hash(2)FP-Tree(3)层次划分(即将精细的划分,进行泛化),比如将全脂牛奶等不同很精细的牛奶泛化为牛奶,全麦面包等精细的种类面包泛化为面包,当然这要考虑实际情况。
还有很多方法就不一一提及了,毕竟自己还是个弱鸡!