1. 程式人生 > >關聯分析Apriori演算法(python)

關聯分析Apriori演算法(python)

小夥伴們,繼續一起學習機器學習演算法啦,今天學習關聯分析、Apriori演算法啦!大家肯定很熟悉一個故事-沃爾瑪超市資料總結出的啤酒與尿布的相關性(知乎上也有牛人們在討論這個故事的真假)


圖1

來自《機器學習實戰》這本書裡提到的一個例子,展示瞭如下的一個購物清單:



圖2

在上述購物交易單中發現,{尿布,葡萄酒}出現的次數較多,辣麼,他們之間真的有木有關係呢?這就需要關聯分析。

關聯分析:在大規模資料集中尋找有趣關係的任務。這些關係可以有兩種形式:頻繁項集或者關聯規則。頻繁項集(frequent item sets)是指經常出現在一起的物品的集合,關聯關係(association rules)暗示兩種物品之間可能存在很強的關係。比如上面的{尿布,葡萄酒}就頻繁出現,他們之間可能存在一些關係,辣麼,如何來確定是否是頻繁項集呢?主要是依靠支援度和可信度。

一個項集的支援度(support)被定義為資料集中包含該項集的記錄所佔的比例。比如,圖2中{豆奶}的支援度為4/5。支援度是針對項集來說的,因此可以定義一個最小支援度,而只保留滿足最小支援度的項集。可信度或置信度(confidence)是針對一條諸如{尿布}->{葡萄酒}的關聯關係來定義的。這條規則的可信度被定義為“支援度({尿布,葡萄酒})/支援度({尿布})”

可是,如何計算一個集合中的頻繁項集的支援度,首先需要遍歷全部可能的項集,比如針對一個包含了4個產品的集合,那麼購買該集合產品的可能集合數目為2^4-1=15,而針對包含N項的集合,就需要遍歷2^N-1。顯然,這樣的計算量很大。因此,出現了Apriori原理。

Apriori原理:如果某個項集是頻繁的,那麼它的所有子集也是頻繁的。該定理的逆反定理為:如果某一個項集是非頻繁的,那麼它的所有超集(包含該集合的集合)也是非頻繁的。Apriori原理的出現,可以在得知某些項集是非頻繁之後,不需要計算該集合的超集,有效地避免項集數目的指數增長,從而在合理時間內計算出頻繁項集。

Apriori演算法實現:Apriori演算法是發現頻繁項集的一種方法。Apriori演算法的兩個輸入引數分別是最小支援度和資料集。該演算法首先會生成所有單個物品的項集列表->接著掃描交易記錄來檢視哪些項集滿足最小支援度要求,其中不滿足最小支援度的集合會被去掉->然後對剩下的集合進行組合以生成包含兩個資料集的項集->接著重新掃描交易記錄,去掉不滿足最小支援度的項集->該過程重複進行直到所有項集都被濾掉。

Apriori演算法Python程式設計

1)準備資料



圖3

在圖2中提到的createC1()函式中的C1指的是最原始的待選項集,也就是所有單個物品的項集列表;為什麼這裡將C1轉換為frozenset,而不是一般額set呢,簡單解釋:

set無序排序且不重複,是可變的,有add(),remove()等方法。既然是可變的,所以它不存在雜湊值。基本功能包括關係測試和消除重複元素. 集合物件還支援union(聯合), intersection(交集), difference(差集)和sysmmetric difference(對稱差集)等數學運算。sets 支援 x in set, len(set),和 for x in set 。作為一個無序的集合,sets不記錄元素位置或者插入點。因此,sets不支援 indexing, 或其它類序列的操作。

frozenset是凍結的集合,它是不可變的,存在雜湊值,好處是它可以作為字典的key,也可以作為其它集合的元素。缺點是一旦建立便不能更改,沒有add,remove方法。詳情見set與frozenset

2)過濾函式:根據待選項集Ck的情況,判斷資料集D中Ck元素的出現頻率,過濾掉低於最低支援度的項集。



圖4

3)當待選項集不是單個元素時,比如K>=2的情況下,合併元素時容易出現出現重複,因此針對包含K個元素的頻繁項集,對比每個頻繁項集第K-2位是否一致。詳情如下:



圖5


圖6

4)Apriori演算法核心



圖7

基於上述演算法,模擬得到,不同的最小支援度得到的頻繁項集是不同的。

當minSupport=0.5時,得到的頻繁項集是:[[frozenset([1]), frozenset([3]), frozenset([2]), frozenset([5])], [frozenset([1, 3]), frozenset([2, 5]), frozenset([2, 3]), frozenset([3, 5])], [frozenset([2, 3, 5])], []]

當minSupport=0.7時,得到的頻繁項集是:[[frozenset([3]), frozenset([2]), frozenset([5])], [frozenset([2, 5])], []];

實際每個項集的支援度為:{frozenset([5]): 0.75, frozenset([3]): 0.75, frozenset([3, 5]): 0.5, frozenset([4]): 0.25, frozenset([2, 3]): 0.5, frozenset([2, 5]): 0.75, frozenset([1]): 0.5, frozenset([2]): 0.75}

基於Apriori演算法,從頻繁項集挖掘關聯規則

基於Apriori演算法可以獲得頻繁項,基於這些頻繁項集可以產生很多關聯規則。如果能夠減少規則數目來確保問題的可解性,可以較大的減少計算複雜度。易知,如果某條規則不滿足最小可信度要求,那麼該規則的所有子集也不會滿足最小可信度要求。利用關聯規則的上述性質,基於Apriori演算法,首先從一個頻繁項集開始,接著建立一個規則列表,其中規則右部只包含一個元素,,然後對這些規則進行測試。接下來合併所有的剩餘規則列表來建立一個新的規則列表,其中規則右部包含兩個元素。這種方法稱作分級法。



圖8


圖9 針對圖8張函式說明

好噠,關於Apriori演算法的初步學習基本到這裡,希望對大家有用,歡迎大牛不吝賜教哈,各位朋友,晚安、早安啦~~