Graph Embedding(DeepWalk,LINE,Node2vec)

article/2025/11/6 20:53:20

在这里插入图片描述
为什么要对图进行嵌入?
直接在这种非结构的,数量不定(可能数目非常多),属性复杂的 图 上进行机器学习/深度学习是很困难的,而如果能处理为向量将非常的方便。但评价一个好的嵌入需要:

  • 保持图属性不变,如图的拓扑结构、顶点连接、顶点周围节点等
  • 嵌入速度应该与图的大小无关
  • 合适的维度以方便做下游任务

图表示学习性质

  • 如果没有标签。邻居节点的表示应该相似。
  • 如果存在标签。同类节点的表示应该相似。
  • 节点的顺序变化对表示没有影响。

Graph Embedding
图嵌入本身其实是属于表示学习。主要目的是将图中的节点/图表示成低维,实值,稠密的向量形式,使得到的向量能够做进一步的推理,以更好的实现下游任务。图嵌入包括顶点嵌入/图嵌入,嵌入的方法主要有矩阵分解,随机游走和深度学习

  • 矩阵分解。因为从某种程度上图中的各节点关系可以视为稀疏的矩阵,那么基于矩阵分解的方法就可以得到低维的向量。其中常用的矩阵包括普通的邻接矩阵,度矩阵,拉普拉斯矩阵,节点转移概率矩阵,节点属性矩阵等。
  • DeepWalk。通过对图随机游走得到一些序列,把序列当句子,利用word2vec就可以得到每一个“词”的向量了。(前提是基于句子某写词的出现和随机游走访问到的节点都服从幂律分布)。
  • Graph Neural Network: Graph+Neural Network都是图神经网络GNN,通过结合深度学习来得到图嵌入也是很不错的选择。(矩阵分解也是可以结合神经网络的)

Graph Factorization
和矩阵分解的思路一样,求得分解后的Z能够和原先的边权重Y有相同的效果:
f ( Y , Z , λ ) = 1 2 ∑ ( i , j ) ∈ E ( Y i j − < Z i , Z j > ) 2 + λ 2 ∑ i ∥ Z i ∥ 2 f(Y,Z,\lambda)=\frac{1}{2} \sum_{(i,j)\in E}(Y_{ij}-<Z_i,Z_j>)^2+\frac{\lambda}{2}\sum_i \|Z_i\|^2 f(Y,Z,λ)=21(i,j)E(Yij<Zi,Zj>)2+2λiZi2

本质上就是对邻接矩阵进行降维,给每个节点生成一个低维表示。
在这里插入图片描述
DeepWalk
出自2014的KDD,《DeepWalk: Online Learning of Social Representations》
而DeepWalk的思想如上图,具体就是从一个顶点出发,然后按照一定的概率随机移动到一个邻居节点,并将该节点作为新的当前节点,如此循环执行若干步,得到一条游走路径。然后把这个路径视为一个“句子”,用word2vec得到嵌入嵌入结果。

  • 采样。通过随机游走对图进行采样。论文中作者建议从每个顶点执行32到64次随机游走就差不多了,具体游走代码如下。
  • word2vec。将随机游走得到顶点路径当作word2vec中的句子。一般多使用skip-gram将随机游走顶点的one-hot向量作为输入,并最大化其相邻节点的预测概率。训练中通常预测20个邻居节点-左侧10个节点,右侧10个节点。
  • 训练结束后的副产物,每个“词”的向量就是顶点的嵌入向量了。
def random_walk(self, path_length, alpha=0, rand=random.Random(), start=None):""" Returns a truncated random walk.path_length: Length of the random walk.alpha: probability of restarts.start: the start node of the random walk."""G = self #图Gif start: #如果设置了开始节点path = [start]else:# 如果没有就随机选择path = [rand.choice(list(G.keys()))]#只要没到最大长度while len(path) < path_length:cur = path[-1]if len(G[cur]) > 0:#按一定概率转移if rand.random() >= alpha:path.append(rand.choice(G[cur]))else:path.append(path[0])else:breakreturn [str(node) for node in path]

