論文目的
強調依據的 Graph 中的 structure info 對於 Node 的分類。這區別於以往的假設 “相鄰較近的節點具有相似的分類情況”
即用 “structure identity”。換句話說————“struc2vec is superior in a classification task where node labels depends more on structural identity”
實現方式
如何衡量結構相似性
從直覺上來說,兩個 Node 如果是結構相似的,那么他們應該會有相近的度。進一步來說,如果這兩個 Node 的相互的 neighbors 同樣也有相近的度,那么可以說這兩個 Node 的結構相似性更高了。【有點類似於 neighbors consensus】
具體來說,記
\(k\) 為某個節點的 k-hop(\(k\) 階鄰居)
\(R_k(u)\) 代表節點 u 的 k 階鄰居集合【the ring of nodes at distance k】
\(s(S)\) 對節點集合 S 按照度進行排序
下面公式衡量節點 u 和 v 之間的相似度:
這是一個遞歸式。\(f_{-1}=0\)。\(g(D_1, D_2) \geq 0\) 表示度序列 \(D_{1}\) 和 \(D_{2}\) 之間的 distance. \(g(D_1, D_2)\) 該值越大則序列差異越大。 【方便理解:類似衡量cosx 和 sinx 的差異度】
總之:\(f_{k}(u,v)\) 值越小,則節點 u 和 v 結構相似度越高
構建上下文圖(context graph)
層內
觀察上一節的公式,其中 k 是 k-hop,所以這一節,將針對 k=0,1,2....\(k^*\) 分別構建一個 context graph
同時如果兩個節點之間有 edge,那么給這條 edge 賦一個權重值 \(w_{k}(u, v)\)(用於下文的隨機游走)
可以看到,\(f_k\) 越小 ==> 節點結構越相似 ==> \(w\) 越大 ==> 則權重值越大(用於隨機游走)
層間
那么 \(k\) 的變動,會有不同的層,不同層之間 graph 結構是不變的(類似堆成的千層餅),所以不同層之間同一個節點我們添加兩條通路:
其中
\(\overline{w_{k}}\) 是該層的平均權重,所以第一個式子表示,如果該層的\(\Gamma_{k}(u)\)較大,也就是該層同 u 節點結構相似的數量較多,該層的k-hop,的 k 需要變大,這樣包含的結構信息將會更多,才會找到更高層次的 structural similarity
隨走游走
通過以上,我們構建了層內和層間的權重連邊,這一切都是為了最終的隨機游走
每一跳,可能會在層內游走,假設概率 \(q\) ,也可能會在層間 \(1-q\)
層內
其中第一個式子就是節點 u 到 v 在 k 層的游走概率
層間
可以看到第一個式子,如果該層同 u 相似的節點越大,則大概率可能往上走,即該式子 \(p_{k}\left(u_{k}, u_{k+1}\right)\) 較大
優化算法
優化DTW
上文的計算序列差異的 \(g(s(R_{k}(u)), s(R_{k}(v)))\) 的計算過程中,使用的是DTW算法。在這個計算過程中需要計算一個距離矩陣。作者就對這個距離矩陣的進行了優化。例如,節點 v 的鄰居度為4 4 5,對這個序列進行壓縮,<度,出現次數數>,<4, 2>,<5,1>
具體計算公式(用於計算距離矩陣)
\(\boldsymbol{a}=\left(a_{0}, a_{1}\right) \text { and } \boldsymbol{b}=\left(b_{0}, b_{1}\right) \text { are tuples in } A^{\prime} \text { and } B^{\prime}\)
\(A^{\prime} \text { and } B^{\prime}\) 是壓縮之后的元組序列
優化節點對
上文已經知道,我們在 k 層中,需要對每一對節點進行計算權重,而其實有一些節點對如果在 k=0 初始層的時候,就已經相差較大,則沒必要在 k=1... 層之后不斷去計算。比如 n 節點度為1,v節點度為10.
所以在該網絡中對所有節點按照度排序,然后按照二分查找,來確定 u 和哪些節點需要計算一個相似度
減少層數
但是幾層最好呢——對於不同場景,可以測試較優情況
推薦閱讀
論文代碼
https://github.com/leoribeiro/struc2vec
將部分代碼修改成python3支持的即可運行。看了一下代碼,寫的還是很清晰的,這里就不貼出來解讀了~