数据仓库与数据挖掘实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据仓库与数据挖掘课程APRIORI算法学习
一简介
Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。而且算法已经被广泛的应用到商业、网络安全等各个领域。它是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集[1]。
二基本思想
该算法的基本思想是:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递归的方法。挖掘步骤:
(1) 依据支持度[2]找出所有频繁项集(频度)。
(2) 依据置信度[3]产生关联规则(强度)。
三核心流程
Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。是基于这样的事实:算法使用频繁项集性质的先验知识。Apriori使用一种称作逐层搜索的迭代方法,k-项集用于探索(k+1)-项集。首先,找出频繁1-项集的集合。该集合记作L1。L1用于找频繁2-项集的集合L2,而L2用于找L3,如此下去,直到不能找到频繁k-项集。找每个Lk需要一次数据库扫描。
这个算法的思路,简单的说就是如果集合I不是频繁项集,那么所有包含集
T400
T500
T600
T700
T800
T900
I1,I2,I4
I1,I3
I2,I3
I1,I3
I1,I2,I3,I5
I1,I2,I3
算法的基本过程如下图:
首先扫描所有事务,得到1-项集C1,根据支持度要求滤去不满足条件项集,得到频繁1-项集。
下面进行递归运算:
已知频繁k-项集(频繁1-项集已知),根据频繁k-项集中的项,连接得到所有可能的K+1_项,并进行剪枝(如果该k+1_项集的所有k项子集不都能满足支持度条件,那么该k+1_项集被剪掉),得到1+k
C项集,然后滤去该
1+
k
C项集中不满
足支持度条件的项得到频繁k+1-项集。如果得到的
1
k C 项集为空,则算法结束。
连接的方法:假设k
L 项集中的所有项都是按照相同的顺序排列的,那么如
果
]
[i k L 和
]
[j k L 中的前k-1项都是完全相同的,而第k 项不同,则]
[i k L 和
]
[j k L 是可连
接的。比如2L 中的{I1,I2}和{I1,I3}就是可连接的,连接之后得到{I1,I2,I3},但是{I1,I2}和{I2,I3}是不可连接的,否则将导致项集中出现重复项。
关于剪枝再举例说明一下,如在由2L 生成
3
L 的过程中,列举得到的3_项集
包括{I1,I2,I3},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5},但是由于{I3,I4}和{I4,I5}没有出现在2L 中,所以{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}被剪枝掉了。
简单的讲:
发现频繁项集,过程为(1)扫描(2)计数(3)比较(4)产生频繁项集(5)连接、剪枝,产生候选项集。重复步骤(1)~(5)直到不能发现更大的频集。
2、产生关联规则,过程为:根据前面提到的置信度的定义,关联规则的产生如下:
(1)对于每个频繁项集L ,产生L 的所有非空子集; (2)对于L 的每个非空子集S ,如果 P (L )/P (S )≧min_conf 则输出规则“S àL-S ”
注:L-S 表示在项集L 中除去S 子集的项集 伪代码 伪代码描述: // 找出频繁 1 项集
L1 =find_frequent_1-itemsets(D);
For(k=2;Lk-1 !=null;k++){
// 产生候选,并剪枝
Ck =apriori_gen(Lk-1 );
// 扫描 D 进行候选计数
For each 事务t in D{
Ct =subset(Ck,t); // 得到 t 的子集 For each 候选 c 属于 Ct c.count++; }
//返回候选项集中不小于最小支持度的项集
Lk ={c 属于 Ck | c.count>=min_sup}
}
Return L= 所有的频繁集;
第一步:连接(join)
Procedure apriori_gen (Lk-1 :frequent(k-1)-itemsets)
For each 项集l1 属于Lk-1
For each 项集l2 属于Lk-1
If( (l1 [1]=l2 [1])&&( l1 [2]=l2 [2])&& ……&& (l1 [k-2]=l2 [k-2])&&(l1 [k-1] then{ c = l1 连接l2 // 连接步:产生候选 //若k-1项集中已经存在子集c则进行剪枝 if has_infrequent_subset(c, Lk-1 ) then delete c; // 剪枝步:删除非频繁候选 else add c to Ck; } Return Ck; 第二步:剪枝(prune) Procedure has_infrequent_sub (c:candidate k-itemset; Lk-1 :frequent(k-1)-itemsets) For each (k-1)-subset s of c If s 不属于Lk-1 then Return true; Return false; 四具体实例及代码实现 交易ID 商品ID列表 T100 I1,I2,I5 T200 I2,I4 T300 I2,I3 T400 I1,I2,I4 T500 I1,I3 T600 I2,I3 T700 I1,I3 T800 I1,I2,I3,I5 T900 I1,I2,I3 上图为某商场的交易记录,共有9个事务,利用Apriori算法寻找所有的频繁项集的过程如下: