讀古今文學網 > 機器學習實戰 > 11.2 Apriori原理 >

11.2 Apriori原理

假設我們在經營一家商品種類並不多的雜貨店,我們對那些經常在一起被購買的商品非常感興趣。我們只有4種商品:商品0,商品1,商品2和商品3。那麼所有可能被一起購買的商品組合都有哪些?這些商品組合可能只有一種商品,比如商品0,也可能包括兩種、三種或者所有四種商品。我們並不關心某人買了兩件商品0以及四件商品2的情況,我們只關心他購買了一種或多種商品。

Apriori算法的一般過程

  1. 收集數據:使用任意方法。
  2. 準備數據:任何數據類型都可以,因為我們只保存集合。
  3. 分析數據:使用任意方法。
  4. 訓練算法:使用Apriori算法來找到頻繁項集。
  5. 測試算法:不需要測試過程。
  6. 使用算法:用於發現頻繁項集以及物品之間的關聯規則。

圖11-2顯示了物品之間所有可能的組合。為了讓該圖更容易懂,圖中使用物品的編號0來取代物品0本身。另外,圖中從上往下的第一個集合是O,表示空集或不包含任何物品的集合。物品集合之間的連線表明兩個或者更多集合可以組合形成一個更大的集合。

圖11-2 集合{0,1,2,3}中所有可能的項集組合

前面說過,我們的目標是找到經常在一起購買的物品集合。而在11.1節中,我們使用集合的支持度來度量其出現的頻率。一個集合的支持度是指有多少比例的交易記錄包含該集合。如何對一個給定的集合,比如{0,3},來計算其支持度?我們遍歷每條記錄並檢查該記錄包含0和3,如果記錄確實同時包含這兩項,那麼就增加總計數值。在掃瞄完所有數據之後,使用統計得到的總數除以總的交易記錄數,就可以得到支持度。上述過程和結果只是針對單個集合{0,3}。要獲得每種可能集合的支持度就需要多次重複上述過程。我們可以數一下圖11-2中的集合數目,會發現即使對於僅有4種物品的集合,也需要遍歷數據15次。而隨著物品數目的增加遍歷次數會急劇增長。對於包含N種物品的數據集共有2N-1種項集組合。事實上,出售10 000或更多種物品的商店並不少見。即使只出售100種商品的商店也會有1.26 * 1030種可能的項集組合。對於現代的計算機而言,需要很長的時間才能完成運算。

為了降低所需的計算時間,研究人員發現一種所謂的Apriori原理。Apriori原理可以幫我們減少可能感興趣的項集。Apriori原理是說如果某個項集是頻繁的,那麼它的所有子集也是頻繁的。對於圖11-2給出的例子,這意味著如果{0,1}是頻繁的,那麼{0}、{1}也一定是頻繁的。這個原理直觀上並沒有什麼幫助,但是如果反過來看就有用了,也就是說如果一個項集是非頻繁集,那麼它的所有超集也是非頻繁的(如圖11-3所示)。

A priori

A priori在拉丁語中指「來自以前」。當定義問題時,通常會使用先驗知識或者假設,這被稱作「一個先驗」(a priori)。在貝葉斯統計中,使用先驗知識作為條件進行推斷也很常見。先驗知識可能來自領域知識、先前的一些測量結果,等等。

圖11-3 圖中給出了所有可能的項集,其中非頻繁項集用灰色表示。由於集合{2,3}是非頻繁的,因此{0,2,3}、{1,2,3}和{0,1,2,3}也是非頻繁的,它們的支持度根本不需要計算

在圖11-3中,已知陰影項集{2,3}是非頻繁的。利用這個知識,我們就知道項集{0,2,3},{1,2,3}以及{0,1,2,3}也是非頻繁的。這也就是說,一旦計算出了{2,3}的支持度,知道它是非頻繁的之後,就不需要再計算{0,2,3}、{1,2,3}和{0,1,2,3}的支持度,因為我們知道這些集合不會滿足我們的要求。使用該原理就可以避免項集數目的指數增長,從而在合理時間內計算出頻繁項集。

下一節將介紹基於Apriori原理的Apriori算法,並使用Python來實現,然後將其應用於虛擬商店Hole Foods的數據集上。