gSpan算法研究

摘要

 

隨着信息技術的不斷髮展,人類可以很容易地收集和儲存大量的數據,然而,如何在海量的數據中提取對用戶有用的信息逐漸地成爲巨大挑戰。爲了應對這種挑戰,數據挖掘技術應運而生,成爲了最近一段時期數據科學的和人工智能領域內的研究熱點。數據集中的頻繁模式作爲一種有價值的信息,受到了人們的廣泛關注,成爲了數據挖掘技術研究領域內的熱門話題和研究重點。

傳統的頻繁模式挖掘技術被用來在事務數據集中發現頻繁項集,然而隨着數據挖掘技術應用到非傳統領域,單純的事務數據結構很難對新的領域的數據進行有效的建模。因此,頻繁模式挖掘技術需要被擴展到了更爲複雜的數據結構上。

圖不但可以對數據實體進行建模,還可以對數據實體之間的複雜關係進行建模,因此圖可以作爲一個通用的數據模型,故而與圖有關的模式挖掘的研究就顯得相當重要。在圖數據集中挖掘頻繁子圖模式是一種困難的問題,雖然至今已經提出了很多的算法,但在將算法應用在具體應用問題上的時候,仍然存在很多待解決的問題。

gSpan算法是用於靜態頻繁子圖挖掘的經典算法。然而除了靜態圖,目前使用圖模型進行建模的具體應用很多都呈現出動態特性。因此本文試圖將用於靜態頻繁子圖挖掘的gSpan算法應用於動態網絡。

本文首先介紹頻繁子圖挖掘問題的基本概念和相關算法,國內外的研究現狀,並闡述頻繁子圖挖掘算法研究的應用背景和現實意義。然後詳細介紹gSpan算法的基本思想和實現方法,並在靜態圖集數據和動態網絡數據上對實現的程序進行測試,並分析算法的侷限性和改進的方向。

 

關鍵詞: 數據挖掘 圖挖掘 頻繁子圖挖掘 頻繁模式挖掘 gSpan

 

 

ABSTRACT

With the continuous development of information technology, it is easy to collect and store a large amount of data. However, how to extract useful information from the massive data becomes a big challenge. In order to deal with this challenge, data mining technology emerges, and has become a hotspot in the field of data science and artificial intelligence. As a kind of valuable information, the frequent patterns in data sets have been paid more and more attention and become a hot topic in the field of data mining. 

Traditional frequent pattern mining techniques were used in the transaction data set to find frequent item sets, but with the application of data mining technology to the nontraditional areas, it is difficult to model new domain data by using transaction data structure. So frequent pattern mining techniques need to be extended to more complex data structures. 

Graph not only can be used to model the data entities, also can be used to model the complex relationship between data entities, so the Graph can be used as a common data model, therefore the research on Graph mining is very important. Mining frequent subgraph patterns in graph set is a difficult problem. Although many algorithms have been proposed so far, when the algorithm is applied in the specific application problems, there are still many problems to be solved. 

GSpan algorithm is a classical algorithm for static frequent subgraph mining. However, in addition to static graphs, many of the specific applications that are currently modeled with the graph are presented with dynamic characteristics. Therefore, this paper attempts to apply the gSpan algorithm for static frequent subgraph mining to dynamic networks. 

This paper first introduces the basic concepts and related algorithms of frequent subgraph mining, the research status at home and abroad. Then I will introduce the basic idea and implementation method of gSpan algorithm in detail, and carries on the test on the static graph set data and the dynamic network data to the program, and analyzes the limitation of the algorithm and the direction of improvement.

 

 

Keywords:    data mining graph mining frequent subgraph mining frequent pattern mining gSpan 

 

 

目錄

目錄

封面    1

摘要    3

ABSTRACT    I

目錄    I

第1章 緒論    1

1.1 研究背景    1

1.2 國內外研究現狀    2

1.3 研究目的和主要內容    3

1.4 論文的組織結構    4

第2章 基礎理論    5

2.1 圖論基礎    5

2.2 頻繁子圖挖掘基礎    5

2.3 頻繁子 圖挖掘算法的一般過程    7

2.3.1 候選生成    7

2.3.2 候選剪枝    8

2.3.3 處理圖同構    8

2.3.4 支持度計數    8

2.4 本章小結    8

第3章 靜態頻繁連通子圖挖掘算法    9

3.1 模式增長方法:一個樸素的算法框架    9

3.2 gSpan算法思想    10

3.2.1 圖的規範化表示和規範化擴展思想概述    11

3.2.2 圖的序列化    12

3.2.3 規範化表示    13

3.2.4 規範化擴展    13

3.3 gSpan算法介紹    14

3.3.1 gSpan算法框架    14

3.3.2 gSpan算法分析    16

第4章 算法實現和性能測試    18

4.1 算法實現    18

4.1.1 程序總體設計    18

4.1.2 類的詳細設計    19

4.1.3 程序編碼實現    26

4.2 實驗分析    26

4.2.1 實驗環境介紹    26

4.2.2 實驗數據介紹    26

4.2.3 實驗結果分析    27

第5章 總結和展望    31

5.1 總結    31

5.2 展望    31

致謝    33

參考文獻    34

 

 

  1. 緒論

     

  2. 研究背景

    大數據和雲計算技術的發展使得存儲並分析大量的數據成爲可能。然而從大量的數據中發現有用的模式是一個很大的挑戰。通常,由於目標數據量太大,我們根本無法使用傳統的數據分析工具和技術處理。有時候,即使數據量相對較小,但是由於數據本身具有非傳統的特點,使得我們也不能利用傳統的方法和技術處理這些數據。

    數據挖掘技術是一種用於處理大規模數據的思維方法和技術手段,它是在信息時代數據爆炸的背景下產生的。因爲數據的擁有者很難從海量的數據中獲取有用的信息和知識,這促使人們產生了對數據分析技術的強烈需求。

    數據挖掘技術現在已經被廣泛用於零售,保險,電信,銀行等領域的數據分析。由於數據挖掘技術在各種信息產業中的廣泛應用而且具有很大的實用價值,數據挖掘技術逐漸的成爲了數據科學領域的研究重點。

    頻繁模式挖掘是數據挖掘研究中的一個重要問題。頻繁模式挖掘技術最初被用於"購物籃分析"。在由購物籃數據構成的事務數據集中發現頻繁項集,進而發現高置信度的關聯規則,進而爲超市的銷售策略提供建議。頻繁模式挖掘技術 在數據挖掘技術中扮演了很重要的角色,不但能作爲關聯規則分析的基礎,還能將對象的頻繁模式作爲對象的特徵,進而在分類和聚類等其它數據挖掘任務中發揮基礎作用。

    最初,頻繁模式挖掘只適用於有限的數據表示,比如購物籃數據。然而真實的應用需求需要處理不同的數據類型。隨着研究的深入,頻繁模式挖掘所涉及的數據模型,也從最初的集合,到序列,樹,柵欄和圖。圖數據廣泛存在於我們的生活中,如化合物分子結構數據,蛋白質相互作用網絡數據,萬維網數據,社交網路數據,因此基於圖的頻繁模式挖掘算法的研究很有必要。圖作爲一種通用的數據結構可以對數據實體以及實體之間的複雜關係進行建模,因此頻繁子圖模式的挖掘在頻繁模式挖掘中有着重要的地位,受到了更多的關注。

    後來,隨着研究的深入,研究者試圖將頻繁子圖模式的概念拓展到動態網絡。因爲很多複雜的系統都是隨着時間不斷演化的,靜態網絡建模的建模方法在某種程度上具有很大的侷限性。因爲隨着時間的變化,人與人之間的關係也會發生變化;生物系統也在不斷地發生變化,從更長遠的時間角度來看,生物物種在進化過程中,其分子網絡結構在不斷地發生着。從一個人的生命的範圍來看,一個人從孕育、成長、衰老到死亡,其身體內部的分子網絡在不斷地發生變化。所以複雜網絡的變化幾乎是無時無刻不再發生的。對複雜網絡的某一時刻的快照進行分析,必然會失去與其動態特性有關的有用模式。隨着圖挖掘技術的不斷髮展,研究者試圖將靜態頻繁子圖挖掘算法應用於動態網絡進而分析動態網絡中的頻繁模式[2]

    本論文以此背景爲出發點,主要研究與靜態頻繁子圖挖掘有關的算法並試圖將其應用於動態網絡。

  3. 國內外研究現狀分析

    在很多的複雜系統中,實體和實體之間具有複雜的聯繫,這種複雜的關係很難使用一般的數據結構加以表達。圖數據結構作爲表述複雜關係的一種通用數據結構,成爲了數據挖掘研究的熱點和難點。在社交網絡分析中,人與人之間的關係可以抽象爲一個圖,其中每個人可以作爲圖中的頂點,人與人之間的關係可以被抽象爲圖中的邊。因此,對社會羣體的分析,就轉化爲了對社交網絡拓撲結構和頂點屬性的分析。在生物科學領域,生物學家發現蛋白質基因結構配位實驗是費時費力的工作,他們希望使用數據挖掘技術,以提高結構匹配實驗的效率。蛋白質的複雜結構可以被描述爲圖,其中氨基酸是圖的頂點,而接觸殘基則是頂點之間的邊。通過對蛋白質結構圖集的挖掘可以預先發現蛋白質結構之間的內在關係或者共享模式。在一組圖上面挖掘頻繁子圖具有很重要的意義。頻繁子圖傳遞了很多有意義的結構化信息,比如熱點網絡訪問模式,公共蛋白質結構,對象識別中的共享模式,電子支付中的欺詐檢測等。正是由於這些應用的迫切要求,圖挖掘成爲數據挖掘領域研究的一個熱點。

    頻繁子圖挖掘算法的核心是圖的同構測試。在過去四十年裏,許多著名的圖的同構測試算法被發現。例如J. R. Ullmann的回溯法和B. D. McKay的貪心算法,以及大量的近似算法。然而,頻繁子圖挖掘問題並沒有很好的被解決。在化學信息學領域,一些高效的算法被設計出來,用以在一組化合物中發現頻繁的公共子結構。L. Dehaspe et al. 使用化合物的公共子結構來預測化合物的毒性。然而這些系統都難以應用大規模較大的數據集上,可拓展性並不是很好。L. B. Holder et al. 提出了SUBDUC算法用來挖掘近似的子結構模式,所以其不能挖掘全部的頻繁模式。2000年左右,Inokuchi et al. 提出了一種基於Apriori的算法AGM用來發現頻繁子圖模式。後來Kuramochi Karypis進一步發展了Apriori的思想,使用一種更高效的圖的表示結構和邊的增長策略。這個算法叫做FSG,獲得了巨大的性能提高。

    AGMFSG都利用了Apriori的模式增長思想。這些方法雖然減少了搜索空間,但仍然存在一些致命的問題,使得算法的執行要浪費很多的時間。比如:

    1. 大量的候選生成
    2. 多次掃描數據庫
    3. 比較耗費時間的同構測試
    4. 難以發現比較大的頻繁子圖模式

    爲了避免這些問題,2002年,X. Yan等人提出了一種高效的利用深度優先策略搜索子圖空間的方法,並在此基礎上給出了基於圖的子結構模式挖掘算法gSpan[4]GSpan算法不同於AGMFSG算法,它沒有采用Apriori的思想,而是利用邊模式增長的方式深度優先挖掘頻繁子圖。隨後在2003年,他們在gSpan算法的基礎上進一步提出了挖掘頻繁閉合子圖的算法CloseGraph,頻繁閉合子圖是頻繁子圖的壓縮表示。它可以有效地去除冗餘的頻繁子圖,減少結果集的大小,並能保證不丟失任何信息。

    當然,還有很多相關的研究成果,這裏不再贅述。綜上所述,圖模式挖掘算法多種多樣,應用廣泛。雖然,圖模式挖掘具有很高的複雜性,但是該領域的研究已經展現出廣闊的發展空間和蓬勃的生機。

  4. 論文主要內容和組織結構

  5. 論文主要內容

    圖數據結構對實體集合及其之間的關係具有強大的建模能力,因而圖數據結構被廣泛用於對現實生活中各種各樣複雜的系統進行建模。作爲大數據一部分的圖結構數據,是大數據中最難以分析的一部分,因此如何從圖結構數據中提取有用的模式和知識,進而幫助我們預測網絡的變化和發展至關重要。

    本文圍繞靜態頻繁子圖挖掘算法中的gSpan算法進行研究,獨自實現gSpan

    算法並將其應用於動態網絡數據,發現動態網絡演化過程中穩定存在的模式。

  6. 論文組織結構

    本文各章節的內容組織如下:

    第一章:論述研究背景,介紹國內外的研究現狀,闡明瞭本文的主要研究內容和組織結構。

    第二章:簡要介紹靜態頻繁子圖挖掘的數學基礎和有關概念。重要闡述了頻繁子圖挖掘的基本定義和基礎知識,圖論的基礎知識,頻繁子圖挖掘中遇到的問題,一些基礎的頻繁子圖挖掘技術和思想。最後介紹了幾個著名的頻繁子圖挖掘算法及其主要技術。

    第三章:詳細介紹與gSpan有關的基本概念,包括DFS編碼,DFS字典序,DFS編碼樹等。詳細介紹gSpan算法的僞代碼。

    第四章:詳細介紹gSpan算法實現的總體設計和詳細設計。重點介紹gSpan算法實現的數據結構。介紹算法分別在靜態圖集數據和動態網絡數據上的測試結果,詳細地分析測試結果。

    第五章:總結和展望。總結在本論文中所做的研究工作,分析本論文所做工作的不足之處,指出可以改進的方向。

     

  7. 圖挖掘相關基礎

  8. 圖論基礎

    圖是一種用來對數據實體以及數據實體之間的複雜關係進行建模的數據結構,可以作爲一種通用的數據模型對數據進行建模。也就是說,任何的數據模型,包括序列,集合,樹等數據結構都可以一般化爲圖數據結構。圖由頂點和邊構成,一般我們只考慮頂點和邊的連接關係,而不考慮其具體的位置。其中頂點代表任意的實體,邊代表實體之間的關係。爲了增強圖模型的表達能力,我們還可以爲圖的頂點和邊賦予任意的標號或者標號組,用於表示頂點和邊所具有的屬性或者屬性集合。下面,給出圖的一些形式化的定義。

    定義2.1 技術分享包含頂點集技術分享和邊集技術分享。因此圖的本質是頂點集上的二元關係。若二元組技術分享是有序的,即技術分享,則圖技術分享有向圖directed graph)。若二元組技術分享是無序的,即技術分享,則圖技術分享無向圖undirected graph)。一般在有向圖中,用技術分享來表示頂點技術分享到頂點技術分享之間有一條邊。在本文中,若不特別指出,圖一般指的是無向圖[2]

    定義 2.2 子圖 G‘=(V‘, E‘)是另一個圖G=(V, E)的子圖,如果它的頂點集V‘V的子集,並且它的邊集E‘E的子集。子圖關係記作技術分享[2]

    定義2.3 兩個圖技術分享技術分享同構的,當且僅當頂點集技術分享技術分享之間存在雙射,即技術分享中的任意兩個頂點技術分享若有邊相連,則這兩個頂點在技術分享的映射頂點之間也有邊相連[2]

     

  9. 頻繁子圖挖掘基礎

     

    什麼纔是圖數據集上有用的模式呢?頻繁模式就是一種有用的模式,因爲頻繁出現的模式可能代表着這個數據集上比較本質的東西,當然也不排除代表着比較普通的東西。圖數據集上的頻繁出現的模式就是頻繁子圖。考慮到一組具有抗癌作用的化合物集合,是什麼樣的共性使得這組藥物具有抗癌的作用呢?也就是抗癌的效用是如何體現在分子的結構上的 。我們可以做出判斷,在這組化合物上頻繁出現的子結構模式可能代表了抗癌的效用的本質。因此,我們想知道如何才能在這組化合物上發現頻繁的子結構模式。如果把化合物抽象爲圖,其中圖的頂點表示化合物的原子,圖中的邊表示化合物的化學鍵,那麼,我們就可以通過挖掘圖集中的頻繁出現的子圖模式來發現化合物數據集中頻繁出現的子結構模式,以此來發現這組化合物抗癌效用的本質。這將爲人工合成新的抗癌藥物提供參考。除此之外,頻繁子圖挖掘還有很多應用,如表 21所示[3]

     21 不同應用領域中實體的圖形表示

     

    圖形

    頂點

    Web挖掘

    Web瀏覽模式

    Web頁面

    頁面之間的超鏈接

    計算化學

    化學化合物的結構

    原子或離子

    原子或離子之間的鍵

    網絡計算

    計算機網絡

    計算機和服務器

    機器之間的關聯

    語義Web

    XML文檔的集合

    XML元素

    元素之間的父子聯繫

    生物信息學

    蛋白質結構

    氨基酸

    接觸殘基

     

    定義 2.4 支持度 給定圖的集合ζ,子圖g的支持度定義爲包含它的所有圖所佔的百分比,即[3]

        技術分享     

    定義 2.5 頻繁子圖挖掘    給定圖的集合技術分享和支持度閾值minsup,頻繁子圖挖掘的目標是找出使得技術分享的子圖g[3]

    儘管該定義適用於所有類型的圖,但是本文主要關注無向連通圖(undirected, connected graph)。這種圖的定義如下:

    1. 一個圖是連通的,如果圖中每對頂點之間都存在一條路徑;其中,路徑是頂點的序列<v1v2v3…vk>,使得序列中的每對相鄰的頂點(vi,vi+1)之間都有一條邊。

    1. 如果一個圖是無向的,如果它只包含無向邊。一條邊(vi, vj是無向的,如果它與(vj,vi)沒有任何區別。

    頻繁子圖挖掘是一項計算量很大的任務,因爲搜索空間是指數級的。爲了解釋這項任務的複雜性,考慮包含d個數據實體的數據集。在頻繁子圖挖掘中,每個實體是一個項,待考察的搜索空間大小是2d,這是可能產生的候選項集的個數。在頻繁子圖挖掘中,每個實體是一個頂點,並且最多可以有d-1條到其它頂點的邊。假定頂點的標號是唯一的,則子圖的總數是

        技術分享

    其中,技術分享 是選擇i個頂點形成子圖的方法數,而技術分享 i個頂點的圖的總數。表 22對不同的d比較了項集和子圖的個數。

     

     22 對於不同的維度d,項集和子圖的個數比較

    實體個數d

    1

    2

    3

    4

    5

    6

    7

    8

    項集個數

    2

    4

    8

    16

    32

    64

    128

    256

    子圖個數

    2

    5

    18

    113

    1450

    40069

    2350602

    286192513

     

    挖掘頻繁子圖的一種蠻力方法是,產生所有的連通子圖作爲候選,並計算它們各自的支持度。候選子圖的個數比傳統的關聯規則挖掘中的候選子圖的個數大得多,其原因如下。

    1. 項在某個項集中至少出現一次,而某個頂點標號可能在一個圖中出現多次。
    2. 相同的頂點標號對可以有多種邊標號選擇。

    給定大量候選子圖,即使對於適度規模的圖,蠻力方法也可能垮掉。

  10. 頻繁子圖挖掘過程

    因爲有更高效的gSpan算法作爲本文的核心算法,所以這裏僅對類Apriori算法的基本框架做出一個簡要的介紹。

    挖掘頻繁子圖的類Apriori算法由以下步驟組成。

    1. 候選生成:合併頻繁(k-1)-子圖對,得到候選k-子圖。
    2. 候選剪枝:丟棄包含非頻繁的(k-1)-子圖的所有候選k-子圖。
    3. 支持度計數:統計技術分享中包含每個候選的圖的個數。
    4. 候選刪除:丟棄支持度小於minsup的所有候選子圖。
  11. 候選集生成

    首要的問題是如何定義子圖的大小k。通過添加一個頂點,迭代地擴展子圖的方法稱爲頂點增長(vertex growing )K也可以是圖中邊的個數。添加一條邊到已有的子圖中來擴展子圖的方法叫做邊增長(edge growing)。其中在類Apriori的頻繁子圖挖掘算法中,AGM算法採用頂點增長的策略,FSG算法採用邊增長的策略。gSpan算法則採用邊增長的策略。

  12. 候選集剪枝

    產生候選k-子圖後,需要減去(k-1)-子圖非頻繁的候選。候選剪枝可以通過如下步驟實現:相繼從k-子圖刪除一條邊,並檢查對應的(k-1)-子圖是否連通且頻繁。如果不是,則該候選k-子圖可以丟棄。這種策略與頻繁項集挖掘的Apriori算法是類似的。

    爲了檢查(k-1)-子圖是否頻繁,需要將它與其它頻繁(k-1)-子圖匹配。判定兩個圖是否拓撲等價(或同構)稱爲圖同構問題。

  13. 支持度計數

    支持度計數也是開銷很大的操作,因爲對於每個技術分享 ,必須確定包含在G中的所有候選子圖。在後面詳細介紹gSpan算法的時候,我會有詳細的介紹。

    在進行支持度計數的時候需要進行圖的同構測試。處理圖同構的標準方法是,將每一個圖都映射到一個唯一的串表達式,稱爲規範標號(canonical label )。規範標號具有如下性質:如果兩個圖是同構的,則它們的代碼一定相同。這個性質使得我們可以通過比較圖的規範標號來檢查圖同構。

    在基於Apriori思想的算法中,通過圖的鄰接矩陣定義了一種規範標號。通過將圖的鄰接矩陣按行展開,逐行拼接,可以獲得鄰接矩陣的串表示。同一個圖會有不同的鄰接矩陣表示,所以也會有不同的串表示。我們將字典序最小的串表示作爲圖的規範標號。這裏只是簡單的陳述,因爲在gSpan算法中,作者設計了一種獨特的規範標號系統,我會在後面詳細介紹gSpan算法的時候詳細介紹。

     

  14. 本章小結

     

    本章主要介紹頻繁子圖挖掘的概念和基礎知識。首先,簡要介紹了圖論的相關知識,包括圖的定義和組成,子圖的定義,圖同構和子圖同構的定義。其中圖同構和子圖同構問題是頻繁子圖挖掘領域研究的重點,因爲圖同構測試在很大程度上影響了頻繁子圖挖掘算法的性能。然後,重點介紹了頻繁子圖挖掘的基本定義和基礎知識。介紹瞭解決頻繁子圖挖掘的一般步驟(候選產生,候選剪枝,支持度計數,候選刪除)和對應的基本方法。

    本章介紹了頻繁子圖挖掘的基礎知識,爲了後面的章節詳細介紹頻繁子圖挖掘算法做好了準備工作。

  15. 靜態頻繁連通子圖挖掘算法

    在每一層頻繁子圖的挖掘過程中,Apriori算法都會產生大量的非頻繁的候選子圖。然後對候選的頻繁子圖執行支持度計數。對於所有頻繁的候選子圖,還需要進行圖的同構測試,以減除重複的頻繁候選子圖。因爲圖的同構測試是一種NP完全問題,所以對於大規模的頻繁子圖進行圖的同構測試是一個開銷很大的過程,甚至是不可能完成的任務。因此,大量生成的候選子圖和圖的同構測試的巨大開銷是Apriori類方法的性能瓶頸。下面,將介紹一種不同於Apriori類方法的算法:基於模式增長的方法。不同於Apriori類的方法通過每次合併頻繁k子圖來生成候選k+1子圖,基於模式增長的方法,每次擴展一條邊來生成規模更大的候選。

  16. 模式增長方法:一個樸素的算法框架

    算法1 NaiveGraph(g, D, min_sup, S)

    Input: A graph g, a graph dataset D, and min_sup.

    Output: The frequent graph set S.

    1: if g exists in S then return;

    2: else insert g to S;

    3: scan D once, find every edge e such that g can be extended to g技術分享e and it is frequent;

    4: for each frequent g技術分享e do 

    5:     Call NaiveGraph(g技術分享e, D, min_sup, S);

    6: return;

     

    算法1描述了一個樸素的頻繁子圖挖掘算法[6]。這個算法挖掘所有的頻繁子圖。在下一節,我們試圖對這個樸素的算法框架進行改造,創造性地提出高效率的gSpan算法。這個算法框架大概基於這樣的過程:對於每一個已經發現的頻繁子圖g,迭代地執行邊擴展的策略(每次增長一條邊),直到所有能包含圖g的頻繁子圖被完全發現爲止。

    這個樸素的算法框架使用兩種必要的和顯而易見的策略對頻繁子圖挖掘算法的搜索空間進行剪枝。在第四行展示了一種剪枝策略:當一個被頻繁子圖擴展出來的子圖的支持度小於最小支持度閾值的時候,我們就沒有擴展這個子圖的必要了(根據子圖支持度的非單調性)。第一行展示出第二種剪枝策略,當一個被擴展出來的頻繁子圖已經出現在挖掘結果的集合裏面了,我們也沒有必要對此進行擴展了(因爲對此圖的擴展已經完成了,沒有必要進行重複地擴展)。

    NaiveGraph雖然很簡單,而且使用了兩種高效的剪枝策略,但搜索頻繁子圖的代價仍然很高。它的瓶頸是擴展子圖規模的時候的低效率,因爲同樣的圖可能重複發現很多次[5]。我們只要觀察一下一個頻繁n邊圖是如何產生的,就可以明白這種重複是多麼的嚴重。假設此n邊圖隨意去除一條邊可以生成連通的n-1邊圖(當然去除一條邊可能使得n-1邊圖不連通,但是爲了問題的簡便,我們可以忽略掉),那麼這個n邊圖可以生成nn-1邊圖(忽略掉圖的對稱性以及相同邊的影響)。根據支持度計數的反單調性,這nn-1邊圖都是頻繁的。反過來說,這nn-1邊圖都可以通過一條邊的擴展生成此頻繁n邊圖。同樣的圖的反覆出現必然帶來計算資源的浪費。我們稱二度發現的圖爲複製圖(duplicatie graph)[5]

    我們仔細看一下這種重複圖是如何帶來計算資源的浪費的。首先,重複圖的產生會消耗計算資源,其次重複的支持度計數會帶來資源的浪費。然後,對重複圖遞歸調用NaiveGraph函數,在挖掘的結果集合中查找此圖是否爲重複圖。在結果集合中查找頻繁子圖不是一個簡單的過程,需要進行圖的同構測試。然而圖的同構測試屬於一個NP完全問題,會消耗非常大的計算資源。所以我們可以看出這種樸素算法結構的侷限性所在。

    爲了優化這種樸素的算法框架,我們可以從兩方面着手:首先,可以使用比較好的擴展策略,以此減少重複圖的產生;其次,可以改進圖的同構測試方法,以此降低圖的查找和圖的同構測試所產生的代價。正是這兩個改進的方向,啓發了gSpan算法的出現,極大地提高了NaiveGraph算法的性能。

  17. gSpan算法思想

    gSpan算法通過解決3.1節提出的問題來極大地提高了NaiveGraph算法的效率[5]gSpan算法通過執行最右擴展的策略減少了重複的產生,同時也保證了搜索結果的完備性。gSpan算法設計出一種新式的圖的規範標號,將圖的同構測試與重複圖的檢測結合到一塊,避免了在已經獲得的頻繁子圖集合中搜索重複圖。這些改進極大地提高了頻繁子圖挖掘算法的效率。

    爲此,gSpan算法引入了兩個相關重要的概念:DFS字典序和最小DFS編碼。以這兩個創新的概念爲基礎,創造性的設計出一種高效的圖的規範標號系統。

  18. 圖的規範化表示和規範化擴展思想概述

    讓我們回顧一下NaiveGraph算法所面對的兩個重要缺陷:首先,模式增長的過程中產生了大量的重複圖;其次,對於重複圖的檢索和同構測試耗費大量的計算機資源。爲什麼頻繁項集挖掘的模式增長算法不是面臨這樣的問題呢?我想,問題的根源在於圖的表示的不確定性和不規範性。我們知道,如果將項集中的項有序排列,那麼這個項集就有了唯一的表示方式。而且可以對項集進行有序的枚舉以發現頻繁項集。與之相反,同一個圖會有不同的表示形式。考慮圖的鄰接矩陣表示,不同的頂點順序對應不同的圖的鄰接矩陣表示。所以一個圖共有n!種不同的鄰接矩陣表示形式。這也造成了圖的同構測試的複雜性!

    因此,有一個直接的想法就是,如何構造一種圖的規範表示形式,使得對於任何一個潛在的頻繁子圖,都有唯一的規範表示與之對應。我們稱這個規範表示形式爲規範標號。圖的規範標號首先可以用於進行圖的同構測試,如果兩個圖的規範標號相同,則這兩個圖同構。

    其次,我們還希望圖的規範標號還具有這樣一種性質:對圖的規範表示形式進行有限制的擴展之後,所獲得的圖很可能還是圖的規範表示形式,我把它稱之爲規範的擴展。所謂有限制的規範擴展是指:並非對從圖的任何位置進行模式的擴展,而是從規範表示的圖的特定的位置進行擴展,以此減少重複圖的產生,並且使得增長後的模式很可能仍然是一個頻繁子圖的規範表示形式。我們盡最大的可能保證擴展出來的圖是頻繁的而且是規範的。如果擴展出來的圖不是規範的,我們直接就可以在搜索樹上把它減去。這樣,我們同樣避免了在挖掘結果集合中檢索並進行圖同構測試。我們只需要檢查擴展出來的子圖是否是頻繁的並且是否是規範的表示,然後把經過測試的結果放入到結果集合。

    基於Apriori思想的算法使用了一種將圖的鄰接矩陣表示序列化之後編碼最小化的圖的規範標號方案。但是這種方案只能用於圖的同構測試,而不能指導圖的規範增長過程。因此,我們需要設計出一種新的圖的規範標號系統。

    受到圖的鄰接矩陣序列化方法的啓發,我們可以考慮將圖的邊序列化,構造出一種圖的規範標號出來。這個部分,我將詳細地介紹gSpan算法設計出的符合以上要求的創新的規範標號系統,用於解決NaiveGraph算法所面臨的性能瓶頸。爲了構造出來這種規範標號系統,我會依次介紹一些新的概念。

  19. 圖的序列化

    爲了將圖的表示序列化,我們嘗試定義一種基於深度優先搜索的邊序。圖的深度優先搜索可以定義圖的頂點序,但是我們需要一些另外的規定以定義圖的邊序。首先介紹幾個概念:

    DFS下標。我們使用深度優先搜索訪問圖的節點,並根據訪問到的次序爲這些頂點定序。所有頂點的次序標號的集合稱爲圖的DFS下標。在遍歷的過程中,訪問到的邊和頂點構成了深度優先搜索樹。因爲一個圖有不同的存儲形式,比如同一個節點的鄰接頂點存儲的順序不同,就可能造成節點下標的不一致。所以一個圖可能產生不同的深度優先搜索樹。將深度優先搜索樹T做下標的圖G記作技術分享T稱爲G的一個DFS下標(DFS subscripting )[5]

    圖的二元組邊序列。爲了將圖的表示序列化,我們現在介紹邊的序。通過DFS下標,我們定義了圖的頂點序。我們自然地可以通過頂點序來定義邊的序。我們將圖GDFS樹中的邊稱爲前向邊,不在其DFS樹中的邊稱爲後向邊。自然地,DFS樹已經定義了前向邊的發現次序。現在,我們把後向邊添加到該邊序。給定頂點v,它的所有後向邊應該正好在它的前向邊之前出現。如果v沒有前向邊,把它的後向邊放在該前向邊之後,其中v是第二個頂點。在相同的頂點的後向邊之中,強加一個序。假設頂點技術分享 有兩個後向邊技術分享 技術分享 。如果技術分享 ,則邊技術分享將出現在技術分享之前[5]。到此爲止,我們已經完全定義了圖中邊的序。基於這個序,可以將圖轉換爲邊的序列,稱爲圖的序列化表示。

    圖的五元組邊序列。其次,即使兩個圖的邊序相同而且邊序對於這兩個圖都是唯一的,我們能說明這兩個圖是同構的嗎?不是的,可慮到這樣一種情況:兩個圖的拓撲結構相同,但是頂點和邊的標號有一些差異。這時,即使這兩個圖的邊序列是一樣的,但是這兩個圖因爲標號的差異,卻不是同構的圖。因此,標號作爲圖的表示的一部分,理應作爲邊序的一部分用來確定圖的規範表示。使用一個五元組來表示一個邊技術分享 。其中技術分享 表示邊的DFS下標,技術分享 分別表示頂點i的標號,邊的標號和頂點j的標號。我們把每個加下標的圖轉化爲這樣的五元組的序列,稱爲DFS 編碼

     

  20. 規範化表示

    因爲圖的存儲形式的不確定性,所以,一個圖對應着不同的DFS樹,進而對應着不同的DFS編碼。我們必須從衆多的DFS編碼中選出一種來作爲圖的規範標號,用於進行圖的同構測試和圖的規範化地有限制地擴展。

    現在我們定義圖的不同DFS編碼的大小關係,用於尋找最小DFS編碼作爲圖的規範標號,稱爲DFS字典序。同時,DFS字典序也定義了不同圖的規範標號的大小關係,用於指導圖的有序的擴展。令邊序關係技術分享 具有第一優先級,頂點的標記技術分享 具有第二優先級,邊標記技術分享 具有第三優先級,而頂點標記技術分享 具有第四優先級,來決定兩條邊的序。基於上述規則的序稱爲DFS字典序(DFS Lexicographic Order)[5]

    根據DFS字典序,給定圖G的最小DFS Code記作DFS(G),是所有DFS編碼中的最小者。我們將最小DFS編碼作爲圖的規範標號,也稱爲圖的規範化表示。

  21. 規範化擴展

    先介紹幾個概念:

    最右頂點和最右路徑。給定一棵DFST,稱T的起始頂點v0爲根。最後訪問的頂點vn稱爲最右頂點。從v0vn的直接路徑稱爲最右路徑[5]

    NaiveGraph算法在每個可能的位置隨意擴展頻繁圖,這可能產生大量的重複圖。gSpan算法引入了一種更爲適當的擴展機制。新的方法對擴展有如下限制:給定圖GGDFST,一條新邊e可以添加到最右頂點和最右路徑上另一個頂點之間(後向擴展);或者可以引進一個新的頂點並且連接到最右路徑上的頂點(前向擴展)。由於這兩種擴展都發生在最右路徑上,因此稱爲最右擴展right-most extension ,記爲技術分享 (爲簡短起見,這裏省略了T)。這種擴展的完備性證明請參考文獻[5]。通過最右擴展,可以大量減少重複圖的產生。而且執行最右擴展的時候只需要在頻繁圖的最小DFS編碼最後面添加一個表示邊的五元組就可以獲得擴展圖的DFS編碼,並且新生成的DFS編碼很可能仍然是最小的DFS編碼。我們稱這種在最右端擴展最小DFS編碼的過程成爲規範化地有限制地擴展。

    對於擴展而成的子圖,我們只需要測試其是否爲最小的DFS編碼,就可以決定是否將其加入到頻繁子圖結果集合以及是否繼續隨後的模式增長過程。這避免了在頻繁結果集合中進行圖的逐個比對和同構測試,因此極大地提高了頻繁子圖挖掘的效率。

    DFS編碼樹。根據字典序的定義,頻繁子圖的最小DFS編碼必然大於其擴展出來的後代的DFS編碼,而且可以有序地對頻繁子圖的子代進行深度優先搜索。因此這樣的搜索過程定義了DFS編碼樹。在一個DFS編碼樹裏面,每一個節點代表一個DFS編碼。其中孩子結點是在父母節點的基礎上執行最右擴展得到的。兄弟節點按照字典序排列。因此,對於DFS編碼樹的前序遍歷的結果就是按照字典序排列的頻繁子圖的最小DFS編碼。在下面的3.3節,我將會詳細地介紹這樣的搜索過程。

  22. gSpan算法介紹

  23. gSpan算法框架

    在這一部分裏面,我們詳細地介紹gSpan算法。首先,我將給出gSpan主要框架的僞代碼描述,如下[4]

    算法2 GraphSet_Projection (GS,S)

    1: sort labels of the vertices and edges in GS by their frequency;

    2: remove infrequent vertices and edges;

    3: relabel the remaining vertices and edges in descending frequency;

    4: 技術分享 技術分享 all frequent 1-edge graphs in GS;

    5: sort 技術分享 in DFS lexicographic order;

    6: 技術分享 ;

    7: for each edge 技術分享 do

    8:    initialize s with e, set s.GS = 技術分享;(only graph ID is recorded)

    9:    Subgraph_Mining(GS, S, s);

    10:    技術分享 ;

    11:    if技術分享

    12:        break;

     

     

    第一步(1-6行)從圖集GS中移除不頻繁的頂點和邊。對剩下的邊根據標號的頻率遞減序重新標號。把所有的頻繁一邊圖加入到技術分享 並且按照字典序排序。

    第二步(8-9行)對於所有的頻繁一邊圖,調用模式增長算法Subgraph_mining,迭代增長圖的規模。

    第三步(10行)在挖掘了所有的以某一頻繁一邊圖爲起點的頻繁子圖後,移除圖集GS中所有的與此頻繁一邊圖的邊相同的邊。這一步能將圖集GS映射到一個更小規模的圖集。

    第四步(7,11行)當所有的頻繁一邊圖以及它們的子代被挖掘後,程序結束。

     

    子程序2.1 Subgraph_mining (GS, S, s)

    1: if 技術分享;

    2:     return;

    3: 技術分享;

    4: generate all s‘ potential children with one edge growth;

    5: Enumerate(s);

    6: for each c, c is s‘ child do

    7:     if support(c) 技術分享 minSup

    8:        技術分享;

    9:        Subgraph_Mining(GS, S, s);

     

     

    在每一次迭代過程中,Subgraph_mining子程序將子圖s擴展一條邊,並且發現s所有的頻繁子代圖(s是一個DFS編碼或者DFS編碼樹中的一個節點)。Subgraph_mining程序遞歸執行。在每一次遞歸過程中,Subgraph_mining按照前序遍歷搜索樹,所以gSpan算法按照DFS字典序擴展頻繁子圖s技術分享對重複圖以及它們的子代進行剪枝。可以證明,這樣的剪枝策略可以保證搜索接過 的完備性。如果是它所表示的圖的最小DFS編碼,那麼Subgraph_mining子程序將s加入到頻繁子圖的結果集合S。然後,生成頻繁子圖s的一條邊增長獲得的後代集合,然後對每一個子代遞歸的調用Subgraph_mining子程序。生成子代的過程不會耗費太大的代價,但有很多的技巧值得討論,我會在後面詳細地介紹。

     

    子程序2.2 Enumerate (s)

    1: for each 技術分享 do

    2:     enumerate the next occurrence of s in g;

    3: for each c, c is s‘ child and occurs in g do

        技術分享;

    4: if g covers all children of s

        break; 

     

     

    通過枚舉頻繁子圖s在圖集GS中的圖g中的每一次出現,Enumerate(s)子程序對圖g的每一個孩子進行計數。

    在子程序2.2Enumerate(s)中沒有必要進行子圖同構測試。我們設計出一種在深度優先搜索樹中進行回溯的策略。這種策略將子圖的匹配和DFS編碼的增長結合到一個過程,因此在很大程度上降低了計算的複雜性,而且可以將算法很容易地擴展到誘導子圖同構問題上。枚舉粗略簡述如下。給定一個最小DFS編碼,我們想要找到這個最小DFS編碼在另外一個圖g中的所有匹配。我們從DFS編碼的一條邊開始試圖與圖g中的一條邊進行匹配。然後我們重複這樣的步驟,每次迭代地匹配一條邊。有時候如果我們無法匹配當前的邊,我們不得不對匹配的深度進行回溯。我們重複這個過程,直到我們發現了一個匹配或者匹配失敗然後結束。因爲gSpan算法需要發現S在圖g中的所有匹配,所以,一旦我們發現了一個匹配結果,我們就對這個匹配能夠拓展的子代進行計數。然後,我們對匹配的過程進行回溯,嘗試獲取下一次匹配。因爲在一次掃描的過程中能夠發現所有的匹配,總的開銷並不是很大。在下一部分,我們將會討論幾種優化。在這一部分的結尾,我將給出算法性能的分析以及算法可能的擴展。

  24. gSpan算法分析

    gSpan執行DFS搜索樹的前序遍歷。有關性質保證了DFS搜索樹包含了所有潛在的頻繁子圖。因此,gSpan算法的完備性是可以保證的。相比於AGM算法和FSG算法,gSpan算法主要有以下的這些優勢[4]

    1. 沒有候選生成和錯誤測試。在gSpan算法中,頻繁(k+ 1)-edge子圖直接從頻繁k-edge子圖增長得到。gSpan算法不用執行候選生成,不用測試所有任何的陰性候選,這不同於任何的基於Apriori思想的算法,例如AGMFSG算法。而且相比於挖掘頻繁項集的算法,挖掘頻繁子圖的算法進行候選生成會耗費更大的代價。雖然FSG算法對候選生成的過程有所生成,但是gSpan算法能夠完全避免候選生成的過程。
    2. 深度優先搜索比廣度優先搜索更節省空間。gSpan 算法是一種深度優先搜索算法,與之不同的是基於Apriori思想的AGMFSG算法都採納了廣度優先搜索的策略。在I/O和內存的開銷方面,廣度優先搜索算法通常比深度優先搜索算法開銷更大。
    3. 圖數據集的快速收縮。在算法2中,每一個頻繁一邊圖以及其子代被迭代地挖掘後,都會在圖數據集GS上移除此頻繁一邊,以此來收縮圖集GS的規模,使得GS中的圖擁有更少的頂點和邊。在挖掘的過程中,這會在很大程度上加速程序的執行過程。

       

  25. 算法實現和性能測試

    第三章詳細介紹了gSpan算法的僞代碼描述。在4.1,首先介紹gSpan算法的實現,包括gSpan算法實現所需要的數據結構和程序框架。在4.2節,介紹對gSpan算法的性能測試結果,包括在經典的化合物數據集上運行的結果,以及在動態網絡運行的結果。

  26. 算法實現

  27. 程序總體設計

    技術分享

     41 gSpan算法類圖

    從圖 41可以看出,gSpan算法的數據結構非常的複雜。在實現的過程中用到了圖的多種存儲方式,分別是邊表,鄰接表,鄰接矩陣  DFS 編碼 。準確的選用不同的表示形式會使 gSpan 算法在不同的階段獲得比較好的性能,並且降低實現的難度。gSpan算法在實現過程中綜合使用到多種數據結構,比如向量,數組,矩陣,棧,隊列和 hash 表,圖,樹;能使用到很多的算法比如排序,樹的前序遍歷,圖的深度優先搜索,圖同構測試等。算法的結構很複雜,如何設計數據結構,優化算法的性能都是gSpan算法設計的困難所在。下面一節,我會簡單介紹,以上類圖中的每個類的功能以及是如何實現的。

  28. 類的詳細設計

    GraphData 這個類是圖的邊表表示形式。如圖 42所示,這個類使用頂點表和邊表來表示一個圖。此類包含頂點標籤列表,頂點掩碼列表,邊的起始id列表,邊的終止id列表,邊的標籤列表,邊的掩碼列表,頂點的新id列表。其中,頂點掩碼列表,頂點的新的id列表,邊的掩碼列表並不是表示一個圖所必須的,但是對於gSpan算法來說,這些結構有利於對圖數據的預處理,這將會在gSpan算法reLabel的階段用得着。

    爲了便捷地實現高效率的gSpan算法,我將會綜合使用圖的四種數據表示形式,分別爲邊表,鄰接表,鄰接矩陣和DFS編碼。GraphData這個類就代表圖的邊表表示形式。因爲邊表的表示形式方便存儲,所有我們能獲得的圖數據文件一般都是使用邊表保存的。所以我將使用邊表保存圖數據的類稱爲GraphData。其次,邊表的表示形式非常有利於統計頂點和邊的標號的頻率,過濾掉非頻繁的邊,重新標號等預處理過程,所以在讀取圖數據的過程中,我並沒有急於直接將邊表表示轉換爲鄰接表表示。但是對於圖的遍歷過程,邊表表示顯然不如鄰接表或者鄰接矩陣方便。所以在對圖數據進行重新標號之後,將邊表表示轉化爲鄰接表表示。

    技術分享

     42 Class GraphData

    GraphDataSet這個類是GraphData類的容器,是繼承了Vector內置容器後實現的。如圖 43所示,除了繼承Vector容器的方法和屬性之外,我又定義了很多新的方法和屬性,以便於gSpan算法的使用,另外GraphSet類,FrequentSubGraphSet類都是基於同樣的思路。其中,edge_label_size表示gSpan算法進行重新標號之後的不同標號的種類。edgeLabelRecover保存了重新標號之後的標號系統與重新標號之前的標號系統之間的映射,用於在gSpan算法結束後,恢復標號的映射。min_sup保存最小支持度閾值。nodeLabelRecover類似於edgeLabelRecover,用於恢復邊的標號。vertex_label_sizeedge_label_size類似,用於保存頂點標號的種類數。readFromFile方法用於從文件中讀取圖數據到GraphDataSet的對象。reLabel的作用與gSpan算法中的reLabel一致,用於對頂點標號和邊標號進行統計,按照標號的頻率對標號進行降序排序,將標號的順序作爲標號的值對圖數據進行重新標號。

    技術分享

     43 Class GraphDataSet

    Graph這個類是圖的鄰接表表示。因爲鄰接表表示有利於圖的遍歷,所以在重新標號之後,要將GraphData表示的圖數據轉換爲Graph表示的數據,即使用圖的鄰接表表示形式。如圖 44所示,edgeLabeledgeTo都是二維動態向量用於實現圖的鄰接表表示。vertexLabel用於保存頂點的標號。addEdgeaddVertex分別用於在Graph中添加一條邊和一個頂點。hasEdge用於判斷Graph的對象中是否存在某一條邊。RemoveEdge用於移除Graph的對象中的某一條邊。

    技術分享

     44 Class Graph

    GraphSet    是用於保存Graph的容器,另外封裝了一些方法,體現了面向對象封裝和抽象的思想。如圖 45GraphSet有兩個屬性,與GraphDataSet中的同名屬性含義相同。Show方法用於將圖數據集顯示在屏幕上或者保存到文件裏面。

    技術分享

     45 Class GraphSet

    Edge5使用一個5元組表示一條邊。如圖圖 46,五元組分別爲邊的起始id,邊的終止id,邊的起始頂點的標號,邊的標號,邊的終止頂點的標號,分別對應於Edge5的五個屬性。這個五元組跟gSpan算法中的五元組是一樣的,用於將一個圖的表示序列化。方法forwardbackward用於判斷此五元組表示的邊是前向的還是後向的。此外重載了比較運算符,用於gSpan算法對邊進行排序。

    技術分享

     46 Class Edge5

    DFScode即是Edge5的容器,也是圖的序列化表示,最小DFScode可以作爲圖的規範標號,用於判別圖是否同構。edgeVisited是圖的矩陣表示形式,用於快速判斷某一個邊是否訪問過。graph2code保存從圖的鄰接矩陣表示形式的頂點idDFScode表示形式的頂點id的映射,在判斷DFScode是否爲最小時發揮作用。Is_min用於保存判斷的結果。isMin方法用於判斷此DFScode是否爲最小DFS編碼。Show方法可以用於打印圖的DFScode表示形式到屏幕上。toGraph方法用於將圖的DFScode表示形式轉換爲類Graph表示的形式。

    技術分享

     47 Class DFScode

    EdgeFrequency用於記錄某一條邊是否是頻繁的。此結構對於提升gSpan算法的性能非常重要。首先,如果一條邊不是頻繁的,那麼就不應該以此爲基礎進行圖的模式擴展以挖掘其頻繁後代。因爲根據頻繁模式的反單調性,包含此非頻繁一邊的子圖必定不頻繁。其次,如果一條邊是不頻繁的,我們就沒有必要在匹配成功一個頻繁子圖之後擴展這樣的一條邊從而生成後代,同樣是因爲反單調性。在擴展一條邊的時候,只需要查一下這條邊是否是頻繁的,即查一下這張表,就可以少擴展出很多的子代,從而優化了程序的性能。如圖 48,這個類是三維數組的手動實現形式,主要爲了程序的可擴展性,使用了動態內存分配。

    技術分享

     48 Class EdgeFrequency

    FSGraph並沒有什麼特別的,主要是爲了封裝一些數據和方法,用於保存挖掘出來的頻繁子圖。如圖 49所示,屬性g表示圖的鄰接表表示形式,類型爲Graphgc爲圖的DFScode表示形式,類型爲DFScodeisMaximal 用於保存這個頻繁子圖是否爲極大頻繁子圖。Supporter用於保存頻繁子圖的支持度計數。saveToFile顧名思義,用來將結果保存到文件。Show方法用於將結果顯示到屏幕上。因爲挖掘出來的結果可能會很多,所以show方法並沒有saveToFile實用。    

    技術分享

     49 Class FSGraph

    FrequentSubGraphSet FSGraph類的容器結構,如圖 410所示,這個類只有一個方法,show方法,用於保存結果。    

    技術分享

     410 Class FrequentSubGraphSet

    Children類用於在圖g中找出所有可以通過gcDFScode類型)擴展得到的子圖,在gSapn算法中可以用於對子圖進行枚舉。Children繼承了內置容器set,保存的元素爲Edge5類型的。因爲子圖是由gcDFScode類型)擴展得到的,而且擴展的邊只能放在gc的最後邊,所以Children類型只需要保存擴展的邊即可,反正其它的邊都是所有的Children所共有的,即gc中的邊。使用set類型是爲了防止後代枚舉重複,即防止後代子圖支持度計數重複。如圖 411code2graphedgeVisitedggc的功能與DFScode中的同名屬性作用一樣。graph2codecode2graph的反向映射。rmPath記錄最右路徑,efEdgeFrequency類型的對象,用於子代擴展時的非頻繁邊擴展的剪枝。getChildren方法用於執行匹配和擴展的過程,獲得可以擴展的子代。DFS方法採用回溯法擴展子代,由getChildren方法調用。

    技術分享

     411 Class Children

    GSpan類是算法核心類,定義了算法的具體實現過程。已上定義的類大多屬於gSpan算法使用到的數據結構,抽象爲類型,體現了面向對象抽象和封裝的特性。gSpan類是此程序的核心類型,直接體現了第三章所提到的算法思想。如圖 412所示,ef對象爲EdgeFrequency類型,其作用在上文多有介紹,這裏不再贅述。gs對象爲GraphSet類型,保存圖數據集,用於頻繁子圖挖掘,使用鄰接表的表示方式。maximalResultSet對象爲FrequentSubGraphSet類型,用於保存挖掘到的極大頻繁子圖。resultSet用於同樣爲FrequentSubGraphSet類型,用於保存挖掘到的頻繁子圖。min_sup屬性指最小支持度閾值。Run方法爲gSpan算法的主體,用於執行挖掘的過程。getResult 用於獲取挖掘的結果。getMaximal用於獲得挖掘的極大頻繁子圖。subGraphMining與第三章的僞代碼中子過程2.2同名,功能也一樣,用於迭代地擴展子代。show方法和save方法與已上提到的同名方法類似,這裏不再贅述。gSpan算法的具體實現體現了算法2的思想,這裏不再贅述。

    技術分享

     412 Class gSpan

     

  29. 程序編碼實現

    受到篇幅的限制,這裏不再給出全部的代碼。

     

  30. 實驗分析

  31. 實驗環境介紹

    實驗運行的硬件環境爲:CPUIntel(R) Core(TM) i5-4200M CPU @ 2.50GHz,兩個實際核心,四個邏輯核心,一級緩存128KB,二級緩存512KB,三級緩存3.0MB;內存DDR3L 8GB

    實驗運行的軟件環境爲:操作系統是 Windows 10;編譯環境爲Visual studio 2017;程序語言爲C++語言。

  32. 實驗數據介紹

    化合物組件數據集。化合物組件數據集可以從以下的鏈接中獲得。數據集包含340個化合物,其中包含24種不同的原子,66種原子類型和4種化學鍵類型。數據集中的圖非常的稀疏,每個圖平均包含27個頂點和28條邊。最大的圖包含214個頂點和214條邊。所以,挖掘的模式更像是圖模式,雖然,不排除會出現環結構。我們使用原子類型和化學鍵的類型分別作爲頂點和邊的標籤。在這裏,頻繁子圖挖掘的目標是發現公共的化合物子結構。

    Enron 公司的職工E-mails網絡。Enron 公司的職工E-mail網絡是一個關於Enron公司職工之間收發電子郵件的公開可用的數據。時刻、發送者和接收者列表均可以從數據文件中獲取,數據庫中的數據以天爲單位。網絡中的節點表示職工,而連接兩個節點的邊表示這兩個職工之間有電子郵件收發關係。爲了更好的分析問題,以月作爲時間刻度,若在某個月內,兩個職工之間有電子郵件收發關係,則這兩個節點之間有邊相連。採用Tang等人處理過的原始數據集的簡化版本進行分析,其中包含了從19999月到20023月共計28個月的數據。

     

  33. 實驗結果分析

    靜態頻繁子圖挖掘分析使用的是化合物組件數據集,這是在靜態頻繁子圖挖掘算法研究領域經常使用的真實數據集,包括FSG算法和gSpan算法都是在這個數據集上進行測試和比較的,因此可以將算法的實現在這個數據集上進行測試以此和其它的算法進行正確性的交叉驗證和性能的對比。如圖 413所示,此圖表示算法的運行時間隨着支持度閾值的變化情況。因爲隨着支持度閾值的增長,頻繁子圖所需要的支持度計數也在增長,從而潛在的頻繁子圖的個數會下降,從而算法能夠有效的利用剪枝規則,加快程序的結束。因爲圖 413的縱座標爲對數座標系,所以可以看出算法的時間複雜度非常的高,已經超越了指數級的增長速度。理論上的分析也是如此,在第2.2節當中,已經討論過頻繁子圖挖掘算法潛在的搜索空間的大小。從而證明了,頻繁子圖挖掘算法的複雜性之高!

     414表示挖掘到的頻繁子圖數量隨着最小支持度閾值的減小而快速增長的過程。這種變化與運行時間的變化是一致的,我由此猜測,程序的運行時間會隨着潛在的頻繁子圖數量而線性變化,理論上的推導即是如此。圖 415證明了這個猜想,運行時間確實與潛在頻繁子圖的數量近乎呈現線性關係,這爲估計一定規模的潛在頻繁子圖數量的頻繁子圖挖掘任務的運行時間提供了查考。

     

    技術分享

     413運行時間隨着最小支持度閾值的變化

     

    技術分享

     414挖掘到的頻繁子圖數量隨着最小支持度閾值的變化

    化合物組件數據集中的圖的規模都比較小,平均27個頂點和28條邊,多呈現樹形的結構,少有迴路。因此潛在的頻繁子圖數量不會太多。而對於規模較大的網絡而言,gSpan算法的可擴展性值得懷疑。首先,如果潛在的最大的頻繁子圖如果很大,根據反單調性原理,此頻繁子圖的所有子圖都爲頻繁子圖,而且子圖的支持度必然大於此頻繁子圖。如果挖掘到的頻繁子圖的數量很多,我們很難從挖掘到的頻繁子圖中獲取有用的信息,因爲我們挖掘的頻繁子圖的數量勢必比原來的數據量更大!其次,即使不考慮到挖掘結果的實用性,如果潛在的最大的頻繁子圖如果很大,算法的複雜性也難以接受,算法的運行時間增長會很快。

     

    技術分享

     415運行時間隨着挖掘到的頻繁子圖數量變化

     

    事實上由於Enron 公司的職工E-mails網絡非常大,短時間的運行即產生了海量的頻繁子圖數據,頻繁子圖挖掘的結果數據遠大於原始數據本身。首先,這樣的任務對於普通的計算機是無法承受的。其次,因爲挖掘結果的龐大和冗餘,對於挖掘結果的利用很難實現。因此,我並沒有嘗試把程序運行下去。

    由此,我獲得了有益的啓發:將頻繁子圖挖掘算法真正的應用在真實的系統上,還有很長的路要走,這和頻繁項集挖掘算法的應用困難是一致的。爲了應對挖掘結果的擴張,首先要考慮到的就是挖掘結果的壓縮。在這方面已經有了很多的研究,比如考慮挖掘閉合頻繁子圖,極大頻繁子圖,考慮對挖掘的結果增加一些條件限制。有些條件限制的單調性或者反單調性還可以用於搜索空間的剪枝,加快程序的運行。還可以從挖掘到的結果中,根據條件限制過濾出有用的結果,或者根據統計學的方法過濾出更符合真實情況的結果。這方面的研究成果非常的多,理論也比較豐富,這已經超出了我在這篇文章要討論的範圍。

     

     

     

  34. 總結和展望

    頻繁子圖挖掘研究已經有了很多的理論成果,但是還存在很多的問題有待解決。本章總結此論文所做的工作,分析目前工作的不足之處,並指出下一步的研究方向和待解決的問題。

  35. 總結

    圖數據結構作爲通用的數據結構,可以描述事物實體之間複雜的關係。圖數據結構作的數據挖掘研究已經成爲當前數據挖掘領域的一個重要研究方向,並取得了一系列的研究成果 。本文以子圖挖掘爲主要的研究內容,進行了下面的工作。

    1. 學習圖論中的基礎知識,學習數據挖掘的基本理論,理解經典的關聯規則挖掘和頻繁子圖挖掘算法和思想,爲接下來的工作做好理論準備。
    2. 深入理解gSpan算法的設計思路和實現原理,設計gSpan算法的數據結構,實現gSpan算法,並分別在化合物組件數據集和Enron 公司的職工E-mails網絡上運行,理解gSpan算法的侷限性和圖挖掘算法在應用領域的困難所在。
    3. 思考gSpan算法的改進方法,瞭解gSpan算法後續的研究進展,瞭解gSpan算法的應用情況。瞭解現今對動態網絡和其它圖挖掘算法的研究現狀。
  36. 展望

    雖然本文取得了一些研究成果,但是本文所做的研究工作還有一定的侷限性。比如,雖然能夠正確實現gSpan算法,但是gSpan算法並不能有效地對大規模的動態網絡數據進行挖掘。事實上由於Enron 公司的職工E-mails網絡非常大,短時間的運行即產生了海量的頻繁子圖數據,頻繁子圖挖掘的結果數據遠大於原始數據本身。首先,這樣的任務對於普通的計算機是無法承受的。其次,因爲挖掘結果的龐大和冗餘,對於挖掘結果的利用很難實現。

    由此,我獲得了有益的啓發:將頻繁子圖挖掘算法真正的應用在真實的系統上,還有很長的路要走,這和頻繁項集挖掘算法的應用困難是一致的。爲了應對挖掘結果的擴張,首先要考慮到的就是挖掘結果的壓縮。在這方面已經有了很多的研究,比如考慮挖掘閉合頻繁子圖,極大頻繁子圖,考慮對挖掘的結果增加一些條件限制。有些條件限制的單調性或者反單調性還可以用於搜索空間的剪枝,加快程序的運行。還可以從挖掘到的結果中,根據條件限制過濾出有用的結果,或者根據統計學的方法過濾出更符合真實情況的結果。由此可見,圖數據挖掘的研究成果嚮應用領域轉換仍存在很多問題。在實際應用領域,圖挖掘仍然有相當多需要研究的內容。

    致謝

    本文是在***教授的精心指導下完成的。從論文的立題到最終完成,他都給予了極大的關懷和幫助,並提出了寶貴的意見。在此論文結束之際,我以誠摯的心情向她表示衷心的感謝,感謝在這半年時間裏對我的親切關懷,熱情鼓勵和悉心指導。

    最後,特別感謝我的父母給予我的支持和理解!

    參考文獻

    1. 劉振頻繁子圖挖掘算法的研究與應用[D]. 中南大學, 2009.
    2. 覃桂敏複雜網絡模式挖掘算法研究[D]. 西安電子科技大學, 2012.
    3. PANG-NINGTAN, MICHAELSTEINBACH, VIPINKUMAR. 數據挖掘導論:完整版[M]. 人民郵電出版社, 2011.
    4. Yan X, Han J. gSpan: Graph-Based Substructure Pattern Mining[C]// IEEE International Conference on Data Mining. IEEE Computer Society, 2002:721.
    5. Han J, Kamber M. Data Mining: Concepts and Techniques[J]. Data Mining Concepts Models Methods & Algorithms Second Edition, 2012, 5(4):1 - 18.
    6. Yan, Xifeng, Han, et al. CloseGraph: mining closed frequent graph patterns[J]. Proc Kdd, 2003:286-29.

     

     

    項目鏈接:https://github.com/xdwwb/gSpan3


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章