最近工作比较忙,每天发在学习上的时间比较少,最近学的数据挖掘教程比较进度缓慢,上星期开始看的Apriori算法,这算是我接触的第一个数据挖掘方面的算法,看了2-3遍了解其原理。曾看过大侠说过,要想完全理解其算法的本质,即必须上机编写测试,哪怕是写出伪代码也要翻译成机器语言跑一遍,来感觉此算法的伟大。所以抽了个周六,详细编写了遍,并参考网上的例子,对其进行适当的优化。
首先我们要先了解Apriori算法的简介和原理,这部分都是我参考教程上及网上的,由于篇幅比较大,就简单的整理了下:
一、Apriori算法简介:
Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。
二、算法中用到一些概念
1、支持度,以购物为例,同事购买AB物品的概率即P(A ∩ B)。
2、置信度,在买A的基础上,购买了B的概率即P(B|A)= p(AB)/P(A) (条件概率公式)。
3、候选K项集,该集合含有K个元素,也即同时购买了K个物品。
4、频繁K项集,在候选K项集的基础上,大于或等于最小支持度。
5、先验性质,反单调性,链接步,剪枝步:
三、算法步骤,利用伪代码来解释更容易理解:
算法 Apriori
Input: Transaction DataBase D,Minimumsupport threshold minsup。
Output: Frequent pattern L
//相当于主程序
(1) L1=search_frequent_1-itemsets( D ); //首先计算候选1项集和频繁1项集
(2) for(k=2;Lk-1≠φ;k++)do //根据频繁集k-1项集找候选k项集,利用候选k项集找频繁k项集,直到频繁k项集为空
(3) begin
(4) Ck=apriori-gen(Lk-1); //根据频繁k-1项集,利用链接步,产生候选K项集
(5) for all transactions t D do //根据候选k项集,利用支持度刷选出频繁k项集
(6) begin
(7) Ct=subset(Ck,t);
(8) for all candidates c Ct do
(9) c.count++;
(10) end
(11) Lk ={c Ck|c.count≥minsup}
(12) end
(13) Answer L=∪kLk;
//按事务数据产生候选1项集和频繁1项集,其实就是数事务中出现的所有item的个数,再利用支持度帅选处频繁集
Procedure Search_frequent_1-itemsets( D )
(1) begin
(2) for all transactions t D do
(3) begin
(4) for each item ik t do
(5) ik.count++;
(6) end
(7) L1 ={ i I | i.count≥minsup}
(8) return L1;
(9) end</