数据挖掘十大经典算法之Apriori算法
概述
Apriori是关联规则模型中的经典算法,是由R.Agrawal和R.Srikant于1994年提出的为布尔关联规则挖掘频繁项集的原创性算法。Apriori使用一种称作逐层搜索的迭代方法,k项集用于搜索k+1项集。该算法主要用于在交易数据、关联数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联性或因果结构。
重要概念
- N项集
表示由N个元素组成的元素集合(N为大于0的整数) - N项集的支持度
表示在所有样本中,能够匹配特定N项集要求的样本数量,它也可以表示成百分比的形式。 - 频繁N项集(L[n])
表示满足指定的最小支持度的所有N项集 - 候选N项集(C[n])
它由频繁N-1项集L[n-1]生成,是计算频繁N项集的基础。C[n]必须保证包括所有的频繁N项集。
重要性质
频繁项集的所有非空子集也必须是频繁的。即如果项集A不满足最小支持度阈值MinSupport,则A不是频繁的,如果将项集B添加到项集A中,也就是A ⋃ B也不可能是频繁的。该性质是一种反单调性的性质,也就是说如果一个集合不能通过测试,则它的所有超集也都不能通过相同的测试。
基本实现原理
- 首先寻找L[1](即频繁1项集);
- 在L[k]的基础上生成候选频繁k+1项集C[k+1];
- 用事务数据库D中的事务对所有C[k+1]进行支持度测试以寻找频繁项集L[k+1],计算每个候选频繁项集的支持度,如果大于最小支持度,则加入到L[k+1];
- 如果L[k+1]为空集,则结束,L[1] ∪ L[2] ∪ …即为结果;否则转2继续。
伪代码形式
Apriori算法
输入:数据集D;最小支持度minsupport
输出:频繁项集L
L[1] = {频繁1项集}//初始化频繁项集L[1](也称单品项集)
for(k=2;L[k-1]不为空;k++){
C[k] = candidate_gen(L[k-1]);//根据L[k-1]产生新的候选频繁项集C[k]
For all transactions t ϵ D; {//对所有的交易记录做循环
C = subset(C[k],t);//找出当前交易记录t和候选频繁项集C[k]的交集
For all candidates c ϵC do//对存在的候选频繁项集的交集进行支持度计数
c.count ++;
}
L[k] = {c ϵ C[k] | c.count >= minsup};//保留大于最小支持度的频繁项集到L[k];
}
Answer = L=∪L[k]=L[1] ∪ L[2] ∪ ... ∪ L[k]
candidate_gen(L[k-1])
输入:(k-1)-项集
输出:k-候选集C[k]
for all itemset p ∈ L[k-1]
for all itemset q ∈ L[k-1]
if(p.item1 = q.item1,p.item2=q.item2,...,p.item(k-2)=q.item(k-2),p.item(k-1)<q.item(k-1))
c=p∞q;
if(has_infrequent_subset(c,L[k-1]) delete c;
else add c to C[k];
End for
End for
return C[k];
has_infrequent_subset(c,L[k-1])
输入:一个k-项集c,(k-1)-项集L[k-1]
输出:c是否从候选集中删除
for all (k-1)-subsets of c
if S ∉ L[k-1]
return true;
return false;
Apriori算法的缺点
多次扫描事务数据库,需要很大的I/O负载。
对每次k循环,候选集C[k]中的每个元素都必须通过扫描数据库一次来验证其是否加入L[k]。加入一个频繁大项集包含10个项,那么就至少需要扫描事务数据库10次。
可能产生庞大的候选集。
由L[k-1]产生k-候选集C[k]是指数增长的,例如 10