Apriori Algorithm 是關聯規則領域裡最具影響力的基礎演算法。它是由 Rakesh Agrawal 在 1994 年提出的,詳細的介紹在這裡《Fast Algorithms for Mining Association Rules》。十幾年過去了,不少學者圍繞著 Apriori 進行了諸多改良。但與 1994 年相比,目前基於網際網路的應用,資料量大了幾十倍甚至是幾百倍,因此,基於 Apriori 的演算法逐漸暴露出其運算成本過高的問題。但不管怎樣,對於大師及其做出的貢獻,我們也只有高山仰止的份兒。
Apriori 是一種廣度優先演算法,通過多次掃描資料庫來獲取支援度大於最小支援度的頻繁項集。它的理論基礎是頻繁項集的兩個單調性原則:頻繁項集的任一子集一定是頻繁的;非頻繁項集的任一超集一定是非頻繁的。晦澀的理論我這裡就不多寫了,有興趣的可以去看論文。我把裡面的例子給翻譯一下,圖文並茂,簡明易懂。
某資料庫 DB 裡有 4 條事務記錄,取最小支援度(min support)為 0.5,則計算頻繁項集的過程如下:
TID
|
Items
|
100
|
A, C, D
|
200
|
B, C, E
|
300
|
A, B, C, E
|
400
|
B, E
|
|
掃描DB
|
Itemset
|
Support
|
{A}
|
2 (0.5)
|
{B}
|
3 (0.75)
|
{C}
|
3 (0.75)
|
{D}
|
1 (0.25)
|
{E}
|
3 (0.75)
|
|
取滿足 最小支援度 項集
|
Itemset
|
Support
|
{A}
|
2
|
{B}
|
3
|
{C}
|
3
|
{E}
|
3
|
|
Itemset
|
{A, B}
|
{A, C}
|
{A, E}
|
{B, C}
|
{B, E}
|
{C, E}
|
|
掃描DB
|
Itemset
|
Support
|
{A, B}
|
1 (0.25)
|
{A, C}
|
2 (0.5)
|
{A, E}
|
1 (0.25)
|
{B, C}
|
2 (0.5)
|
{B, E}
|
3 (0.75)
|
{C, E}
|
2 (0.5)
|
|
取滿足 最小支援度 項集
|
Itemset
|
Support
|
{A, C}
|
2
|
{B, C}
|
2
|
{B, E}
|
3
|
{C, E}
|
2
|
|
Itemset
|
{A, B, C}
|
{A, B, E}
|
{A, C, E}
|
{B, C, E}
|
|
掃描DB
|
Itemset
|
Support
|
{A, B, C}
|
1 (0.25)
|
{A, B, E}
|
1 (0.25)
|
{A, C, E}
|
1 (0.35)
|
{B, C, E}
|
2 (0.5)
|
|
取滿足 最小支援度 項集
|
Itemset
|
Support
|
{B, C, E}
|
2 (0.5)
|
|
如上可以看出,在海量資料的情況下,Apriori 演算法的運算過程有 2 個問題:
- 需要多次掃描資料庫,時間成本很高;
- 運算過程中需要產生大量的候選集,空間成本也非常高。
針對 Apriori 演算法所做的改進也基本上是圍繞著解決這兩個問題進行的,如在掃描DB前首先進行以便事務合併和壓縮,資料分割槽或抽樣等。
Weka 裡有 Apriori 演算法的 Java 實現,非常值得一看。