Apriori算法的原理及僞代碼

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;

相關文章
相關標籤/搜索