Apriori算法的前世此生

做者:算法

wuliong,OpenFEA分析師。海歸碩士,畢業於美國Rensselaer Polytechnic Institute數學專業。app

————————————————————————————————————————————————函數

Apriori算法是一種尋找頻繁項集並在此基礎上生成關聯規則的算法。其本質是逐層搜索的迭代方法,且每次搜索分爲生成候選集與檢驗支持度兩個階段。這種算法簡單易懂、易於實現,是數據挖掘領域的經典算法之一。佈局

Apriori算法應用普遍,可在產品目錄設計、向上銷售、商品陳列布局、根據消費行爲對顧客細分等典型商業問題上爲決策提供支持(本文不討論如何產生關聯規則,僅對尋找頻繁項集的基本概念和計算步驟作介紹)。ui

爲方便解釋名詞,咱們先引入一個應用場景:.net

1、應用場景及基本概念設計

假設某個淘寶店一上午有八個訂單,交易明細以下:get

訂單號 訂單內容數學

001 (1,2,5)產品

002 (2,4)

003 (2,3)

004 (1,2,4)

005 (1,3)

006 (2,3)

007 (1,2,3,5)

008 (1,2,3)

咱們把這個包括所有交易細節的表格稱爲數據集(簡稱D),每一行對應一條交易記錄(transaction,簡稱T)。交易記錄裏的數字是商品代碼,由若干商品代碼組成的集合稱爲項集(itemset),好比{1,3},包含k項商品代碼的項集稱爲k項集,項集不能夠爲空(即k>0)。

隨意選擇一個項集,例如{1,3},經過查看數據集,咱們發現這個項集出如今三條交易記錄中,即

{1,3},

{1,2,3,5}

{1,2,3}

除以交易記錄總數8,咱們說這個項集的支持度(support)爲37.5%。

若是設定最小支持度閾值爲25%,凡支持度大於25%的項集均可以稱爲頻繁項集(large itemset,簡稱L)。

算法的目的就是尋找全部符合條件(即大於支持度閾值)的頻繁項集。寫成數學表達式的話,算法的最終計算結果應是

U_{k}Lk

其中,Lk指全部包含k項的頻繁項集所組成的集合, U_{k}指對全部Lk的並集。

2、算法基本步驟

尋找L1很是容易,只需掃描數據集並計算每一個商品代碼出現的次數,選擇那些支持度高於閾值的便可獲得L1。

可是如何找出L2,L3,...呢?

提出Apriori算法的兩位做者用一句簡短明瞭的話描述了算法的核心思想, "The basic intuition is that any subset of a larget itemset must be large"(一個頻繁項集的任意一個子集必然也是頻繁項集)。

舉例來講,若是{1,3}是頻繁項集,則它的全部子集(即{1}和{3})必然都是頻繁項集。這句話暗示了自下至上搜索頻繁項集的可能性,由於咱們知道,任何一個集合,必然與它的部分子集的並集相同。舉例來講,即使咱們事先不知道{1,3}屬於頻繁項集,可是因爲{1}和{3}都屬於頻繁項集,若是計算L1中任意兩個頻繁項集的並集,則結果中必然包括{1,3}。這種經過對任意兩個(k-1)項頻繁項集求並集所獲得的結果,咱們稱之爲k項候選集(Candidate,簡稱Ck)。候選集Ck包含了全部k項頻繁項集,以及許多非頻繁項集。對候選集Ck去粗取精,方能獲得Lk。

從候選集中刪除非頻繁項集的方法有兩種,第一種方法簡單粗暴,即機械地計算每一個項集的支持度,再刪除那些支持度低於閾值的項集。另外一種方法則是基於前面提到過的算法做者的話,一個頻繁項集的子集必然也是頻繁項集,反之,若是一個項集的某個子集不是頻繁項集,則它自己也不多是頻繁項集。顯而易見,後一種方法計算量小,於是會優先使用,而前一種方法雖然計算量大可是能夠準確的找出全部非頻繁項集,故而也會使用。

