实现Apriori算法(数据挖掘经典关联算法)
一、算法描述
摘自http://baike.baidu.com/view/2230129.htm
首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递推的方法。
(1) L1 = find_frequent_1-itemsets(D);
(2) for (k=2;Lk-1 ≠Φ ;k++) {
(3) Ck = apriori_gen(Lk-1 ,min_sup);
(4) for each transaction t ∈ D {//scan D for counts
(5) Ct = subset(Ck,t);//get the subsets of t that are candidates
(6) for each candidate c ∈ Ct
(7) c.count++;
(8) }
(9) Lk ={c ∈ Ck|c.count≥min_sup}
(10) }
(11) return L= ∪ k Lk;
二、主要步骤
1) 统计出样本共有几个item
2) apriori算法主体
- 统计出长度为1个item的所有非频集(指支持度大于指定最小支持度的itemset)
- 从长度为2个item开始直到最大的长度
生成所有可能的候选集(根据长度)
剔除所有含有“长度减一非频集”的候选集
检查候选集的支持度,把频集加入结果当中,把非频集加入非频集的集合当中
- 返回结果
3) 输出结果(所有真正的候选集)
三、关键变量描述
vector<vector<string>> sample; 记录所有的样本
vector<vector<int>> result 记录候选集的item的编号,对应的是items的下标
vector<string> items 记录所有的item
四、运行截图
样本
输出所有候选集(最小频率为3)
不知道是不是我理解错了,觉得这个算法很简单。。。Apriori算法最大的缺点就是产生的候选集太多。。。果然很多。。。。= =!
代码下载地址: https://files.cnblogs.com/sandywong/Apriori_by_sandy.rar