GSpan-頻繁子圖挖掘算法


GSpan頻繁子圖挖掘算法,網上有很多相關的介紹,中文的一些資料總是似是而非,講的不是很清楚(感覺都是互相抄來抄去,,,基本都是一個樣,,,),仔細的研讀了原論文后,在這里做一個總結。

1. GSpan頻繁子圖挖掘算法:

總的思想是,先生成頻繁樹,再在頻繁樹的基礎上,生成頻繁子圖,滿足最小支持度,滿足最小DFS編碼的所有頻繁子圖。

GraphGen.

輸入:圖集 GD,最小支持度閾值 min_sup;

輸出:頻繁子圖集合 FG.

(1)     掃描圖集並找到圖集 GD 中所有頻繁邊;

(2)     刪除所有非頻繁邊;

(3)     E→{GD中所有頻繁邊};

(4)     將 E 中的邊按 DFS 編碼順序(后文中有介紹)和頻率的降序進行排列;

(5)    T→NULL; /*T為頻繁子樹集合*/

(6)     t→e1; /*E中的第 1 條邊作FTGen的初始值*/

(7)     FTGen(D,t,E,T); /*頻繁樹生成算法*/(后文中有介紹)

(8)     將集合 T 中的元素按節點數與 DFS 編碼順序進行排序;

(9)     FG→T;

(10)  for T 中的每棵樹

(11)         g→t;

(12)         E‘{e頻繁邊,且 e 內邊(后文中有介紹),並能在圖集中找到(g<>e)};

(13)         for E' 中的每條邊 

(14)               E' →E‘ - e;

(15)                       g→g<>e;

(16)                       if g ≠ min(g) then break;

(17)                       if FG中無 g 的同構子圖 then FG <— FG‘ ∪ g;

(18)             endfor;

(19)    endfor;

(20)    return FG;

GraphGen 分為 3 個部分,算法 2 給出了這種算法的細節.

算法在第 1 部分(第 1 行~第 6 行)對圖集 GD進行預處理.作為圖挖掘的基礎,必須從圖集中提取出必要的 信息,如頻繁邊集、頻繁節點集等.在這一部分中,GraphGen 掃描圖集 GD並得到頻繁邊集,將頻繁邊集按頻率遞 減與 DFS 編碼值遞增的順序進行排列,供算法進一步計算。

算法在第 2 部分(第 7 行)進行頻繁子樹的挖掘工作,具體的挖掘過程后面的頻繁樹生成算法。

算法的第 3 部分(第 8 行~第 19 行)是由樹向圖的擴展過程.針對每一棵頻繁子樹,從頻繁邊集中找出能與之 聯接的內邊,逐一加入到該樹,從而形成頻繁子圖.算法在第 12 行找到所有能與圖 g 聯接的頻繁內邊,並將這些 邊在第 13 行~第 17 行的子循環中加入到圖 g 中.算法的執行結果為頻繁子圖集合 FG。

與FTGen相似,算法GraphGen主體的時間復雜性也分為兩部分:一部分是子圖同構的時間復雜性.由於子圖 同構的測試是NP完全問題,算法在第 17 行進行的圖同構測試,其時間復雜性為O(2n);另一部分是擴展邊的時間 復雜性.由於我們僅向頻繁圖中加入內邊,通過兩層循環完成,因此,這部分時間復雜性為O(n2).邊的每一次擴展, 都需要檢驗所生成的圖是否與結果集的元素重復,因此,算法總的時間復雜性為O(2n·n2)。

2. 算法 2. FTGen.頻繁子樹生成算法

輸入:圖集 GD,頻繁子樹 t,頻繁邊集 E;

輸出:頻繁子樹集 T.

(1)      if t ≠ min(t) then return; /*檢查 t 是否具有最小 DFS 編碼*/(后文中有介紹)

(2)        E‘ <— {e是頻繁外邊};

(3)     for E‘ 中的每條邊

(4)           E‘ <— E‘ e;

(5)           if (t<>e)存在於圖集中;

(6)           then t <— t<>e;

(7)           if (T中無 t 的同構子樹) then T<—T∪ t;

(8)                FTGen(GD,t,E,T);

endfor;

3. 定義:外邊,內邊:

在圖的擴展過程中,如果一條擴展邊引入了一個新的節點,則稱該擴展邊為外邊,由eo表示.若該擴 展邊未引入新的節點(擴展邊的兩個節點已存在於該圖中),則稱其為內邊。

4. 定義:最小DFS編碼:

4.1 什么是DFS編碼?

 對圖進行深度優先遍歷

  所有節點根據發現時間排序

  最后發現的節點叫做最右節點

  從第一個節點到最右節點的直線路徑叫做最右路徑

  所有邊表示為五元組(i,j,ni,lij,nj)

  前向邊i<j

  后向邊i>j

  邊的排序:e1<e2, if

  同是前向邊,且j1<j2

  同是后向邊,且i1<i2或者i1=i2&& j1<j2

  e1是前向邊,e2是后向邊,且j1<=i2

  e1是后向邊,e2是前向邊,且i1<j2

  根據邊的次序得到的邊序列是圖的DFS編碼

eg:

 

最小DFS編碼:

eg:

4.2 DFS編碼樹:

4.3 DFS樹的剪枝:

剪枝后的所有生成樹,DFS編碼最小的就是最小DFS編碼樹。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM