第四章 鄰近樣式圖型探勘演算法
4.1 鄰近子圖樣式列舉方法
(1) 建立鄰近節點樣式
子圖樣式列舉一開始要先列舉出各種只包含固定節點的鄰近節點樣式,此步 驟是將圖型中所有節點讀過一次,並且記錄相異標記的節點樣式有幾種,符合該 樣式的節點會記錄在 Matched_Set 表中。接著檢查其支持度是否大於常見之門檻 值,若是則從樣式比對到節點的資訊進行樣式圖型成長。
【範例 4.1】建立常見鄰近節點樣式
根據上一章圖 5 所示的圖型特徵儲存結構內容,先讀過所有節點,可得出具 相異標記的固定節點鄰近子圖樣式,我們會儲存對應節點的比對子圖結構資料。
比對子圖結構資料用來記錄一個鄰近子圖樣式對應到原圖中的子圖,包含(1)拜訪 過的邊記錄表(Visited Edge Table)、(2)可擴展鄰邊串列堆疊(StackNeighborhood)、
以及(3)節點編號表(NodeID Table)。對於 G 中每個比對到固定節點標示的節點 Vm,
(1) Vm之鄰邊串列索引會被存入 StackNeighborhood 中,(2) Vm 對應到子圖中的 節點編號 0 存入 Node ID Table,以物件方式儲存在鄰近樣式對應表的 Matched_Set 中。
圖 6 所示的鄰近樣式對應表是一個全域的雜湊表,Neighoborhood Pattern 為 此表的 key 值並以 DFS code 表示每個鄰近子圖樣式,而 value 值為一個儲存串列 空間稱之為 Matched_Set。而 Matched_Set 中每一索引指向該鄰近樣式對應的比對 子圖結構資料。
圖 6 鄰近樣式對應表
根據 Matched_Set 中儲存的比對子圖結構資料,可從對應圖型之固定節點計 算出每個鄰近樣式的支持度,並砍除支持度未滿最小支持度門檻值的鄰近樣式。
以圖 6 為例,總節點數為 6,且假設支持度為 0.2,在一開始讀過所有節點,
我們便可找出固定起點的鄰近樣式分別為 P、A、C 三種標記,接著計算鄰近樣式 的支持度。固定節點為 P 的鄰近樣式支持度計數值為 3,表示該樣式有 3 個相異 節點,接著除以總節點數即為支持度 0.5、固定節點為 A 的鄰近樣式支持度為 0.33、
固定節點為 C 的鄰近樣式支持度為 0.166,因此砍除不滿足支持度之鄰近樣式。
prune
而滿足支持度的常見鄰近樣式,會以其 DFS code 儲存到一個暫存佇列 Queue,
接著以將該樣式之 DFS code 做為引數呼叫圖型成長遞迴模組,表示以該常見鄰 近節點樣式進行圖型成長,列舉出更大的鄰近子圖樣式。
StackNeighborhood 用來記錄目前進行子圖圖型成長接下來可加入的邊,例如 (P1,0)表示 P1節點之鄰邊串列 L 上表示的邊為接下來可加入的邊,而 0 表示 L 上 之索引位置,表示該鄰邊串列 L 索引位置 0 為下一條可加入的邊。Node ID Table 中記錄目前子圖中的節點編號,亦表示子圖圖型成長過程加入節點的順序。Node
ID Table 的資訊可用來在子圖圖型成長過程,檢查節點或邊是否已被加入過,可 判別加入邊是否為返回邊,亦可方便對新增邊 e 做樣式邊編碼並更新 DFS code。
(2)子圖樣式圖型成長:
當遞迴模組收到從 Queue 中一個常見鄰近節點樣式 P 的 DFS code,並從鄰近 樣式對應表中取得該 DFS code 所對應的 Matched_Set,接著從 Matched_Set 中取 出一個比對到的子圖和其圖型結構資料進行樣式圖型成長。每次執行樣式圖型成 長,會先從堆疊空間 StackNeighborhood 取出堆疊 Top 指標所指的鄰邊串列資訊,
該資訊表示一個節點以及指向鄰邊串列指向位置,接著便取出該節點之鄰邊串列
L 並指向位置開始執行,首先複製當前的圖型結構資料(在此稱為父圖型樣式),
從串列上的邊檢查接下來可用來擴展子圖樣式的邊。
串列上的邊 e 若出現在 Visited Edge Table 中,即表示該邊已經在子圖中,或
表示為了避免產生圖型同構子圖而不允許加入該邊。否則將 e 加入至 Visited Edge
Table 中,然後檢查該邊上是否有原來子圖未包含的新節點出現。若 e 的兩個端點 結點皆已出現在 NodeID Table 中,則表示該邊為返回邊;反之,在 NodeID Table 中加入一個節點編號,對應到因新增邊 e 而增加的新節點 v,並將新節點 v 的鄰 邊串列資訊 v.LA存入 StackNeighborhood 中。但須注意的是 e 所屬的鄰邊串列 L 中,後面若還有其他未拜訪過的邊,則在將 v.LA串列資訊存入 StackNeighborhood 前,更新鄰邊串列 L 的指向位置資訊後存回 StackNeighborhood 中。
對於剛才新加入邊 e 所產生的鄰近子樣式 P’,其 DFS code 為其父樣式 P 的
DFS code 再加上 e 的邊編碼。然後記錄 P’比對到圖型中的圖型結構資料加入至 Matched_Set,以 P’的 DFS 為 key 值-存入鄰近樣式對應表中。若鄰近樣式對應表 先 前 已 經 有 產 生 相 同 的 鄰 近 子 圖 樣 式 之 DFS code , 則 會 先 取 出 先 前 的
Matched_Set 增加新比對到的圖型結構資料回存到鄰近樣式對應表。
完成上述處理,可對鄰近子圖樣式 P 產生多增加一條邊的候選子圖樣式 P’,
但 P 仍可繼續產生其他候選子圖樣式,因此複製還未加入 e 前的圖型結構資料,
繼續拜訪 L 中還未被加入過的邊。若鄰邊串列 L 上所有的邊全部都被加入過子圖 樣式 P 產生候選子圖樣式,則繼續從子圖型樣式 P 的 StackNeighborhood 取出堆 疊的第二條鄰邊串列,繼續產生其他的候選子圖樣式,直至 StackNeighborhood 中為空,即表示子圖樣式 P 目前比對到的子圖位置已增長出所有候選子圖樣式。
接下來從 Matched_Set 中取出第二個比對到的子圖及其圖型結構資訊,重複上述
處理步驟,直至 Matched_Set 中所有的子圖對應圖皆完成圖型成長。
當列舉出樣式 P 的所有子圖樣式後,P 是這些子圖樣式的父圖樣式,接下來 會依據產生這些候選子圖樣式的順序繼續遞迴進行子圖樣式圖型成長。在對一個 子圖樣式 P1’進行圖型成長前,要先檢查子樣式 P1’的 DFS code 是否為該對應圖的
minimum DFS code,若非最小 DFS 編碼表示和其他子圖為圖形同構,因此砍除該 DFS code 在對應表所對應的圖型資訊。否則,從鄰近樣式對應表取出其比對到的 Matched_Set,計算其支持度是否大於門檻值,大於門檻值者表示是一個常見鄰近 子樣式,因此 P1’繼續遞迴進行下一層的子圖圖型成長。
【範例 4.2】子圖樣式圖型成長範例
圖 7 鄰近節點樣式 P1圖型資訊結構
如圖 7 範例所示的處理狀態是從 Queue 中取出單一固定節點標示為’P’的常 見鄰近節點樣式 P 節點編碼(0,_,P,_,_,_) ,在進行子圖樣式圖型成長模組後,會從 鄰近樣式對應表取出 P 對應的 Matched_Set,再從 Matched_Set 取出一筆比對到固 定節點 P 的 P1節點,其對應記錄的圖型結構資料。
首先從鄰邊串列堆疊 StackNeighborhood 取出 Top 指標的(P1,0)(如圖 8 之 Step 1),因此從圖 5 取出 P1的鄰邊串列以 L 表示,而 0 表示指向 L 的索引位置 0,
因此加入所指的邊 e(P1,a,C1,0)至 Visited Edge Table(如圖 8 之 Step 2),並更新 L 的位置。而更新的依據是比較與當前索引位置的下一條邊(即 e 在 L 的下一個位置) 是 否 為 相 異 樣 式 邊 , 若 是 則 將 索 引 位 置 增 長 為 1 , 再 存 入 (P1,1) 至
StackNeighborhood 中,此情況下 e 與下一條邊為相等邊,因此仍保持串列中與 e
相等邊之起始位置即(P1,0),存入(P1,0)至 StackNeighborhood。
檢查新加入邊 e(P1,a,C1,0)的端點發現 C1 為新節點,將 C1加入至 Node ID
Table 並將節點編號加 1,因此 C1會對應到子圖節點編號 1(如圖 8 step 3),C1之 鄰邊序列資訊(C1,0)隨之存入 StackNeighborhood 中(如圖 8 step 4)。接著(P1,a,C1,1) 透過 Node ID Table 的節點對應編號產生邊編碼(0,1,P,a,C,1),加至常見鄰近節點 樣式 P 的 DFS code,因此候選子圖樣式 P’之 DFS code 為(0,_,P,_,_,_)/ (0,1,P,a,C,1)。
接著以P’的 DFS code 為 key 值,另外再將對應 P’之 Matched_Set 圖型結構資訊 為 value 值,以<key-value>方式將 P’的資訊存入鄰近樣式對應表(如圖 11 第 4 個 樣式),至此就完成一個子圖圖型成長的動作。圖 10 顯示 gSFNP 列舉流程中由 鄰近節點樣式 P 共可長出四個子樣式,上述過程會長出最左邊子樣式。
而 L 中仍有其他邊可加入 P 產生候選子圖樣式,因此先複製 P1的圖型結構 資料(如圖 7),加入 L 的第二條邊(P1,c,P2,0),依照上述步驟可產生 DFS code
(0,_,P,_,_,_)/(0,1,P,c,P,0)及對應圖的圖型結構,存至鄰近樣式對應表(如圖 11 第 5 個樣式),對應的候選子圖樣式如圖 10 中 P 的第二個子樣式。依序進行此步驟將 節點 P1 的鄰接串列 L 都拜訪過一次後,將儲存 P1 的索引值從圖 7 所示的
StackNeighborhood 中移除後如圖 9,由於沒有其他節點的索引值資訊儲存在
StackNeighborhood 中,表示從比對鄰近節點樣式 P 的節點 P1不能再加入其他邊 產生其他候選子圖樣式P’。
完成節點 P1能夠長出的樣式後,接著從 Matched_Set 中取出下一個對應節點
P2 及其圖型結構資料,接下來按上述步驟繼續產生 P 的候選子圖樣式,直到 Matched_Set 中沒有可成長的對應圖為止。當 P 所能產生的候選子圖皆被找出時,
根據最小支持度計數值 2 刪除不常見的鄰近子圖樣式(圖 10 叉記號及圖 11 線條 刪除部分),即產生如圖 10 列出的四個子樣式結果及如圖 11 所示之鄰近樣式對 應表。這表示由樣式 P(在此為包含單一節點標示為 P 的樣式)經一次圖型成長能 產生的候選子圖樣式已完全列舉完成。
圖 8 子圖圖型成長更新圖型結構
圖 9 P1圖型資訊結構移除索引後 Step.2
Step.3 Step.1
Step.4
圖 10 gSFNP 列舉流程
圖 11 鄰近節點樣式 P 子圖圖型成長後的鄰近樣式對應表內容