zoukankan      html  css  js  c++  java
  • struc2vec 论文阅读

    论文目的

    强调依据的 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 之间的相似度:

    [egin{aligned} f_{k}(u, v)=f_{k-1}(u, v)+gleft(sleft(R_{k}(u) ight), sleft(R_{k}(v) ight) ight) &, \ k geq 0 ext { and }left|R_{k}(u) ight|,left|R_{k}(v) ight|>0 end{aligned}]

    这是一个递归式。(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))(用于下文的随机游走)

    [w_{k}(u, v)=e^{-f_{k}(u, v)}, quad k=0, ldots, k^{*} ]

    可以看到,(f_k) 越小 ==> 节点结构越相似 ==> (w) 越大 ==> 则权重值越大(用于随机游走)

    层间

    那么 (k) 的变动,会有不同的层,不同层之间 graph 结构是不变的(类似堆成的千层饼),所以不同层之间同一个节点我们添加两条通路:

    [egin{array}{l} wleft(u_{k}, u_{k+1} ight)=log left(Gamma_{k}(u)+e ight), quad k=0, ldots, k^{*}-1 \ wleft(u_{k}, u_{k-1} ight)=1, quad k=1, ldots, k^{*} end{array} ]

    其中

    [Gamma_{k}(u)=sum_{v in V} mathbb{1}left(w_{k}(u, v)>overline{w_{k}} ight) ]

    [overline{w_{k}}=sum_{(u, v) inleft(egin{array}{c} v \ 2 end{array} ight)} w_{k}(u, v) /left(egin{array}{l} n \ 2 end{array} ight) ]

    (overline{w_{k}}) 是该层的平均权重,所以第一个式子表示,如果该层的(Gamma_{k}(u))较大,也就是该层同 u 节点结构相似的数量较多,该层的k-hop,的 k 需要变大,这样包含的结构信息将会更多,才会找到更高层次的 structural similarity

    随走游走

    通过以上,我们构建了层内和层间的权重连边,这一切都是为了最终的随机游走
    每一跳,可能会在层内游走,假设概率 (q) ,也可能会在层间 (1-q)

    层内

    [p_{k}(u, v)=frac{e^{-f_{k}(u, v)}}{Z_{k}(u)} ]

    [Z_{k}(u)=sum_{v in V atop v eq u} e^{-f_{k}(u, v)} ]

    其中第一个式子就是节点 u 到 v 在 k 层的游走概率

    层间

    [egin{aligned} p_{k}left(u_{k}, u_{k+1} ight) &=frac{wleft(u_{k}, u_{k+1} ight)}{wleft(u_{k}, u_{k+1} ight)+wleft(u_{k}, u_{k-1} ight)} &= frac{log left(Gamma_{k}(u)+e ight)}{log left(Gamma_{k}(u)+e ight)+1} \ p_{k}left(u_{k}, u_{k-1} ight) &=1-p_{k}left(u_{k}, u_{k+1} ight) end{aligned} ]

    可以看到第一个式子,如果该层同 u 相似的节点越大,则大概率可能往上走,即该式子 (p_{k}left(u_{k}, u_{k+1} ight)) 较大

    优化算法

    优化DTW

    上文的计算序列差异的 (g(s(R_{k}(u)), s(R_{k}(v)))) 的计算过程中,使用的是DTW算法。在这个计算过程中需要计算一个距离矩阵。作者就对这个距离矩阵的进行了优化。例如,节点 v 的邻居度为4 4 5,对这个序列进行压缩,<度,出现次数数>,<4, 2>,<5,1>
    具体计算公式(用于计算距离矩阵)

    [operatorname{dist}(oldsymbol{a}, oldsymbol{b})=left(frac{max left(a_{0}, b_{0} ight)}{min left(a_{0}, b_{0} ight)}-1 ight) max left(a_{1}, b_{1} ight) ]

    (oldsymbol{a}=left(a_{0}, a_{1} ight) ext { and } oldsymbol{b}=left(b_{0}, b_{1} ight) ext { are tuples in } A^{prime} ext { and } B^{prime})
    (A^{prime} ext { and } B^{prime}) 是压缩之后的元组序列

    优化节点对

    上文已经知道,我们在 k 层中,需要对每一对节点进行计算权重,而其实有一些节点对如果在 k=0 初始层的时候,就已经相差较大,则没必要在 k=1... 层之后不断去计算。比如 n 节点度为1,v节点度为10.
    所以在该网络中对所有节点按照度排序,然后按照二分查找,来确定 u 和哪些节点需要计算一个相似度

    减少层数

    但是几层最好呢——对于不同场景,可以测试较优情况

    推荐阅读

    https://blog.acolyer.org/2017/09/15/struc2vec-learning-node-representations-from-structural-identity/ 图文并茂

    论文代码

    https://github.com/leoribeiro/struc2vec
    将部分代码修改成python3支持的即可运行。看了一下代码,写的还是很清晰的,这里就不贴出来解读了~

    验证实验

    ============ 当我沉默时,我觉得充实。当我开口说话时,却觉得空虚 ===========
  • 相关阅读:
    228. Summary Ranges
    324. Wiggle Sort II
    42. Trapping Rain Water
    工作之后
    279. Perfect Squares
    391. Perfect Rectangle
    351. Android Unlock Patterns
    246. Strobogrammatic Number
    [LeetCode] 75. Sort Colors Java
    [Java] 80. Remove Duplicates from Sorted Array II Java
  • 原文地址:https://www.cnblogs.com/KongHuZi/p/13409533.html
Copyright © 2011-2022 走看看