网络表示学习NRL之node2vec
有很多的叫法,GRL, NRL, GE(graph embedding)等等,感觉都是得到图的嵌入表示。
deepwalk
原理
从每一个节点出发,每次随机从邻居中选择一个作为下一个节点
node2vec
原理
deepwalk和LINE分别倾向于DFS和BFS,而node2vec则是使用了权重作为概率,介于DFS和BFS之间。
主要分为三部分:
计算基于边的转移概率:这里是上一个点不是起始点需要用的。
下图的意思是,从t出发,到达v之后,再往其他位置走的概率如下公式。(前面至少两个点才能用这个,起始点的话就只能用权重做归一化了)。感觉参考一的这个公式有点问题,下面是自己改的。

基于节点的转移概率:对于起始点而言,将该节点的每一条边的权重归一化,作为走那边的概率。
alias取样:需要对每一个节点和边都生成accept和alias列表。节点的alias tables其实意义不大,主要是边的,最后取样。这个取样,其实就是依据概率,看你走那条边。
个人觉得,其实不用这个算法也可以,就轮盘赌,挨着比大小,就是复杂度高很多,而且一些图的节点比较多。
取样完成后使用skip-gram算法对walks进行嵌入,参考一中用gensim中的word2vec。
alias算法—一种\(O(1)\)的采样算法
个人感觉跟之前学的轮盘赌算法差不多,alias牺牲空间,换来时间,但是实际计算accept和alias的时候任然是$O(N) $
第一幅图代表一个概率轮盘,一般来说,我们需要生成一个0到1的随机数,判断在哪个区间,从而得到取样结果,也就是命中的那一块。
依次遍历复杂度为\(O(N)\), 二分法复杂度为\(O(log(N))\)

alias算法按照下面的公式,这里N=4,先归一化,然后乘以区域个数。之后,切割矩形,保证每一个柱子的大小为1,并且只能由最多之前的两块合成一个,得到下图,可以任意拼凑,满足条件即可。

Accept就是原本该块留下来的面积,alias对应的是另一种颜色区域的编号。

第一次学习的时候感觉不可思议,后面看看确实是那么回事,可以找找证明。

实现
参考一中非常详细
参考
GraphEmbedding - Node2vec 图文详解_BITDDD小栈-CSDN博客_node2vec
【图嵌入】DeepWalk 和 Node2Vec - 那少年和狗 - 博客园 alias算法的图很好

浙公网安备 33010602011771号