可扩展:处理新加入节点,由于有random walk,所以只需要学习新的结点的信息就可以了
可并行:同时从不同的结点处开始random walk
在这里插入图片描述
LINE
出自2015WWW,《LINE: Large-scale Information Network Embedding》。
作者开源code:https://github.com/tangjianpku/LINE
LINE也是一种基于邻域相似假设的方法(网络中相似的点在向量表示中的距离比较近),但DeepWalk可以视做是一个DFS,而LINE更加倾向于BFS。主要由一阶相似度和二阶相似度组成。First-order Proximity:一阶相似度用于描述图中成对顶点之间的局部相似度(两个顶点之间的相似),Second-order Proximity:二阶相似度是顶点的顶点之间的相似度,直观来说朋友的朋友也算是我们的朋友,这也同样应该是有效的,如上图的5和6之间虽然没有边,但是有4个相同的邻居节点,所以理论上我们认为5和6在二阶上是相似的。算法流程为:

  • 模拟一阶相似度。顶点vi和vj之间的联合概率为 p 1 ( v i , v j ) = 1 1 + e x p ( − u i T ⋅ u j ) p_1(v_i,v_j)=\frac{1}{1+exp(-u_i^T \cdot u_j)} p1(vi,vj)=1+exp(uiTuj)1u是节点对应的向量,向量越接近,点积就越大,联合概率也就越大。为了保持一阶相似性,将联合概率与经验概率(两点之间边的权值越大,经验概率越大)进行比较,即: p 1 ′ ( i , j ) = w i j W p_1'(i,j)=\frac{w_{ij}}{W} p1(i,j)=Wwij O 1 = d ( p 1 , p 1 ′ ) = − ∑ w i j l o g p 1 ( v i , v j ) O_1=d(p_1,p_1')=-\sum w_{ij}log p_1(v_i,v_j) O1=d(p1,p1)=wijlogp1(vi,vj)d是衡量分布的函数,如果是KL散度来衡量则可以进一步展开,然后最小化该式子即可。另外,如果两节点之间无连接则直接设置为0。
  • 模拟二阶相似度。也是定义一个vj是vi的邻居的概率为(二阶的度量是,如果vj和vi相似,那么对应向量点积越大,vj越有可能是vi的邻居)
    p 2 ( v j ∣ v i ) = e x p ( u j T ⋅ u i ) ∑ e x p ( u j T ⋅ u i ) p_2(v_j|v_i)=\frac{exp(u_j^T \cdot u_i)}{\sum exp(u_j^T \cdot u_i)} p2(vjvi)=exp(ujTui)exp(ujTui)同样与经验概率(此处定义为Graph中所有节点可能是vi邻居的概率): p 2 ′ ( v j ∣ v i ) = w i j d i p_2'(v_j|v_i)=\frac{w_{ij}}{d_i} p2(vjvi)=diwij,其中wij是边(i,j)的权重,di是顶点i的出度。同时考虑到节点的重要程度可能不一样,所以加入度数作为权重,度数越高越重要。
    O 2 = − ∑ w i j l o g p 2 ( v j ∣ v i ) O_2=-\sum w_{ij} log p_2(v_j|v_i) O2=wijlogp2(vjvi)
  • 分别训练一阶相似度模型和二阶相似度模型,然后拼接。

Trick:为了避免算二阶时需要遍历每个节点,LINE使用负采样的思想来简化计算。
Think:计算一阶相似度中改变同一条边的方向对于最终结果没有影响,所以一阶只适合无向图。而二阶有出度入度,能够实现有向图。
如何处理新加入的节点? 根据经验分布和连接,优化O就可以了,其中原节点向量不变。
在这里插入图片描述
Node2vec
出自2016KDD,《node2vec: Scalable Feature Learning for Networks》
Node2vec 可以看作是对 DeepWalk 的一种更广义的抽象,主要是改进DeepWalk的随机游走策略。由于普通的随机游走无法很好地保留节点的局部信息,所以Node2vec多做了两个参数P和Q来加以控制(完全随机时P=Q=1),以获取邻域信息和更复杂的依存信息。

  • In-out,参数Q控制选择其他的新顶点的概率,偏广度优先,重视局部,即节点重要性。
  • Return,参数P控制返回原来顶点的概率,偏深度优先,重视全局,即群体重要性。

