Node2Vec

article/2025/11/6 20:47:50

Node2Vec

论文名称:node2vec: Scalable Feature Learning for Networks

论文地址:https://www.kdd.org/kdd2016/papers/files/rfp0218-groverA.pdf

Node2Vec是用于学习网络节点的连续特征表示。node2vec将节点映射为低维特征表示,最大化网络邻居节点的似然表示。定义一组弹性的邻居节点的概念,设计有偏的随机游走策略,学习探索各种各样的邻居表示。

1.FEATURE LEARNING FRAMEWORK

G = ( V , E ) G=(V,E) G=(V,E)表示网络, 我们分析方法适用于有向(无向),有权(无权)的网络模型。 f : V → R d f:V\rightarrow \mathbb{R}^d f:VRd将节点映射为 特征表示,用于下游的预测任务。 d d d表示特征表示的维度。 f f f是大小为 ∣ V ∣ × d |V|\times d V×d的参数矩阵。对于每个source node u ∈ V u \in V uV, 我们定义 N S ( u ) ⊂ V N_{S}(u) \subset V NS(u)V 为通过采样策略 S S S获得 u u u节点的邻居节点。

我们采用扩展的Skip-gram结构。给定节点 u u u的特征表示,最大化邻居节点的log-probability。 f f f表示如下:
max ⁡ f ∑ u ∈ V log ⁡ Pr ⁡ ( N S ( u ) ∣ f ( u ) ) (1) \max _{f} \sum_{u \in V} \log \operatorname{Pr}\left(N_{S}(u) \mid f(u)\right)\tag{1} fmaxuVlogPr(NS(u)f(u))(1)
为了使得优化过程易于处理,我们作出两个假设:

  • 条件独立假设. 在给定source node的节点,他们的邻居节点是是独立的。
    Pr ⁡ ( N S ( u ) ∣ f ( u ) ) = ∏ n i ∈ N S ( u ) Pr ⁡ ( n i ∣ f ( u ) ) \operatorname{Pr}\left(N_{S}(u) \mid f(u)\right)=\prod_{n_{i} \in N_{S}(u)} \operatorname{Pr}\left(n_{i} \mid f(u)\right) Pr(NS(u)f(u))=niNS(u)Pr(nif(u))

  • Symmertry in feature space。 source node和neighborhood在feature space之间的影响是对称。

对source-neighborhood node pair的特征进行softmax dot product操作:
Pr ⁡ ( n i ∣ f ( u ) ) = exp ⁡ ( f ( n i ) ⋅ f ( u ) ) ∑ v ∈ V exp ⁡ ( f ( v ) ⋅ f ( u ) ) \operatorname{Pr}\left(n_{i} \mid f(u)\right)=\frac{\exp \left(f\left(n_{i}\right) \cdot f(u)\right)}{\sum_{v \in V} \exp (f(v) \cdot f(u))} Pr(nif(u))=vVexp(f(v)f(u))exp(f(ni)f(u))
根据以上假设Eq.1 简化为:
max ⁡ f ∑ u ∈ V [ − log ⁡ Z u + ∑ n i ∈ N S ( u ) f ( n i ) ⋅ f ( u ) ] (2) \max _{f} \sum_{u \in V}\left[-\log Z_{u}+\sum_{n_{i} \in N_{S}(u)} f\left(n_{i}\right) \cdot f(u)\right]\tag{2} fmaxuVlogZu+niNS(u)f(ni)f(u)(2)
对于每个节点的partition function, Z u = ∑ v ∈ V exp ⁡ ( f ( u ) ⋅ f ( v ) ) Z_{u}=\sum_{v \in V} \exp (f(u) \cdot f(v)) Zu=vVexp(f(u)f(v))对于大型网络的计算代价是非常大的,因此,我们采用负采样。采用随机梯度法优化Eq.2中的模型参数。

在文本中,基于连续的文字序列,通过window size定义它们的邻居。在网络中,采用随机策略生成source节点的不同的邻居,他们的邻居节点依赖于抽样策略 S S S

2.node2vec

基于BFS和DFS, 我们设计两者之间平滑的抽样策略。

2.1 Random Walks

设随机游走的长度 l l l, c i c_i ci是游走的第 i i i个节点, 起始节点 c 0 = u c_0=u c0=u。节点 c i c_i ci通过以下方式产生:
P ( c i = x ∣ c i − 1 = v ) = { π v x Z if  ( v , x ) ∈ E 0 otherwise  P\left(c_{i}=x \mid c_{i-1}=v\right)=\left\{\begin{array}{ll} \frac{\pi_{v x}}{Z} & \text { if }(v, x) \in E \\ 0 & \text { otherwise } \end{array}\right. P(ci=xci1=v)={Zπvx0 if (v,x)E otherwise 
π v x \pi_{vx} πvx是 节点v和节点x之间非标准化的转移概率, Z Z Z是用于标准化的常数。

2.2 Search bias α \alpha α

最简单直接的随机游走方式是基于边的权重 w v x w_{vx} wvx进行下一个节点的抽样。例如: π v x = w v x \pi_{vx}=w_{vx} πvx=wvx。(对于无权图 w v x = 1 w_{vx}=1 wvx=1)。但是,这种情况没有考虑到网络的结构,不能进行不同形式邻居节点的探查。BFS和DFS分别适合结构等价和同质的网络的极端采样范式。现实多是两种情况的融合,我们的随机游走对两者作出平衡。

在这里插入图片描述

根据 p p p q q q我们定义 2 n d 2^{nd} 2nd阶的随机游走, p p p q q q引导游走的方式:假设刚游走过一条边 ( t , v ) (t,v) (t,v), 现在处于节点 v v v,(Figure 2)。现在基于边 ( v , x ) (v,x) (v,x), 决定下一步游走的转移概率 π v x \pi_{vx} πvx。我们设未标准化的转移概率 π v x = α p q ( t , x ) ⋅ w v x \pi_{vx}=\alpha_{pq}(t,x)\cdot w_{vx} πvx=αpq(t,x)wvx,其中:
α p q ( t , x ) = { 1 p if  d t x = 0 1 if  d t x = 1 1 q if  d t x = 2 \alpha_{p q}(t, x)=\left\{\begin{array}{ll} \frac{1}{p} & \text { if } d_{t x}=0 \\ 1 & \text { if } d_{t x}=1 \\ \frac{1}{q} & \text { if } d_{t x}=2 \end{array}\right. αpq(t,x)=p11q1 if dtx=0 if dtx=1 if dtx=2
d t x d_{tx} dtx是节点 t t t和节点 x x x之间的最短路径。 d t x d_{tx} dtx是集合 { 0 , 1 , 2 } \{0,1,2\} {0,1,2}中的一个。两个参数对于引导游走的方式是非常必要的。

直观上,参数 p p p和参数 q q q是用来控制离开起始节点 u u u邻域的速度。特别的,这些参数允许我们的搜索过程在BFS和DFS之间进行插值,从而反映对不同节点的亲和力。

Return parameter p p p

参数 p p p控制在游走的过程中,折返( revisiting)访问节点可能性。如果将其设置一个较高的值 ( > max ⁡ ( q , 1 ) ) (\gt \max(q,1)) (>max(q,1)),采样到已经访问过节点的概率是非常小的(除非下一个节点没有邻居节点)。这个策略鼓励新的探索,避免重复过去无效2-hop。另一方面,如果 p p p比较小 ( < min ⁡ ( q , 1 ) ) (\lt\min(q,1)) (<min(q,1)),它将会导致游走的回溯(Figure 2), 将会导致在节点 u u u附近进行local walk。

In-out parameter q q q

参数 q q q控制“inward”和“outward”的参数。如Figure 2,如果 q > 1 q\gt1 q>1, 随机游走偏向节点 t t t。这个游走获得起始节点的局部视图,类似BFS,获取都是局部样本点。

如果 q < 1 q<1 q<1, 游走会远离节点 t t t, 进行更深层次访问。这种行为类似DFS探索。与DFS不同的是,我们基于随机游走的框架实现类似DFS探索。给定样本点 u u u, 抽样的样本不是严格遵循DFS的distance 递增过程,但是采样的效率是非常高的且易于处理。设 π v , x \pi_{v,x} πv,x是在 t t t时刻, 当前进行节点的函数,它们的随机游走符合马尔科夫性。

Benefits of random walks

在这里插入图片描述

在时间和空间复杂度方面,相对于 BFS和DFS, 随机游走的计算非常高效的。在空间复杂度方面, 存储节点邻居 O ∣ E ∣ O|E| OE. 在 2 n d 2^{nd} 2nd随机游走过程中,存储邻居间的交互,它们的空间复杂度是 O ( a 2 ∣ V ∣ ) O(a^2|V|) O(a2V), 其中 a a a是图平均度。在时间复杂度方面,通过在样本生成过程施加图连接,随机游走一种方便的机制,通过跨不同源节点重用样本来提高采样的效率。假设模拟 l > k l>k l>k随机游走, 由于马尔可夫性, 我们可以为 l − k l-k lk个节点一次产生 k k k个样本。因此,每个样本的复杂度为 O ( l k ( l − k ) ) O(\frac{l}{k(l-k)}) O(k(lk)l)。举例来说,我们随机游走 l = 6 l=6 l=6, 序列为 { u , s 4 , s 5 , s 6 , s 8 , s 9 } \{u, s_4, s_5, s_6, s_8, s_9\} {u,s4,s5,s6,s8,s9}, 会产生如下: N S ( u ) = { s 4 , s 5 , s 6 } N_{S}(u)=\left\{s_{4}, s_{5}, s_{6}\right\} NS(u)={s4,s5,s6} N S ( s 4 ) = { s 5 , s 6 , s 8 } N_{S}\left(s_{4}\right)=\left\{s_{5}, s_{6}, s_{8}\right\} NS(s4)={s5,s6,s8} N S ( s 5 ) = { s 6 , s 8 , s 9 } N_S(s_5)=\{s_6,s_8,s_9\} NS(s5)={s6,s8,s9}。需要注意的是:重用样本在整个过程中会引入偏差,但效率大大提高。

2.3 The node2vec algorithm

在这里插入图片描述

Algorithm 1是node2vec的伪代码,由于起始节点 u u u的选择, 在随机游走过程中,会存在隐含的偏差。因为我们要学习所有节点的表示,我们将每个节点作为起始节点,随机游走固定的长度 l l l, 游走 r r r次。每一步的游走基于转移概率 π v x \pi_{vx} πvx。对于二阶马尔科夫转移概率 π v x \pi_{vx} πvx可以事先计算。因此,对于节点的采样可以在 O ( 1 ) O(1) O(1)时间内完成。node2vec可以分为3个阶段:转移概率预计算、随机游走序列生成、SGD优化,三个过程串联进行。每个阶段可以并行、异步执行,对全局进行优化。

3 Learning edge features

node2vec提供半监督的方式学习节点特征表示。然而,相对个体节点,我们通常对节点对的预测任务更加感兴趣。例如,在链路预测任务中,判断两个节点是否存在边。因为随机游走自然地学习到网络节点之间的连接性。我们基于个体节点的特征表示,使用bootstrapping的方法,可以学习节点对之间的关系。

考虑两个节点 u u u v v v, 我们基于特征向量 f ( u ) f(u) f(u) f ( v ) f(v) f(v)定义二值算子 ∘ \circ ,用于计算表征向量 g ( u , v ) g(u,v) g(u,v), g : V × V → R d ′ g: V \times V \rightarrow \mathbb{R}^{d^{\prime}} g:V×VRd, 其中, d ′ d^{\prime} d是节点对 ( u , v ) (u,v) (u,v)表征大小。我们想让我们的算子对任何算子定义有效,即使节点之间的边不存在。这样做是方便链路预测。我们的测试数据包含真假边。我们考虑几种算子 ∘ \circ , 使得 d ′ = d d^{\prime}=d d=d, 总结在Table 1中。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/uT7AYwt7.shtml

相关文章

node2vec python 实现和理解

1. 安装 pip install node2vec 2. 使用案例 import networkx as nx from node2vec import Node2Vec# Create a graph 这里可以给出自己的graph graph nx.fast_gnp_random_graph(n100, p0.5)# Precompute probabilities and generate walks - **ON WINDOWS ONLY WORKS WITH …

node2vec的一些理解

node2vec node2vec也是一种网络嵌入的表示方法&#xff0c;它是基于DeepWalk的基础上进行改进的。主要改进的地方在于它在随机游走的过程中加入了一个权重&#xff0c;使得游走可以采用深度优先和广度优先的策略进行游走。 Search bias α 使得随机游走产生片偏差的最简单的…

从word2vec到node2vec

word2vec 1. 什么是word2vec 在自然语言处理任务&#xff08;NLP&#xff09;中&#xff0c;最细粒度是词语&#xff0c;所以处理NLP问题&#xff0c;首先要处理好词语。 由于所有自然语言中的词语&#xff0c;都是人类的抽象总结&#xff0c;是符号形式的。而对于数学模型&a…

详解Node2vec以及优缺点

1. 论文介绍 首先介绍了复杂网络面对的几种任务&#xff1a; 网络节点的分类&#xff0c;通俗点说就是将网络中的节点进行聚类&#xff0c;我们关心的是哪些节点具有类似的属性&#xff0c;就将其分到同一个类别中。链接预测&#xff0c;就是预测网络中哪些顶点有潜在的关联。…

node2vec论文阅读

本文要阅读的论文来自数据挖掘领域的顶级会议KDD-2016. 论文介绍了一种Graph representation方法 得益于CNN以及Seq2seq等模型&#xff0c;深度学习在图像和自然语言处理等领域有很好的应用。然而在涉及到图&#xff08;有向图&#xff0c;无向图&#xff09;结构的应用比如社…

【Graph Embedding】node2vec:算法原理,实现和应用

前面介绍过基于DFS邻域的DeepWalk和基于BFS邻域的LINE。 DeepWalk&#xff1a;算法原理&#xff0c;实现和应用 LINE&#xff1a;算法原理&#xff0c;实现和应用 node2vec是一种综合考虑DFS邻域和BFS邻域的graph embedding方法。简单来说&#xff0c;可以看作是eepwalk的一…

图与推荐系统(一):Graph Embedding之node2vec (原理 + 代码实战)

文章目录 一. 介绍二. 公式三. 代码细节四. 代码 一. 介绍 node2vec是一种综合考虑DFS邻域和BFS邻域的graph embedding方法。简单来说&#xff0c;可以看作是deepwalk的一种扩展&#xff0c;是结合了DFS和BFS随机游走的deepwalk。node2vec通过调整方向的参数来控制模型更倾向B…

图神经网络之Node2Vec详解

目录 背景传统算法存在的问题算法背景动机 算法随机序列的生成Node2Vec算法算法的具体流程&#xff1a; 总结相关资料 背景 传统算法存在的问题 一些方法中所提出的特征需要依赖人手工定义&#xff0c;这需要特定领域内专业人士来完成&#xff0c;而且依靠人手工定义特征的有…

node2vec算法

图嵌入算法 一、背景1.提出2.应用3.特点 二、DeepWalkRandomWalk 三、node2vec引言node2walkskip-gram(用中心词预测周围词) 一、背景 1.提出 ①使用邻接矩阵表示网络时&#xff0c;由于矩阵中大多数元素是0&#xff0c;难以体现节点间关系&#xff0c;同时数据的稀疏性使得计…

node2vec代码实现及详细解析

目录 前言1.数据导入2.node2vecWalk2.1 归一化转移概率2.1.1 原理解析2.1.2 Alias采样2.1.3 代码实现 2.2 node2vecWalk的实现 3.LearnFeatures4.参数选择5.完整代码 前言 在KDD 2016 | node2vec&#xff1a;Scalable Feature Learning for Networks 中我们详细讨论了node2vec…

Node2vec原理剖析,代码实现

DeepWalk原理介绍 与词嵌入类似&#xff0c;图嵌入基本理念是基于相邻顶点的关系&#xff0c;将目的顶点映射为稠密向量&#xff0c;以数值化的方式表达图中的信息&#xff0c;以便在下游任务中运用。 Word2Vec根据词与词的共现关系学习向量的表示&#xff0c;DeepWalk受其启…

Python(Pycharm)常用快捷键

1. Pycharm一键给所有代码加# CtrlA或者Ctrl/ 2. Pycharm格式化代码快捷键&#xff08;即标准化&#xff09; CtrlAltL 【注】qq也可能有此快捷键&#xff0c;把qq删掉就行 其实改掉Pycharm的里面的设置也可以&#xff08;这样就不会冲突了&#xff09; add keyboard shor…

python 中常见的快捷方式

相信大家在写代码的时候经常会用到快捷键&#xff0c;这不仅使编写代码的效率提高不少&#xff0c;还能装 X...下面整理了部分常见快捷键&#xff0c;后期会接着更新。废话不多说&#xff1a; 1.ctrlshiftA:万能命令行 可以新建一个python文件 2. shift两次:查看资源文件 3…

python的快捷键总结

电脑是解决众多问题的工具&#xff0c;尤其对于程序员而言&#xff0c;拥有一套快捷方式&#xff0c;在编程时&#xff0c;可以事半功倍&#xff0c;从而高效地完成工作任务&#xff0c;今天就带来一套快捷方式&#xff0c;仅供大家参考&#xff1a; 常见快捷方式&#xff1a; …

Python快捷键

1.注释(添加/消除)(Ctrl /) 这里说下Python的单行注释是 # , 多行注释是 注释内容 , java的单行注释是 // , 多行注释 /* 注释内容 */, 文档注释 /** 注释内容 */ 这里说的注释快捷键主要用于多行注释, 当你想把一段代码暂时注释掉的时候, 可以直接选中这段代码, 利用此快…

python 常用快捷键和设置

pycharm常用快捷键 转载自 大哥 1、编辑&#xff08;Editing&#xff09; Ctrl Space 基本的代码完成&#xff08;类、方法、属性&#xff09; Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息&#xff08;在方法中调用参数&#…

Python常用快捷键整理

Python常用快捷键整理 文章目录 Python常用快捷键整理一、注释二、删除三、格式四、 查看其它1. 代码自动整理 本文列举了常用的快捷键&#xff0c;暂时刚入门&#xff0c;还没有写太多&#xff0c;如有不足之处还请多多指教。 一、注释 行注释/取消行注释: Ctrl / 多行注释&…

python常用快捷键

一、编辑&#xff08;Editing&#xff09; Ctrl Space 基本的代码完成&#xff08;类、方法、属性&#xff09; Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息&#xff08;在方法中调用参数&#xff09; Ctrl Q 快速查看文档 F1 外部文档 S…

python常用快捷键,写代码事半功倍

今天就为大家带来一篇Python常用快捷键。觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。 最重要的快捷键 ctrlshiftA:万能命令行shift两次:查看资源文件 新建工程第一步操作 module设置把空包分层去掉,compact empty middle package设置当前的工…

OSGB数据的纹理压缩

运行环境 OSG3.4.1 VS2017 对osgb数据的压缩关键在于纹理的压缩&#xff0c;即可在writeNodeFIie方法中进行操作。 osgDB::writeNodeFile(*rootNode, f_path, new osgDB::Options("WriteImageHintIncludeFile"));osg老版本中的 writeImageHintIncludeFile 有缺陷(…