關聯規則挖掘是數據挖掘中經常使用的手段,通常指的是從交易數據庫、關係數據庫以及其餘的數據集中發現項或對象的頻繁的模式(frequent patterns)、關聯(association)的過程。此方法通常用於在購物籃分析(market basket analysis)中。最先是用於發現超市銷售數據庫中不一樣商品之間的關聯關係,最經典的莫過於啤酒與尿布的這個段子。算法
觀察發現不少顧客在買尿布的時候同時也購買啤酒,這樣超市把尿布和啤酒放在一塊兒就能夠提升銷售額,若是把土豆片擺在它們中間,則會同時提升這三者的銷售額。
那麼這個現象就會帶來一些思考,哪些商品客戶是可能會在一次購物同時購買?數據庫
在講述算法過程前先介紹下幾個基本概念,首先咱們存在一個交易數據庫Transacational database:數據結構
一個項集X的支持度指的是在數據集中包含該項集的記錄所佔的比例。ide
$$ support(X) = count(X)/|D| $$測試
若給定一個最小支持度minsup, support(X) >= minsup, 則X稱爲頻繁項集,也能夠說X是頻繁的。spa
置信度/可信度是針對一條好比X->Y的關聯規則來定義的,指的是包含X的交易中包含Y的比例。對象
$$ conf(X \rightarrow Y) = |XY|/|X| = sup(XY)/sup(X) $$blog
Apriori算法是一個經典的挖掘規則算法,也是最經常使用的挖掘頻繁項集的算法。主要步驟以下ci
發現全部的頻繁集: 支持度>=minsupport的全部項集rem
下面舉個例子,最小支持度minsup=2
文字描述下算法流程就是:
根據上述流程咱們也會發現,這個算法每一步產生候選集時循環產生的組合過多,咱們能夠經過挖掘關聯規則的性質來作剪枝。
如圖所示,AB是不頻繁的,那麼紅色虛線圈出的全部超集也是不頻繁的,所以能夠剪掉。因此生成候選集的方法能夠這樣總結:
假設項集$L_k$中的項是有序的
前面說完了如何生成頻繁項集,接下來講說如何生成關聯規則,現有頻繁項集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算法如今能夠總結爲四步:
因爲Apriori算法存在着可能會產生大量候選集的問題,所以又出現了新的算法,FP-growth算法。它是基於Apriori構建,但採用了高級的數據結構減小掃描次數,大大加快了算法速度。FP-growth算法只須要對數據庫進行兩次掃描,而Apriori算法對於每一個潛在的頻繁項集都會掃描數據集斷定給定模式是否頻繁,所以FP-growth算法的速度要比Apriori算法快。這個算法之後再深刻討論。以上就是關於Apriori算法的基礎知識,後續會抽空寫個Apriori算法的簡單代碼實現,這裏先立個flag~