此外,值得注意的是,在構建候選集Ck的過程當中,若是隻是機械地對L(k-1)中的集合兩兩求並集,則任何一個k項頻繁項集均可能會在Ck中出現屢次(準確說是k*(k-1)/2次,當k>2時,該表達式大於1)。

舉例來講,{1,2,3}會在C3中出現3次,由於它既是{1,2}和{2,3}的並集,也是{1,2}和{1,3},{1,3}和{2,3}的並集。若是咱們在構建Ck的過程當中增長一些限制條件,就能夠避免重複減小計算量。

好比考慮下面這種特殊狀況:假定A是一個k項頻繁項集,則剛好有一個k-1項子集B1包括A的1...k-1項,又剛好有另外一個子集B2包含A的1...k-2項和第k項,B1和B2都屬於L(k-1)而且它們的前k-2項相同。若是在構建Ck的過程當中,要求僅對前k-2項相同的兩個集合求並集,則任何一個k項頻繁項集在候選集中出現的次數正好是一次。固然,只有當k大於2時,咱們才須要用到這個限制條件。

上述方法構成了Apriori算法的骨幹,下面就結合前文提到的淘寶訂單例子詳細介紹算法的基本步驟。

步驟1:

尋找只含1項的頻繁項集L1。如前所述,需掃描數據集並計算各個商品代碼出現次數,獲得支持度(爲方便討論,此處支持度採用次數而非百分比):

{1},支持度=5

{2},支持度=7

{3},支持度=5

{4},支持度=2

{5},支持度=2

步驟2:

刪除支持度不高於閾值(2次)的,獲得L1={{1},{2},{3}}

步驟3: 

已知L(k-1),尋找k項頻繁項集Lk (k>=2)。

當k=2時,因爲L1={{1},{2},{3}},很容易獲得候選集C2={{1,2},{2,3},{1,3}}。

步驟4: 

進一步計算C2中每一個項集的支持度分別爲4,4和3,都高於閾值,因此L2={{1,2},{2,3},{1,3}}

當k=3時,已知L2={{1,2},{2,3},{1,3}},而且注意到只有{1,2}和{1,3}有類似的前k-2項(即第一項都爲1),因此C3只需包括它們倆的並集即{1,2,3},而且考慮到{1,2,3}的全部子集都在L2中,因此它能夠成爲候選集,也就是說,C3={{1,2,3}}。計算這個惟一的候選項集的支持度,獲得2,沒有超過閾值,因此L3爲空集。

由於L3爲空,天然沒法計算候選集C4甚至L4,因此計算過程到這裏就結束了。而咱們要找的頻繁項集爲L={{1},{2},{3},{1,2},{2,3},{1,3}}

這樣的計算,雖然不難,但操做起來比較繁瑣。所幸FEA已經實現了這個算法,咱們只需對數據進行簡單的處理,剩下的工做FEA會替您完成!

3、FEA尋找頻繁項集的步驟

結合上文這個例子,下面手把手教您如何使用FEA尋找頻繁項集,讀者可在茶餘飯後親自嘗試。

首先,作好數據導入的基礎工做

導入數據,既能夠經過導入csv文件,也能夠手動建立:

a = @udf df0@sys by udf0.df_append with (1,1:2:5)

a = @udf a by udf0.df_append2 with (1,2:4)

a = @udf a by udf0.df_append2 with (8,1:2:3)

而且重命名列

rename a as (0:’tid’,1:’items’)

接着,將列類型轉換爲list:

a.items = str items by (split(‘:’))

而後,使用現成的函數尋找頻繁項集:

a = @udf a by ML.fp_growth with (items,3)

這裏參數取3,則全部支持度大於等於3的項集都會包含在結果中。

一步就查找完頻繁項集

最後,dump a 查看查找結果

items support

1  5

2,1  4

3 5

1,3 3

2,3 4

2 7

第一列顯示每一個頻繁項集所包含的項,第二列顯示該項集的支持度即它在數據集中出現次數。對於這個結果,咱們能夠作進一步挖掘分析、尋找關聯規律,限於篇幅有限此處不作展開。

讀完此篇,你有沒有感受到利用FEA尋找出頻繁項集,簡單不少?

相關文章
相關標籤/搜索