1. 程式人生 > >Apriori演算法+FP-Growth演算法

Apriori演算法+FP-Growth演算法

Apriori演算法

一、關聯分析

關聯分析是在大規模資料集中尋找有趣關係的任務,有兩種形式:頻繁項集(frequent item sets)和關聯規則(association rules)。頻繁項集是經常出現在一塊兒的物品的集合,關聯規則暗示兩種物品之間可能存在很強的關係。

 

1、一個項集的支援度(support被定義資料集中包含該項集的記錄所佔的比例。

支援度是針對項集來說的,因此可以定義一個最小支援度,而只保留滿足最小值尺度的項集。

sup({A,B})={A,B}同時出現的記錄數/總的記錄數

 

2、可信度置信度(confidence是針對關聯規則來定義的。規則{尿布}->{啤酒}的可信度被定義為"支援度({尿布,啤酒})/支援度({尿布})",由於{尿布,啤酒}的支援度為3/5,尿布的支援度為4/5,所以"尿布->啤酒"的可信度為3/4。這意味著對於包含"尿布"的所有記錄,我們的規則對其中75%的記錄都適用。

可信度類似於貝葉斯公式,con(A->B)=sup({A,B})/sup({A})   【P(B|A)=P(AB)/P(A)】

 

二、Apriori原理

按照關聯分析中支援度的計算方法,需要遍歷每條記錄並檢查是否包含指定項集,對於包含N中物品的資料集共有2^N−1種項集組合,重複上述計算過程是不現實的。

 

因此為減少計算量,引入Apriori原理:

(1)如果某個項集是頻繁的,那麼它的所有子集也是頻繁的

(2)如果一個項集是非頻繁的,那麼它的所有超集也是非頻繁的。

 

三、Apriori演算法

(一)發現頻繁項集

Apriori演算法的兩個輸入引數分別是最小支援度和資料集。步驟:

1、首先會生成所有單個元素的項集列表。接著掃描資料集,計算每個項集的支援度,根據最小支援度要求刪除那些不滿足的集合。得到單個元素的頻繁項集。

2、然後由單個元素的頻繁項集生成包含2個元素的項集列表。接著掃描資料集,計算每個項集的支援度,根據最小支援度要求刪除那些不滿足的集合。得到2個元素的頻繁項集。

……

該過程重複進行直到所有項集都被去掉。

虛擬碼????

 

(二)產生關聯規則

一旦找出了頻繁項集,就可以直接由它們產生強關聯規則

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

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

 

四、python實現

Apriori.py。

 

FP-Growth演算法 

FP-growth用於挖掘頻繁項集,只需要對資料集掃描兩次,而Apriori演算法對於每個潛在的頻繁項集都會掃描資料集繼而判定給定模式是否為頻繁項集,因此FP-growth演算法的速度要比Apriori演算法快。

1、基本過程:(1)構建FP樹;(2)從FP樹中挖掘頻繁項集。

2、優點:一般要快於Apriori

3、缺點:實現比較困難,在某些資料集上效能會下降

4、適用資料型別:離散型資料

一、FP樹(Frequent Pattern Tree)

FP-growth演算法將資料儲存在一中成為FP樹的緊湊資料結構中。

一棵FP樹看上去與電腦科學中的其他樹結構類似,但是它通過連結(link)來連線相似元素,被連起來的元素項可以看成一個連結串列。

但是與樹不同的是,一個元素項可以在一棵FP樹中出現多次。存在相似元素的集合會共享樹的一部分。只有當集合之間完全不同時,樹才會分叉。

FP樹的樹節點上會儲存單個元素、及其在資料集中的出現頻率,而每個項集會以路徑的方式儲存在樹中,且可以通過該路徑最末尾的樹節點上元素的頻率來判斷該路徑的出現次數

 

相似項(即相似節點,指值相同的節點)之間的連結稱為節點連結(node link),用於快速發現相似項的位置。

 

二、FP-growth演算法

(一)構建FP樹

需要構建一個專門的資料類,用於存放FP樹。

FP樹其實是一棵字首樹,按支援度降序排列,支援度越高的頻繁項離根節點越近,從而使得更多的頻繁項可以共享字首。

這裡的支援度是指單個元素在資料集中的出現次數。????如果一條記錄中同一元素出現多次,如何計算???

 

首先,對該事務型資料庫進行一次掃描,計算每一行記錄中各種物品的支援度,然後按照支援度降序排列,僅保留頻繁項集,剔除那些低於支援度閾值的項。

然後,建立一張項的頭表(header table)。這張表的第一列是按照降序排列的頻繁項。第二列是指向該頻繁項在FP-tree中節點位置的指標。FP-tree中每一個節點還有一個指標,用於指向相同名稱的節點。——python中,頭表使用字典型別,除存放指標外,還可以用來儲存FP樹中每類元素的總數。

最後,對事務型資料庫進行第二次掃描,根據每條記錄,構建路徑。在構建時,讀取每個項集並將其新增到一條已經存在的路徑中。如果該路徑不存在,則建立一條新路徑。

 

(二)挖掘頻繁項集

思路與Apriori相類似,從單元素項集開始,在此基礎上逐步構建更大的集合

基本步驟:

(1)從FP樹中獲得條件模式基

(2)利用條件模式基,構建一個條件FP樹

(3)迭代重複步驟(1)、(2),直到樹包含一個元素項為止

 

1、條件模式基(conditional pattern base)

條件模式基是以“所查詢的元素項”為結尾的路徑集合。每一條路徑其實都是字首路徑(prefix path)。一條字首路徑是指介於所查詢的元素項與樹根節點之間的所有內容

為得到這些字首路徑,可以對樹進行窮舉式搜素;也可以利用頭指標連結串列進行查詢。因為頭指標表包含相同型別元素連結串列的起始指標。一旦到達每一個元素項,就可以上溯這棵樹直到根節點為止。

2、構建條件FP樹

對於每個頻繁項,可以使用條件模式基作為輸入資料,利用建立FP樹的程式碼構建一個條件FP

存在某個元素,屬於頻繁項,但在條件FP樹中並不是頻繁項。