關聯規則挖掘(二) Apriori演算法

2021-06-02 11:04:59 字數 2765 閱讀 2683

在資料探勘領域,apriori演算法是挖掘關聯規則的經典演算法。apriori演算法採用的是自底向上的方法,從1-頻繁集開始,逐步找出高階頻繁集。

它的基本流程是:第一次掃瞄交易資料庫d時,產生1-頻繁集。在此基礎上經過連線、修剪產生2-頻繁集。以此類推,直到無法產生更高階的頻繁集為止。在第k次迴圈中,也就是產生k-頻繁集的時候,首先產生k-候選集,k-候選集中每乙個項集都是對兩個只有乙個項不同的屬於k-1頻繁集的項集連線產生的,k-候選集經過篩選後產生k-頻繁集。

首先來看乙個頻繁集的性質。

定理:如果專案集x是頻繁集,那麼它的非空子集都是頻繁集。

根據定理,已知乙個k-頻繁集的項集x,x的所有k-1階子集都肯定是頻繁集,也就肯定可以找到兩個k-1頻繁集的項集,它們只有一項不同,且連線後等於x。這證明了通過連線k-1頻繁集產生的k-候選集覆蓋了k-頻繁集。同時,如果k-候選集中的項集y,包含有某個k-1階子集不屬於k-1頻繁集,那麼y就不可能是頻繁集,應該從候選集中裁剪掉。apriori演算法就是利用了頻繁集的這個性質。

這是apriori演算法的主函式,它的輸入是交易資料庫d和最小支援度,最終輸出頻繁集l。函式第一步是掃瞄資料庫產生1-頻繁集,這只要統計每個專案出現的次數就可以了。然後依次產生2階,3階,……,k階頻繁集,k頻繁集為空則演算法停止。apriori_gen函式的功能是根據k-1頻繁集產生k-候選集。接著掃瞄交易資料庫裡的每一筆交易,呼叫subset函式產生候選集的子集,這個子集裡的每乙個項集都是此次交易的子集,並對子集裡的每乙個項集的計數增一。最後統計候選集裡所有項集的計數,將未達到最小支援度標準的項集刪去,得到新的頻繁集。

可以看到每一次迴圈,都必須遍歷交易資料庫;而且對於每乙個交易,也要遍歷候選集來增加計數,當候選集很大時這也是很大的開銷。

輸入:交易資料庫d,最小支援度supmin。

輸出:頻繁集l

l1=find_frequent_1_itemset(d);//產生1-頻繁集

for(k=2;lk-1!=⌀;k++)

lk=;

}l=⋃lk;

apriori_gen的功能是根據k-1頻繁集產生k-候選集。函式是乙個二重迴圈,當遇到兩個項集,它們的前k-2項都相同,只有最後一項不同時,就對它們進行連線操作,產生乙個k階的項集(這麼做的理論依據如前所述,任何乙個k階的頻繁集一定能找到兩個滿足此條件的k-1階子頻繁集)。新產生的k階項集可能包含有不是頻繁集的子集,遇到這樣的情況應該將此項集從候選集中裁剪掉,避免無謂的開銷,這就是has_infrequent_subset函式做的工作。

輸入:(k-1)-頻繁集lk-1。

輸出:k-候選集ck。

for each itemset p in lk-1

for each itemset q in lk-1

if(p.item1=q.item1&p.item2=q.item2&…&p.itemk-2=q.itemk-2&p.itemk-1

has_infrequent_subset函式的功能就是判斷乙個項集是否包含有不是頻繁集的子集。函式很簡單,遍歷候選項集c的k(實際上只需要遍歷k-2個)個k-1階子集,依次判斷是否頻繁集。

輸入:乙個k-候選項集c,(k-1)-頻繁集lk-1。

輸出:c是否從候選集刪除

for each (k-1)-subsets s of c

if s not in lk-1 return true;

return false;

繼續使用關聯規則挖掘(一):基本概念中的引例來看看apriori演算法的執行過程。輸入引例中的交易資料庫,設定最小支援度為0.3。

表1 某超市的交易資料庫

交易號tid

顧客購買的商品

交易號tid

顧客購買的商品

t1bread, cream, milk, tea

t6bread, tea

t2bread, cream, milk

t7beer, milk, tea

t3cake, milk

t8bread, tea

t4milk, tea

t9bread, cream, milk, tea

t5bread, cake, milk

t10bread, milk, tea

掃瞄交易資料庫,統計得各個專案出現的次數,bread是7次,cream是3次,milk是8次,tea是7次,cake是2次,beer是1次。容易知道1-頻繁集包括,,,。

對1-頻繁集進行連線,得到候選集為,,,, ,。掃瞄交易資料庫,得到它們的支援度分別為0.3,0.5,0.5,0.3,0.2,0.5。於是得到2-頻繁集是,,, ,。

對2-頻繁集進行連線,並刪掉其中包含有子集不是頻繁集的項集(比如有子集不是頻繁集,所以刪去),得到的候選集是,。掃瞄交易資料庫,它們的支援度是0.3,0.3。因此3-頻繁集為,。

對3-頻繁集進行連線,候選集為空,因此4-頻繁集為空,演算法結束。

最終產生了所有的頻繁集,,,,,,, ,,,。

apriori演算法的缺陷是需要多次掃瞄資料庫,而且可能產生非常大的候選集,降低了演算法的效能。因此有不少關於apriori演算法的優化方法,其中乙個是基於資料分割的優化方法。首先把大容量的資料庫從邏輯上分為幾個互不相交的塊,每塊都應用apriori演算法產生區域性的頻繁集,然後測試它們的支援度來得到最終的全域性頻繁集。這種方法減少了候選集對記憶體的負擔,而且支援並行挖掘。

[1] 韓慧等。《資料倉儲與資料探勘》。清華大學出版社,2009。

[2] 毛國君等。 《資料探勘原理與演算法》。清華大學出版社,2007。

[3] apriori algorithm. 2011.

資料探勘之關聯規則挖掘之Apriori演算法實現

演算法細節見 fast algorithm for mining association rules 控制台版本c 如下 include include include include include include include using namespace std 讀取檔案獲取整個資料庫儲存...

深度解析資料探勘關聯規則Apriori演算法

01 關聯規則挖掘背景和基本概念 如下所示的資料集,表中的每一行代表一次購買清單,注意我們只關心記錄出現與否,不關心某條記錄購買了幾次,如購買十盒牛奶也只計一次。資料記錄的所有項的集合稱為總項集,上表中的總項集 s 關聯規則 就是有關聯的規則,形式是這樣定義的 兩個不相交的非空集合x y,如果有 x...

關聯規則挖掘 Apriori演算法

1 apriori 介紹 apriori演算法使用頻繁項集的先驗知識,使用一種稱作逐層搜尋的迭代方法,k項集用於探索 k 1 項集。首先,通過掃瞄資料庫,累積每個項的計數,並收集滿足最小值尺度的項,找出頻繁 1 項集的集合,該集合記做 l1 然後利用 l1 找頻繁 2 項集的集合 l2 l2 找 l...