1. 程式人生 > >FP-Growth序列頻繁模式挖掘

FP-Growth序列頻繁模式挖掘

1演算法設計目標

輸入不同的命令是使用者使用Linux伺服器的基本途徑,通過長時間採集不同使用者在使用伺服器過程中所使用的命令序列,挖掘其中頻繁出現的命令序列,可以幫助我們瞭解使用者使用該伺服器的基本規律。

此外,如果存在多臺伺服器,那麼我們可以分析挖掘這些伺服器中使用者輸入的命令序列,挖掘其中存在的頻繁模式,可以瞭解使用者使用這些伺服器的根本目的。如果當這些伺服器被同一個黑客攻擊,或者這些伺服器遭受了同一種類型的攻擊,那麼我們挖掘出的頻繁命令模式中會存在黑客輸入的命令序列,據此可以嘗試理解黑客的攻擊手段,還原攻擊場景,為防範奠定基礎。

本專案擬採用FP-Growth演算法實現使用者輸入命令序列頻繁模式的挖掘,以在不同時間段採集到的使用者輸入命令序列為基礎,通過使用者

shell+ip+主機名按不同使用者的登入(三者都相同才視為同一使用者)構建事務,以此為基礎實現使用者輸入命令序列頻繁模式的挖掘

2 演算法基本原理

FP-Growth演算法主要解決挖掘在多個集合中出現次數達到一定閾值的頻繁項的集合。FP樹是一種輸入資料的壓縮表示,它通過逐個讀入事務,並把事務對映到FP樹中的一條路徑來構造,由於不同的事務可能會有若干個相同的項,因此它們的路徑可能部分重疊。路徑相互重疊越多,使用FP樹結構獲得的壓縮效果越好。下表顯示了一個數據集,它包含10個事務和5個項。

TID

1

{a, b}

2

{b, c, d}

3

{a, c, d, e}

4

{a, d, e}

5

{a, b, c}

6

{a, b, c d}

7

{a}

8

{a, b, c}

9

{a, b, d}

10

{b, c ,e}

2.1 FP樹構造的基本過程

在下圖給出了讀入三個事務之後的FP樹的結構以及最終完成構建的FP樹,初始,FP樹僅包含一個根節點,用符號null標記,隨後,用如下方法擴充FP樹:

Step1:掃描一次資料,確定每個項的支援度計數,丟棄非頻繁項,而將頻繁項按照支援度遞減排序,對於上面給出的資料集,出現頻度由高到低依次是a,b,c,d,e。

Step2:演算法第二次掃描資料集,構建FP樹,讀入第一個事務{a,b}後,建立標記為a和b的節點,然後形成null->a->b的路徑,對該事務編碼,該路徑上的所有節點頻度為1。

Step3:讀入第二個事務{b,c,d}之後,為項b,c,d建立新的節點集,然後連線null->b->c->d形成一條新的節點集,形成一條代表該事務的路徑,該路徑的每個節點的頻度計數也等於1,儘管前兩個事務有一個共同項b,但是他們的路徑不相交,因為這兩個事務沒有共同的字首

Step4:第三個事務{a,c,d,e}與第一個事務共享一個共同字首項a,所以第三個事務的路徑null->a->c->d->e與第一個事務的路徑null->a->b部分重疊,因為他們的路徑有重疊,所以節點a的頻度計數增加為2,而新建立的節點c,d和e的頻度計數等於1

Step5:繼續該過程直到每個事務都對映到FP樹的一條路徑,讀入所有的事務後形成FP樹

Step6:FP樹還包含一個連線具有相同項的節點的指標列表,這些指標再上圖中用虛線表示,有助於快速訪問樹中的項。


2.2 頻繁項挖掘的過程

FP-growth是一種以自底向上方式探索樹,由FP樹產生頻繁項集的演算法,給定上面構建的FP樹,演算法按e,d,c,b,a的順序在每一顆條件FP樹中遞迴查詢以其結尾的頻繁項集。由於每一個事務都對映到FP樹中的一條路徑,因此通過僅考察包含特定節點(例如e)的路徑,就可以發現以e結尾的頻繁項集,使用與節點e相關聯的指標,可以快速訪問這些路徑。

第一步收集包含e節點的所有路徑,這些初始的路徑稱為字首路徑,如下圖a所示。

Step1:由圖a中所顯示的字首路徑,通過把與節點e相關聯的支援度計數相加得到e的支援度計數。假定最小支援度為2,因為{e}的支援度是3所以它是頻繁項集

Step2:由於{e}是頻繁的,因此演算法必須解決發現以de,ce,be和ae結尾的頻繁項集的子問題,在解決這些問題之前,必須先將字首路徑轉化為條件FP樹,除了用於發現以某特定字尾結尾的頻繁項集之外,條件FP樹的結構與FP樹類似,條件FP樹通過以下步驟得到。

Step2.1:首先,必須更新字首路徑上的支援度計數,因為某些計數包含那些不含項e的事務。例如,下圖中的最右邊路徑null->b:2->c:2->e:1,包含並不含項e的事務{b,c},因此,必須將字首路徑上的計數調整為1,以反映包含{b,c, e}事務的實際個數。

Step2.2:刪除e的節點,修剪字首路徑,刪除這些節點是因為,沿這些字首路徑的支援度計數已經更新,以反映包含e的那些事務,並且發現以de,ce, be, ae結尾的頻繁項集的子問題不再需要節點e的資訊。

Step2.3:更新沿字首路徑上的支援度計數之後,某些項可能不再是頻繁的,例如,節點b只出現了一次,它的支援度計數等於1,這就意味著只有一個事務同時包含b和e,因為所有以be結尾的項集一定都是非頻繁的,所以在以後的分析中可以安全的忽略b。

Step2.4:e的條件FP樹顯示在下圖b中,該樹看上去與原來的字首路徑不同,因為頻度計數已經更新,並且節點b和e已經被刪除,由於不是單個路徑的樹,所以需要繼續挖掘。

Step2.5:FP增長使用e的條件FP樹來解決發現以de,ce,be,和ae結尾的頻繁項集的子問題,為了發現以de結尾的頻繁項集,從項e的條件FP樹收集d的所有字首路徑,通過將與節點d相關聯的頻度計數求和,得到項集{d,e}的支援度計數。因為項集{d,e}支援度計數等於2,所以它是頻繁項集,接下來,演算法採用上一個步驟中的方法構建de的條件FP樹。更新了支援度計數並刪除了非頻繁項c之後,de的條件FP顯示在下圖d中,因為該條件FP樹只包含一個支援度等於最小支援度的項a,是單路徑FP樹,所以將路徑上的節點排列組合與{e,d}組合,提取出{a,d,e}並轉到下一個子問題,產生以ce結尾頻繁項集,處理c的字首路徑後,只發現項集{c,e}是頻繁的,接下來,演算法繼續解決下一個子問題並發現項集{a,e}是剩下唯一的頻繁項集。

發現以e結尾的頻繁項集之後,演算法通過處理與節點d相關聯的路徑,進一步尋找以d為結尾的頻繁項集,繼續該過程,直到處理了所有與節點c,b和a相關聯的路徑為止。每一次遞迴,都要通過更新字首路徑中的支援度計數和刪除非頻繁的項來構建條件FP樹,由於子問題時不相交的,因此FP增長不會產生任何重複的項集,此外,與節點相關聯的支援度計數允許演算法在產生相同的字尾項時進行支援度計數。