Apriori算法的實質使用候選項集找頻繁項集。
Apriori 算法是一種最有影響的挖掘布爾關聯規則頻繁項集的算法。算法的名字基於這樣的事實:算法使用頻繁項集性質的先驗知識, 正如咱們將看到的。Apriori 使用一種稱做逐層搜索的迭代方法,k-項集用於探索(k+1)-項集。首先,找出頻繁1-項集的集合。該集合記做L1。L1 用於找頻繁2-項集的集合L2,而L2 用於找L3,如此下去,直到不能找到頻繁k-項集。找每一個Lk 須要一次數據庫掃描。算法
挖掘頻繁項集數據庫
Apriori算法的關鍵是如何用Lk-1找Lk?由下面的兩步過程鏈接和剪枝組成。
鏈接步:爲找Lk,經過Lk-1與本身鏈接產生候選k-項集的集合。該候選項集的集合記做Ck。設l1和l2是Lk-1中的項集。記號li[j]表示li的第j項(例如,l1[k-2]表示l1的倒數第3項)。爲方便計,假定事務或項集中的項按字典次序排序。執行鏈接Lk-1 Lk-1;其中,Lk-1的元素是可鏈接的,若是它們前(k-2)個項相同;即,Lk-1的元素l1和l2是可鏈接的,若是(l1[1]=l2[1])∧(l1[2]=l2[2])∧…∧(l1[k-2]=l2[k-2])∧(l1[k-1]< l2[k-1])。條件(l1[k-1]< l2[k-1])是簡單地保證不產生重複。鏈接l1和l2產生的結果項集是l1[1]l1[2]…l1[k-1]l2[k-1]。
剪枝步:Ck是Lk的超集;即,它的成員能夠是頻繁的,也能夠不是頻繁的,但全部的頻繁k-項集都包含在Ck中。掃描數據庫,肯定Ck中每一個候選的計數,從而肯定Lk(即,根據定義,計數值不小於最小支持度計數的全部候選是頻繁的,從而屬於Lk)。然而,Ck可能很大,這樣所涉及的計算量就很大。爲壓縮Ck,能夠用如下辦法使用Apriori性質:任何非頻繁的(k-1)-項集都不是多是頻繁k-項集的子集。所以,若是一個候選k-項集的(k-1)-子集不在Lk-1中,則該候選也不多是頻繁的,從而能夠由Ck中刪除。這種子集測試能夠使用全部頻繁項集的散列樹快速完成。測試
僞代碼以下:排序
算法6.2.1(Apriori) 使用逐層迭代找出頻繁項集 事務
輸入:事務數據庫D;最小支持度閾值。it
輸出:D中的頻繁項集L。io
方法: L1 = find_frequent_1_itemsets(D); //找出頻繁1-項集的集合L1date
for(k = 2; Lk-1 ≠ ∅; k++) { //產生候選,並剪枝搜索
Ck = aproiri_gen(Lk-1,min_sup);方法
for each transaction t∈D{ //掃描D進行候選計數
Ct = subset(Ck,t); //獲得t的子集
for each candidate c∈Ct
c.count++; //支持度計數
}
Lk={c∈Ck| c.count ≥min_sup} //返回候選項集中不小於最小支持度的項集
}
return L = ∪kLk;//全部的頻繁集
第一步(鏈接 join)
Procedure apriori_gen(Lk-1: frequent (k-1)-itemset; min_sup: support)
1) for each itemset l1∈Lk-1
2) for each itemset l2∈Lk-1
3) if(l1[1]=l2[1])∧...∧(l1[k-2]=l2[k-2])∧(l1[k-1]<l2[k-1]) then{
4) c = l1 l2; //鏈接步:l1鏈接l2 //鏈接步產生候選,若K-1項集中已經存在子集c,則進行剪枝
5) if has_infrequent_subset(c,Lk-1) then
6) delete c; //剪枝步:刪除非頻繁候選
7) else add c to Ck;
8) }
9) return Ck;
第二步:剪枝(prune)
Procedure has_infrequent_subset(c:candidate k-itemset; Lk-1:frequent (k-1)-itemset) //使用先驗定理
1) for each (k-1)-subset s of c
2) if c∉Lk-1 then
3) return TRUE;
4) return FALSE;