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編碼樹。