挖掘關聯規則之Apriori演算法詳解

2021-06-09 06:22:40 字數 3509 閱讀 8266

1. 挖掘關聯規則

1.1   什麼是關聯規則

一言蔽之,關聯規則是形如x→y的蘊涵式,表示通過x可以推導「得到」y,其中x和y分別稱為關聯規則的先導(antecedent或left-hand-side, lhs)和後繼(consequent或right-hand-side, rhs)

1.2   如何量化關聯規則

關聯規則挖掘的乙個典型例子便是購物車分析。通過關聯規則挖掘能夠發現顧客放入購物車中的不同商品之間的關聯,分析顧客的消費習慣。這種關聯規則的方向能夠幫助賣家了解哪些商品被顧客頻繁購買,

從而幫助他們開發更好的營銷策略。比如:將經常同時購買的商品擺近一些,以便進一步刺激這些商品一起銷售;或者,將兩件經常同時購買的商品擺遠一點,這樣可能誘發買這兩件商品的使用者一路挑選其他商品。

在資料探勘當中,通常用「支援度」(support)和「置性度」(confidence)兩個概念來量化事物之間的關聯規則。它們分別反映所發現規則的有用性和確定性。比如:

computer => antivirus_software , 其中 support=2%, confidence=60%

表示的意思是所有的商品交易中有2%的顧客同時買了電腦和防毒軟體,並且購買電腦的顧客中有60%也購買了防毒軟體。在關聯規則的挖掘過程中,

通常會設定最小支援度閾值和最小置性度閾值,如果某條關聯規則滿足最小支援度閾值和最小置性度閾值,則認為該規則可以給使用者帶來感興趣的資訊。

1.3   關聯規則挖掘過程

1)幾個基本概念:

關聯規則a->b的支援度support=p(ab),指的是事件a和事件b同時發生的概率。

置信度confidence=p(b|a)=p(ab)/p(a),指的是發生事件a的基礎上發生事件b的概率。

同時滿足最小支援度閾值和最小置信度閾值的規則稱為強規則。

如果事件a中包含k個元素,那麼稱這個事件a為k項集,並且事件a滿足最小支援度閾值的事件稱為頻繁k項集。

2)挖掘過程:

第一,找出所有的頻繁項集;

第二,由頻繁項集產生強規則。

2. 什麼是apriori

2.1   apriori介紹

apriori演算法使用頻繁項集的先驗知識,使用一種稱作逐層搜尋的迭代方法,k項集用於探索(k+1)項集。首先,通過掃瞄事務(交易)記錄,找出所有的頻繁1項集,該集合記做l1,

然後利用l1找頻繁2項集的集合l2,l2找l3,如此下去,直到不能再找到任何頻繁k項集。最後再在所有的頻繁集中找出強規則,即產生使用者感興趣的關聯規則。

其中,apriori演算法具有這樣一條性質:任一頻繁項集的所有非空子集也必須是頻繁的。因為假如p(i)< 最小支援度閾值,當有元素a新增到i中時,

結果項集(a∩i)不可能比i出現次數更多。因此a∩i也不是頻繁的。

2.2   連線步和剪枝步

在上述的關聯規則挖掘過程的兩個步驟中,第一步往往是總體效能的瓶頸。

apriori演算法採用連線步和剪枝步兩種方式來找出所有的頻繁項集。

1)  連線步

為找出lk(所有的頻繁k項集的集合),通過將lk-1(所有的頻繁k-1項集的集合)與自身連線產生候選k項集的集合。候選集合記作ck。設l1和l2是lk-1中的成員。記li[j]表示li中的第j項。

假設apriori演算法對事務或項集中的項按字典次序排序,即對於(k-1)項集li,li[1]2)  剪枝步

ck是lk的超集,也就是說,ck的成員可能是也可能不是頻繁的。通過掃瞄所有的事務(交易),確定ck中每個候選的計數,判斷是否小於最小支援度計數,如果不是,則認為該候選是頻繁的。

為了壓縮ck,可以利用apriori性質:任一頻繁項集的所有非空子集也必須是頻繁的,反之,如果某個候選的非空子集不是頻繁的,那麼該候選肯定不是頻繁的,從而可以將其從ck中刪除。