两个参数控制以达到BFS和DFS的平衡,具体如上图此时在绿色节点上,返回到前一步红色节点的概率是 1 P \frac{1}{P} P1,到达未与先前红色节点连接的节点的概率为 1 Q \frac{1}{Q} Q1,到达红色节点邻居的概率为1。

#不同之处只有转移的概率不同
def node2vec_walk(self, path_length, start):G = self nodes = self.nodesedges = self.edgespath = [start]while len(path) < path_length:        cur = path[-1]        cur_n = list(G.neighbors(cur)) #邻居节点       if len(cur_nbrs) > 0:            if len(path) == 1:                path.append(cur_n[sample(nodes[cur][0], nodes[cur][1])])            else:                prev = path[-2]                edge = (prev, cur)                next_node = cur_n[sample(edges[edge][0],edges[edge][1])]                path.append(next_node)        else:            breakreturn walk

图嵌入的本质是什么?
实际上他们仍然还是矩阵分解!!具体如下图:
在这里插入图片描述
感兴趣可以参考下pointwise mutual information,因为word2vec本身也可以从PMI来解释。而后面LINE,PTE(处理异构)和node2vec都是对游走加上了限制。

下一篇文章将整理十分稳定的SDNE和对整张图进行嵌入的graph2vec。


http://chatgpt.dhexx.cn/article/1pv17HlQ.shtml

相关文章

深度学习 - 33.GraphEmbedding Node2vec 图文详解

一.引言 前面介绍了如何生成带权的图: GraphEmbedding - networkx获取图结构 从带权的图随机游走生成序列: GraphEmbedding - DeepWalk 随机游走 embedding 向量的评估与可视化: GraphEmbedding - embedding 向量的降维与可视化 以及复杂度O(1)的采样算法 Alias: GraphEmbe…

Node2Vec算法介绍

大家好&#xff0c;我是Linzhuo&#xff0c;今天又来给大家分享graph embedding的相关知识啦。 在上一篇文章中&#xff0c;我们介绍了graph embedding的经典方法&#xff1a;Deepwalk&#xff0c;其通过随机游走(Random walk)的方式将Graph embedding与Word embedding的方法(w…

KDD 2016 | node2vec:Scalable Feature Learning for Networks

目录 前言Abstract1.IntroductionPresent work 2.Related Work3.Feature Learning Framework3.1 Classic search strategies3.2 node2vec3.2.1 Random Walks3.2.2 Search bias α \alpha α3.2.3 The node2vec algorithm 3.3 Learning edge features 4.Experiments4.1 Case St…

PyG基于Node2Vec实现节点分类及其可视化

文章目录 前言一、导入相关库二、加载Cora数据集三、定义Node2Vec四、定义模型五、模型训练六、可视化完整代码前言 大家好,我是阿光。 本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现),理论与实践相结合,如GCN、GAT、GraphS…

浅析 v-node

浅析 v-node &#x1f308; 本节我们来探索一下虚拟DOM&#xff0c;将会从以下4个方面进行阐述&#xff1a; 虚拟DOM的本质虚拟DOM的优势虚拟DOM转换真实DOM 过程虚拟DOM树 diff算法 虚拟DOM的本质 ⭐️虚拟DOM 本质上是一个 js 对象&#xff0c;用于描述页面的结构&#x…

deepwalknode2vec 代码实战

提示&#xff1a;笔记内容来自于B站up主同济子豪兄 文章目录 1. Embedding嵌入的艺术2. deepwalk2.1. 什么是图嵌入&#xff1f;2.2. deepwalk的步骤1、生成graph&#xff1b;2、利用random walk生成多个路径&#xff1b;3、训练表示向量的学习&#xff1b;4、为了解决分类个数…

Node2Vec

Node2Vec 论文名称&#xff1a;node2vec: Scalable Feature Learning for Networks 论文地址&#xff1a;https://www.kdd.org/kdd2016/papers/files/rfp0218-groverA.pdf Node2Vec是用于学习网络节点的连续特征表示。node2vec将节点映射为低维特征表示&#xff0c;最大化网…

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…