Graph Embedding简史
传统意义上的 Graph Embedding 被看成是一个降维的过程,将网络投影到欧式空间,但是会造成结点特征的损失。主要的方法包括主成分分析(PCA)和多维缩放(MDS)。所有的方法都可以理解成运用一个 n × k 的矩阵来表示原始的 n × m 矩阵,其中 k << n。
在 2000 年代早期,又提出了其他方法,如 IsoMap 和 LLE,以保持非线性流形的整体结构。总的来说,这些方法都在小型网络上提供了良好的性能。然而这些方法的时间复杂性至少是二次的,这使得它们无法在大规模网络上运行。

随着深度学习的不断发展,DeepWalk第一个被提出来,使用表示学习(或深度学习)来进行网络的向量化表示。DeepWalk通过将节点视为单词并生成短随机游走(广度优先BFS)作为句子来弥补网络嵌入和单词嵌入之间的差距。然后,可以将诸如Skip-gram之类的神经语言模型应用于这些随机游走以获得网络嵌入。
但是,DeepWalk中的实现是完全随机的,根据Random Walk的不同,后面又衍生出了node2vec算法,解决了DeepWalk定义的结点相似度不能很好反映原网络结构的问题。LINE在其基础上,探究一阶相似度(相邻结点)与二阶相似度(不相邻结点),在一定程度上超脱出了传统方式对网络拓扑结构的依赖。

但是,Word2vec一众方法都是浅层模型,并且需要根据不同的应用定义相似函数,不易延展。并且对拓扑结构的过度依赖导致鲁棒性不强。因此,GNN出现了。
Node2vec
在Node2vec之前,需要稍稍了解一下一下deepwalk。Deepwalk主要思想是在图上进行结点的序列采样,将采样的结果作为结点的特征,并使用word2vec对序列进行embedding。主要步骤分为两部分:
- 第一步为随机游走采样节点序列。
- 第二步为使用skip-gram model学习表达向量。
Node2vec就是在DeepWalk的基础上对游走的方式进行了更改,啊具体的原理暂时懒得写,大家可以看node2vec:算法原理,实现和应用。
源码解读
来源于Github的开源代码:https://github.com/eliorc/node2vec。pip安装:
pip install node2vec
安装之后的包中主要有三个文件:

其中,edges.py主要通过训练好的结点向量来生成边的embedding
node2vec.py是生成结点的embedding的向量。
parallel.py用于生成图上的随机游走序列,返回一个walk的list,每一步walk都是一个结点。
在node2vec.py中封装了Node2vec类,其包含三个函数,分别对应node2vec实现的三步:
- _precompute_probabilities:生成结点之间的转移概率。
- _generate_walks:根据转移概率进行随机游走。
- fit:借助gensim.models.Word2Vec对游走之后的结点序列进行拟合,生成结点的embedding。
代码实践
在使用之前,需要在模块安装的路径对文件进行更改,否则此模块名和内部的py文件名重复(都是node2vec),使用时会报错。

接下来就可以使用了:
import networkx as nx
from node2vec_.node2vec import Node2Vec # 注意我的node2vec文件名改成了node2vec_
使用方法与word2vec类似,不过输入一定是一个networkx.graph的类,这个类根据自己实际的情况生成:
node2vec = Node2Vec(graph, dimensions=64, walk_length=30, num_walks=200, workers=4) # Use temp_folder for big graphs
# Embed nodes
mod

本文深入探讨了Node2vec算法,一种基于深度学习的图嵌入方法,改进了DeepWalk的随机游走策略,以更准确地捕捉网络结构。文章详细介绍了Node2vec的工作原理、实现步骤及代码实践,展示了如何在真实数据集上生成节点嵌入,适用于节点分类和链接预测等任务。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