(tip:為什麼要壓縮ck呢?因為實際情況下事務記錄往往是儲存在外儲存上,比如資料庫或者其他格式的檔案上,在每次計算候選計數時都需要將候選與所有事務進行比對,

眾所周知,訪問外存的效率往往都比較低,因此apriori加入了所謂的剪枝步,事先對候選集進行過濾,以減少訪問外存的次數。)

2.3   apriori演算法例項

交易id    商品id列表

t100      i1,i2,i5

t200      i2,i4

t300      i2,i3

t400      i1,i2,i4

t500  i1,i3

t600  i2,i3

t700  i1,i3

t800     i1,i2,i3,i5

t900     i1,i2,i3

上圖為某商場的交易記錄,共有9個事務,利用apriori演算法尋找所有的頻繁項集的過程如下:

詳細介紹下候選3項集的集合c3的產生過程:從連線步,首先c3=,,,,,}(c3是由l2與自身連線產生)。根據apriori性質,頻繁項集的所有子集也必須頻繁的,可以確定有4個候選集,,,}不可能時頻繁的,因為它們存在子集不屬於頻繁集,因此將它們從c3中刪除。注意,由於apriori演算法使用逐層搜尋技術,給定候選k項集後,只需檢查它們的(k-1)個子集是否頻繁。

3. apriori偽**

演算法:apriori

輸入:d - 事務資料庫;min_sup - 最小支援度計數閾值

輸出:l - d中的頻繁項集

方法:l1=find_frequent_1-itemsets(d); // 找出所有頻繁1項集

for(k=2;lk-1!=null;k++)

lk=}

return l=所有的頻繁集;

procedure apriori_gen(lk-1:frequent(k-1)-itemsets)

for each項集l1屬於lk-1

for each項集 l2屬於lk-1

if((l1[1]=l2[1])&&( l1[2]=l2[2])&&……..

&& (l1[k-2]=l2[k-2])&&(l1[k-1]b)=p(b|a)=support_count(ab)/support_count(a)

關聯規則產生步驟如下:

1)  對於每個頻繁項集l,產生其所有非空真子集;

2)  對於每個非空真子集s,如果support_count(l)/support_count(s)>=min_conf,則輸出 s->(l-s),其中,min_conf是最小置信度閾值。

例如,在上述例子中,針對頻繁集。可以產生哪些關聯規則?該頻繁集的非空真子集有,,,,和,對應置信度如下:

i1&&i2->i5            confidence=2/4=50%

i1&&i5->i2            confidence=2/2=100%

i2&&i5->i1            confidence=2/2=100%

i1 ->i2&&i5            confidence=2/6=33%

i2 ->i1&&i5            confidence=2/7=29%

i5 ->i1&&i2            confidence=2/2=100%

如果min_conf=70%,則強規則有i1&&i5->i2,i2&&i5->i1,i5 ->i1&&i2。

資料探勘之關聯規則挖掘之Apriori演算法實現

演算法細節見 fast algorithm for mining association rules 控制台版本c 如下 include include include include include include include using namespace std 讀取檔案獲取整個資料庫儲存...

深度解析資料探勘關聯規則Apriori演算法

01 關聯規則挖掘背景和基本概念 如下所示的資料集,表中的每一行代表一次購買清單,注意我們只關心記錄出現與否,不關心某條記錄購買了幾次,如購買十盒牛奶也只計一次。資料記錄的所有項的集合稱為總項集,上表中的總項集 s 關聯規則 就是有關聯的規則,形式是這樣定義的 兩個不相交的非空集合x y,如果有 x...

資料探勘之關聯規則挖掘(Apriori演算法)

一 概述 本篇博文主要闡述資料探勘相關的關聯規則挖掘的演算法 apriori演算法 主要介紹關聯規則的基本概念 apriori演算法原理和apriori演算法例項,文章末尾處附加apriori演算法源程式。二 關聯規則挖掘的基本概念 關聯規則挖掘發現大量資料中項集之間有趣的關聯關係。如果兩項或者多項...