關聯規則挖掘與Apriori算法

關聯規則挖掘是數據挖掘中經常使用的手段,通常指的是從交易數據庫、關係數據庫以及其餘的數據集中發現項或對象的頻繁的模式(frequent patterns)、關聯(association)的過程。此方法通常用於在購物籃分析(market basket analysis)中。最先是用於發現超市銷售數據庫中不一樣商品之間的關聯關係,最經典的莫過於啤酒與尿布的這個段子。算法

觀察發現不少顧客在買尿布的時候同時也購買啤酒,這樣超市把尿布和啤酒放在一塊兒就能夠提升銷售額,若是把土豆片擺在它們中間,則會同時提升這三者的銷售額。

那麼這個現象就會帶來一些思考,哪些商品客戶是可能會在一次購物同時購買?數據庫

基礎概念

在講述算法過程前先介紹下幾個基本概念,首先咱們存在一個交易數據庫Transacational database:數據結構

  • 被研究的對象被稱爲項(Item),購物籃分析應用背景下,顧客購每一個商品稱爲一個項
  • 全部項的集合: I={$i_1$,$i_2$, ...$i_m$}
  • 每一個交易$t_i$對應的項的集合是I的子集
  • I的任何一個子集被稱爲項集(Itemset): x = {$i_{j1}, i_{j2}...i_{jp}$}
  • 交易數據庫D則是交易的集合,D={$t_1$, $t_2$...,$t_m$}
  • 每一個項集包含的項的個數,成爲項集的長度,一個長度爲k的項集被稱爲k項集
  • 一個項集X在數據庫D中出現的次數稱爲頻數, 記爲count(X)

支持度support

一個項集X的支持度指的是在數據集中包含該項集的記錄所佔的比例。ide

$$ support(X) = count(X)/|D| $$測試

若給定一個最小支持度minsup, support(X) >= minsup, 則X稱爲頻繁項集,也能夠說X是頻繁的。spa

置信度/可信度confidence

置信度/可信度是針對一條好比X->Y的關聯規則來定義的,指的是包含X的交易中包含Y的比例。對象

$$ conf(X \rightarrow Y) = |XY|/|X| = sup(XY)/sup(X) $$blog

Apriori算法

Apriori算法是一個經典的挖掘規則算法,也是最經常使用的挖掘頻繁項集的算法。主要步驟以下ci

  1. 發現全部的頻繁集: 支持度>=minsupport的全部項集rem

    1. 統計每一個k項候選集的支持度,找出頻繁的k項集: $L_k$
    2. 利用頻繁的k項集生成k+1項候選集: $C_{k+1}$, k=k+1
  2. 將每一個頻繁集生成可能的關聯規則

下面舉個例子,最小支持度minsup=2

apriori算法舉例

文字描述下算法流程就是:

  1. 掃描TDB, 對每一個候選項計算支持度獲得表C1
  2. 比較C中各個後選項支持度與最小支持度,獲得1維的最大項集L1
  3. 由L1獲得候選集C2
  4. 由C2比較支持度獲得L2
  5. 由L2獲得C3
  6. 由C3獲得3維項集L3

根據上述流程咱們也會發現,這個算法每一步產生候選集時循環產生的組合過多,咱們能夠經過挖掘關聯規則的性質來作剪枝。

  • 任何頻繁集的子集必須是頻繁的
  • Apriori剪裁規則: 若存在某些項集是不頻繁的,則和這些項集的任何超集都是不頻繁的,由於無需生成和測試

剪枝

如圖所示,AB是不頻繁的,那麼紅色虛線圈出的全部超集也是不頻繁的,所以能夠剪掉。因此生成候選集的方法能夠這樣總結:

假設項集$L_k$中的項是有序的

  1. 兩兩組合$L_k$中項集生成$C_{k+1}$
  2. 裁剪

生成關聯規則

前面說完了如何生成頻繁項集,接下來講說如何生成關聯規則,現有頻繁項集l,生成每一個非空子集S,若S知足最小置信度:

$$ confidence((l-s) \rightarrow s) = \frac{sup(l)}{sup(l-s)} >= minconf $$

則輸出關聯規則(l-s)->s。

關聯規則示例

如圖所示,最小置信度minconf=80%,對於頻繁項集BCE,獲得以下幾個關聯規則,其中大於80%的爲BC->E和CE-<B兩條規則。

提高度

咱們如今掌握瞭如何找出頻繁項集以及關聯規則的算法,那麼怎麼肯定計算出來的支持度和置信度是有效的呢?如今有個例子以下:

提高度示例

從直覺上來講,打籃球和吃燕麥看不出有什麼關聯,但從上述計算的結果來看,打籃球->吃燕麥的規則的支持度和置信度還挺高。這說明了支持度和置信度有時候並不必定能準確的反映數據之間的相關性。那麼就引入了一個新的概念,提高度(Lift)。

$$ lift = \frac{P(A \cup B)}{P(A)P(B)} = \frac{conf(A \rightarrow B)}{sup(B)} $$

若是lift>1,則說明是A對B是有提高的,反之則是沒有提高。

那麼Apriori算法如今能夠總結爲四步:

  1. 設置minsup和minconf
  2. 找出頻繁項集
  3. 根據頻繁項集找到conf>minconf的規則
  4. 計算上一步找出的規則的提高度,選出提高度最高的幾個

因爲Apriori算法存在着可能會產生大量候選集的問題,所以又出現了新的算法,FP-growth算法。它是基於Apriori構建,但採用了高級的數據結構減小掃描次數,大大加快了算法速度。FP-growth算法只須要對數據庫進行兩次掃描,而Apriori算法對於每一個潛在的頻繁項集都會掃描數據集斷定給定模式是否頻繁,所以FP-growth算法的速度要比Apriori算法快。這個算法之後再深刻討論。以上就是關於Apriori算法的基礎知識,後續會抽空寫個Apriori算法的簡單代碼實現,這裏先立個flag~

相關文章
相關標籤/搜索