機器學習演算法(九) Apriori演算法

2021-07-26 10:43:20 字數 3564 閱讀 5008

apriori演算法是一種關聯分析方法,用於發現隱藏在大型資料集中有意義的聯絡。所發現的聯絡可以使用關聯規則和頻繁項集來表示。令i

= 是購物籃資料所有項的集合,而t=

是所有事務的集合。每個事務ti

包含的項集都是i的子集。在關聯分析中,包含0個或多個項的集合被稱為項集。如果乙個項集包含k個項,則稱它為k-項集。空集是指不包含任何項的項集。

項集的乙個重要性質是它的支援度計數,即包含特定項集的事務個數。項集x的支援度計數σ(

x)可以表示為:σ(

x)=|

| 關聯規則是形如x→

y 的蘊含表示式,其中x和y是不相交的項集。

關聯規則的強度可以用它的支援度和置信度來度量。支援度確定規則可以用於給定資料集的頻繁程度,而置信度確定y在包含x的事務中出現的頻繁程度。支援度s和置信度c這兩種度量的形式如下:s(

x→y)

=σ(x

∪y)n

c(x→y)=

σ(x∪

y)σ(

x)在關聯規則的發現中,支援度通常用來刪去那些無意義的規則,因為支援度低的規則可能只是偶然出現。置信度度量通過規則進行推理具有的可靠性。需要注意的一點是,由關聯規則作出的推論並不必然蘊含因果關係。它只表示規則的前件和後件中的項明顯地同時出現。

大多數關聯規則挖掘演算法通常採用的一種策略是,將任務分解為如下兩個子任務:

頻繁項集產生:其目標是發現滿足最小支援度閾值的所有項集,這些項集稱作頻繁項集。

使用支援度對候選項集進行剪枝基於如下原理:

先驗原理:如果乙個項集是頻繁的,則它的所有子集一定也是頻繁的。
如果項集是非頻繁的,則它的所有超集一定是非頻繁的。

apriori演算法的頻繁項集產生部分有兩個重要的特點:第一,它是乙個逐層演算法,即從頻繁1-項集到最長的頻繁項集,它每次遍歷項集格中的一層;第二,它使用產生-測試策略來發現頻繁項集。在每次迭代之後,新的候選項集都是由前一次發現的頻繁項集產生,然後對每個候選的支援度進行計數,並與最小支援度閾值進行比較。

演算法的偽**如下:

k = 1

f_k = ) \geq n \times minsup}// 發現所有頻繁1-項集

repeat

k = k + 1

c_k = apriori-gen(f_)

for 每個事務 t \in t do

c_t = subset(c_k, t)// 識別屬於t的所有候選

for 每個候選項集 c \in c_t do

\sigma(c) = \sigma(c) + 1

//支援度計數增值

endfor

endfor f_k = // 提取頻繁k-項集

until f_k = \emptyset

result = \cup f_k

函式apriori-gen的過程是合併一對頻繁(k-1)-項集,僅當它們的前k-2個項都相同。令a=

和b= 是一對頻繁(k-1)-項集,合併a和b,如果它們滿足如下條件:ai

=bi(

i=1,

2,…,

k−2)

並且ak

−1≠b

k−1

避免產生重複的候選集的一種方法是確保每個頻繁項集中的項以字典序儲存。由於每個候選都由一對頻繁(k-1)-項集合並而成,因此只需要附加的候選剪枝步驟來確保該候選的其餘k-2個子集是頻繁的。

下圖顯示了列舉事務t中所有3-項集的系統的方法。假定每個項集中的項都以遞增的字典序排序,則項集可以這樣列舉:先指定最小項,其後跟隨較大的項。例如,給定t=,它的所有3-項集一定以項1、2或3開始。不必構造以5或6開始的3-項集,因為事務t中只有兩個項的標號大於等於5。第一層的字首結構描述了指定包含在事務t中的3-項集的第一項的方法。確定第一項之後,第二層的字首結構表示選擇第二項的方法。最後,第三層的字首結構顯示了事務t包含的所有的3-項集。

上圖所示的字首結構演示了如何系統地列舉事務所包含的項集,即通過從最左項到最右項依次指定項集的項。然而還必須確定每乙個列舉的3-項集是否對應與乙個候選項集,如果它與乙個候選匹配,則相應候選項集的支援度計數增值。

