一、 关联规则
1、所谓关联,反映的是一个事件与其他事件之间的依赖或关联的信息。
有两个英文词relevance(相关性),association(关联性)
2、关联规则就是形如XY(X–>Y)的逻辑蕴含关系,其中XI,YI且XY=Φ,X称作规则的前件,Y是结果,对于关联规则XY,存在支持度和信任度。(通俗来讲:两个不相交的非空集合X、Y,如果有X–>Y,就说X–>Y是一条关联规则)
二、项集、事务、频繁项集
1、设I={i1,i2…,im}为所有项目的集合,设A是一个由项目构成的集合,称为项集。事务T是一个项目子集,每一个事务具有唯一的事务标识Tid。事务T包含项集A,当且仅当AT(A–>T蕴含关系)。如果项集A中包含k个项目,则称其为k项集。D为事务数据库,项集A在事务数据库D中出现的次数占D中总事务的百分比叫做项集的支持度(support)。如果项集的支持度超过用户给定的最小支持度阈值,就称该项集是频繁项集(或大项集)。
2、上面的概念太抽象,下面用一个例子来说明:啤酒与尿布的故事
所有项目的集合I:
itemid | item |
---|---|
I1 | 牛奶 |
I2 | 面包 |
I3 | 尿布 |
I4 | 啤酒 |
I5 | 鸡蛋 |
I6 | 可乐 |
事物的集合D
Tid | Things |
---|---|
T1 | {牛奶,面包} |
T2 | {面包,尿布,啤酒,鸡蛋} |
T3 | {牛奶,尿布,啤酒,可乐} |
T4 | {面包,牛奶,尿布,啤酒} |
T5 | {面包,牛奶,尿布,可乐} |
表中的每一行代表一次购买清单(注意你购买十盒牛奶也只计一次,即只记录某个商品的出现与否)。数据记录的所有项的集合称为总项集,上表中的总项集I={牛奶,面包,尿布,啤酒,鸡蛋,可乐}。
支持度:support({啤酒}–>{尿布}) = 啤酒和尿布同时出现的次数/数据记录数 = 3/5=60%。
信任度:confidence({啤酒}–>{尿布}) = 啤酒和尿布同时出现的次数/啤酒出现的次数=3/3=100%;confidence({尿布}–>{啤酒}) = 啤酒和尿布同时出现的次数/尿布出现的次数 = 3/4 = 75%。
这里定义的支持度和自信度都是相对的支持度和自信度,不是绝对支持度,绝对支持度abs_support = 数据记录数N*support。
支持度和自信度越高,说明规则越强,关联规则挖掘就是挖掘出满足一定强度的规则。
三、支持度、信任度
1、支持度:是指规则中所出现模式的频率,如果事务数据库有s%的事务包含XY,则称关联规则XY在D中的支持度为s%,实际上,可以表示为概率P(XY),即support(XY)= P(XY)。(集合X与集合Y中的项在一条记录中同时出现的次数/数据记录的个数。)
2、信任度:是指蕴含的强度亦称置信度,即事务D中c%的包含X的交易同时包含XY。若X的支持度是support(x),规则的信任度为即为:support(XY)/support(X),这是一个条件概率P(Y|X),即confidence(XY)= P(Y|X)。(集合X与集合Y中的项在一条记录中同时出现的次数/集合X出现的个数)
四、关联规则挖掘的定义与步骤
关联规则的挖掘定义:给定一个交易数据集T,找出其中所有的支持度support>=mini_support,信任度confidence>=mini_confiedence的关联规则。
有一个简单而粗鲁的方法可以找出所需要的规则,那就是穷举项集的所有组合,并测试每个组合是否满足条件,一个元素个数为n的项集的组合个数为2^n-1(除去空集),所需要的时间复杂度明显为O(2^N),对于普通的超市,其商品的项集数也在1万以上,用指数时间复杂度的算法不能在可接受的时间内解决问题。怎样快速挖出满足条件的关联规则是关联挖掘的需要解决的主要问题。
仔细想一下,我们会发现对于{啤酒–>尿布},{尿布–>啤酒}这两个规则的支持度实际上只需要计算{尿布,啤酒}的支持度,即它们交集的支持度。于是我们把关联规则挖掘分两步进行:
1)生成频繁项集
这一阶段找出所有满足最小支持度的项集,找出的这些项集称为频繁项集。
2)生成规则
在上一步产生的频繁项集的基础上生成满足最小自信度的规则,产生的规则称为强规则。
关联规则挖掘所花费的时间主要是在生成频繁项集上,因为找出的频繁项集往往不会很多,利用频繁项集生成规则也就不会花太多的时间,而生成频繁项集需要测试很多的备选项集,如果不加优化,所需的时间是O(2^N)。
五、Apriori定律
为了减少频繁项集的生成时间,我们应该尽早的消除一些完全不可能是频繁项集的集合,Apriori的两条定律就是干这事的。
Apriori定律1):如果一个集合是频繁项集,则它的所有子集都是频繁项集。举例:假设一个集合{A,B}是频繁项集,即A、B同时出现在一条记录的次数大于等于最小支持度min_support,则它的子集{A},{B}出现次数必定大于等于min_support,即它的子集都是频繁项集。
Apriori定律2):如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。举例:假设集合{A}不是频繁项集,即A出现的次数小于min_support,则它的任何超集如{A,B}出现的次数必定小于min_support,因此其超集必定也不是频繁项集。
利用这两条定律,我们抛掉很多的候选项集,Apriori算法就是利用这两个定理来实现快速挖掘频繁项集的。对于mini_support,mini_confiedence的确定,都是实际经验来确定,并没有相关的算法来确定(猜测)
六、算法设计思想:
Apriori是由a priori合并而来的,它的意思是后面的是在前面的基础上推出来的,即先验推导,怎么个先验法,其实就是二级频繁项集是在一级频繁项集的基础上产生的,三级频繁项集是在二级频繁项集的基础上产生的,以此类推。
Apriori算法属于候选消除算法,是一个生成候选集、消除不满足条件的候选集、并不断循环直到不再产生候选集的过程。
上面的图演示了Apriori算法的过程,这里的mini_support使用的是绝对支持度。注意看由二级频繁项集生成三级候选项集时,没有{牛奶,面包,啤酒},那是因为{面包,啤酒}不是二级频繁项集,这里利用了Apriori定理。最后生成三级频繁项集后,没有更高一级的候选项集,因此整个算法结束,{牛奶,面包,尿布}是最大频繁子集。