推薦系統:關聯規則(2)

maqianmaqian發表於2011-03-17

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 個問題:

  1. 需要多次掃描資料庫,時間成本很高;
  2. 運算過程中需要產生大量的候選集,空間成本也非常高。

針對 Apriori 演算法所做的改進也基本上是圍繞著解決這兩個問題進行的,如在掃描DB前首先進行以便事務合併和壓縮,資料分割槽或抽樣等。

Weka 裡有 Apriori 演算法的 Java 實現,非常值得一看。

相關文章