使用hash樹進行支援度計數

在apriori演算法中,候選項集劃分為不同的桶,並存放在hash樹中。在支援度計數期間,包含在事務中的項集也雜湊到相應的桶中。這種方法不是將事務中的每個項集與所有的候選項集進行比較,而是將它與同一桶內候選項集進行匹配。

樹的每個內部結點都使用hash函式h(

p)=p

mod3

來確定應沿當前結點的哪個分支向下。例如,項1,4和7應當雜湊到相同的分支,因為除以3之後它們都具有相同的餘數。所有的候選集都存放在hash樹的葉結點中。

考慮乙個事務t=。為了更新候選項的支援度計數,必須這樣遍歷hash樹:所有包含屬於事務t的候選3-項集的葉子結點至少訪問一次。注意,包含在t中的候選3-項集必須以項1,2或3開始。如上圖第一層字首結構所示。項1被雜湊到根節點的左子結點,項2被雜湊到中間的子結點,而項3被雜湊到右子結點。在樹的下一層,根據上圖中第二層結構列出的第二項進行雜湊。例如,在根節點雜湊項1之後,雜湊事務的項2、3和5。項2和5雜湊到中間的子結點,而3雜湊到右子結點,如下圖所示。繼續該過程,直至到達hash樹的葉結點。存放在被訪問的葉結點中的候選項集與事務進行比較,如果候選項集是該事務的子集,則增加它的支援度計數。

當由頻繁項集y產生的規則時,下面的定理對置信度度量成立:

如果規則y−

x→x 不滿足置信度閾值,則形如y−

x′→x

′ 的規則一定也不滿足置信度閾值,其中x′

是x的子集。

apriori演算法使用一種逐層方法來產生關聯規則,其中每層對應於規則後件中的項數。初始,提取規則後件只含有乙個項的所有高置信度規則,然後,使用這些規則來產生新的候選規則。

演算法的偽**如下:

for 每乙個頻繁k-項集f_k, k \geq 2

do h_1 = \\規則的1-項後件

call ap-genrules(f_k, h_1)

endfor

函式ap-genrules的偽碼如下:

k = |f_k| //頻繁項集的大小

m = |h_m| //規則後件的大小

if k > m + 1

then

h_ = apriori-gen(h_m)

for 每個h_ \in

h_ do

conf = \sigma(f_k) / \sigma(f_k - h_)

if conf \geq minconf then

output: 規則(f_k - h_) \rightarrow h_

else

從h_ delete h_

endifend

for call ap-genrules(f_k, h_)

endif

該函式中的apriori-gen函式與產生頻繁項集候選集的過程類似。二者不同的是,在規則產生時,不必再次掃瞄資料集來計算候選規則的置信度,而是使用在頻繁項集產生時計算的支援度計數來確定每個規則的置信度。

部落格的部分內容源自《資料探勘導論》一書。

機器學習 演算法 Apriori

參考 很多人都喜歡用 啤酒跟尿布 這個例子來比喻機器學習,主要就是想說明apriori在挖掘物件關聯的重要作用,這個演算法很簡單,沒有涉及複雜的數學知識,一點邏輯而已,還有改進的apriori演算法,有時間我也會實現一下 簡單實現了一下apriori,直接上python 和結果 coding utf...

機器學習 Apriori演算法

apriori演算法包含兩部分內容 1,發現頻繁項集 2,挖掘關聯規則。通俗地解釋一下,就是這個意思 1.發現哪些專案常常同時出現 2.挖掘這些常常出現的專案是否存在 如果a那麼b 的關係。舉個例子 購物訂單常常會出現這樣一種情況 那就是某幾種物品常常一起買。比如鍋和鏟子 手機和手機殼等就會常常出現...

機器學習演算法 之Apriori

apriori演算法不同於以前接觸過的機器學習演算法,這種演算法用於在資料集中尋找有趣的關係。這些關係可以有兩種形式 頻繁項集或者關聯規則。關於演算法的詳細介紹參見 def apriori dataset,minsupport 0.5 c1 createc1 dataset d map set,da...