天天看點

FP增長算法

Apriori原理:如果某個項集是頻繁的,那麼它的所有子集都是頻繁的。

Apriori算法:

Apriori算法是有缺點的

缺點是:1.需要多次掃描資料庫 2.産生大量的候選頻繁集 3.時間和空間複雜度高。

從算法第3步可以看出,候選頻繁項集不一定是原始資料集中某一項的子集,即:x為頻繁項,y為頻繁項,{x,y}可以組成一個候選頻繁項集,但是原始資料集中不一定存在{x,y}的組合。這使得Apriori算法有大量時間浪費在無效的集合上。

FP樹增長算法是一種挖掘頻繁項集的算法。Apriori算法雖然簡單易實作,效果也不錯,但是需要頻繁地掃描資料集,IO費用很大。FP樹增長算法有效地解決了這一問題,其通過兩次掃描資料集建構FP樹,然後通過FP樹挖掘頻繁項集。

背景知識

1.什麼是項和項集?

比如我們在購物的時候,購物車内的每一件商品成為一項,若幹個項的集合成為項集。例如{啤酒,尿布}成為一個二進制項集。

2.什麼是支援度?

支援度是在所有的項集中{X,Y}出現的可能性。

例如:購買商品的資料是(表示4條購物資訊):

                                           ①{啤酒,尿布,娃哈哈}

                                           ②{啤酒,友善面}

                                           ③{尿布,奶粉}

                                           ④{啤酒,尿布,洗髮乳}

在這組資料中,{啤酒,尿布}出現的可能性就是這裡面資料的機率。{啤酒,尿布}的支援度是2/4=50%.

{尿布,奶粉}的支援度是1/4=25%

3.什麼是頻繁項集?

我們首先設定一個最小門檻值A,支援度大于A的項集就是頻繁項集,小于A的項集被剔除。

比如 我們設定門檻值為30%,在上面的例子中{啤酒,尿布}就是頻繁項集,{尿布,奶粉}就要被剔除。

問題:如何求出頻繁項集?

首先構造FP樹 

然後通過FP樹可以求出頻繁項集

FP算法

FP增長算法

FP增長算法需要根據資料集生成FP樹,步驟如下:

步驟一:統計每個元素出現次數,保留頻繁元素(假設次數>3),按照元素出 現次數降序排序。

其中h,j,p,w,v,u,n,o,q,p,e,m的次數是小于等于3的.是以把它們去掉,然後把其他的字母按照次數從大到小排列。

FP增長算法

 步驟二:建構FP樹

通過上面的序列按照每一行進入樹根初始化樹葉。如果沒有相同的字母就重新建立葉子節點,每個葉子節點有字母其次數。

如圖所示

 先插入(z,r),再插入(z,x,y,s,t),再插入(z),如圖

FP增長算法

 最後插完的結果是:

FP增長算法

步驟三:FP樹中找到元素的字首路徑

以r為例,r的字首路徑為:以根結點為起點,結點r為終點的所有路徑。

先找到FP樹中所有“r”結點,然後從每一個“r”結點向根結點方向查找,找到的所有路徑就是“r”的字首路徑

FP增長算法

然而,找到所有“r”結點,需要周遊整棵FP樹,這使得算法的時間複雜度會很高。

 為了友善查找,可以用連結清單來加快尋找的字首路徑。

将FP樹中所有相同的結點用連結清單連接配接,可以将查找結點的時間複雜度從O(n)降到常數級。

FP增長算法

通過上面的操作就得到了如下所示的資訊。

FP增長算法

步驟四:根據字首路徑構造條件FP樹

t的條件FP樹如下:

FP增長算法

 t字首路徑中的頻繁元素包括{z:3,x:3,y:3},這個數字表示對應的元素在原始資料集中和t一起出現的次數,如{z,t}出現3次,{x,t}出現3次,{y,t}出現3次。顯然,這些項集都是頻繁項集。

很容易發現,t的字首路徑也是一個資料集,生成t條件FP樹的過程,跟前面生成FP樹的過程相同,我們也可以在t的條件FP樹基礎上構造x的條件FP樹,對應的就是{t,x}的條件FP樹。

顯然,這是個遞歸的過程。

步驟5:遞歸構造下一層條件FP樹,直至條件FP樹為空.

總結: