DeepWalk

基础理论

了解过 NLP 的同学对 word2vec 应该不陌生,word2vec 通过句子中词与词之间的共现关系来学习词的向量表示,如果你忘记了,可以看看我之前的博客:

  1. 【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识
  2. 【word2vec】篇二:基于Hierarchical Softmax的 CBOW 模型和 Skip-gram 模型
  3. 【word2vec】篇三:基于Negative Sampling 的 CBOW 模型和 Skip-gram 模型

DeepWalk 出自论文:DeepWalk: Online Learning of Social Representations,它的思想与 word2vec 类似,从一个初始节点沿着图中的边随机游走一定的步数,将经过的节点序列视为句子。那么,从不同的起点开始的不同游走路线就构成了不同的句子。当获取到足够数量的句子(节点访问序列)后,可以使用 skip-gram 模型对每个节点学习其向量表示。这个过程如下图所示:

以下是对 DeepWalk 的一些思考与个人理解:

DeepWalk 利用类似深度优先遍历的方式将复杂的图结构转换为序列,进而实现节点的Embedding。这个遍历的过程相当于对图中的节点进行采样,捕获局部上下文信息。上图中B与D都是A与E共有的邻居,那么在经过节点B、D的随机游走序列中,节点A或者节点E出现的频率也比较高,说明节点A和E具有相似的上下文语境,那么A和E的Embedding表示也应该相似。

下面再来看个更直观的例子,如下图中的节点1、4是节点2、3共有的邻居:

那么在经过节点1、4的随机游走序列中,节点2或者节点3出现的频率也比较高,例如:

  • 0,4,3
  • 0,4,2
  • 1,2
  • 1,3
  • 1,4,3
  • 1,4,2

那么根据 skip-gram 模型的思想,节点2,3的局部上下文语境比较相似,于是最终学习到的节点2、3的Embedding表示也就比较相似。这也意味着,当两个节点共有的邻居节点越多,那么这两个节点就越相似。

代码实现

结合上面的理论基础,要使用 DeepWalk 得到节点的向量表示,需要分为三个步骤:

1,构造图

主要是使用 networkx 这个库来从文件中读取边的信息来构造图,文件的每一行分别是:

node1 node2 <edge_weight>
node1 node3 <edge_weight>
......

其中,边的权重 edge_weight 不是必须有的。具体读取数据并构造图的代码如下:

import networkx as nx
# create_using=nx.DiGraph() 表示构造的是有向图
G = nx.read_edgelist('data/wiki/Wiki_edgelist.txt', create_using=nx.DiGraph())

2,随机游走

下面是生成随机游走序列的代码:

import random# 从 start_node 开始随机游走
def deepwalk_walk(walk_length, start_node):walk = [start_node]while len(walk) < walk_length:cur = walk[-1]cur_nbrs = list(G.neighbors(cur))if len(cur_nbrs) > 0:walk.append(random.choice(cur_nbrs))else:breakreturn walk# 产生随机游走序列
def _simulate_walks(nodes, num_walks, walk_length):walks = []for _ in range(num_walks):random.shuffle(nodes)for v in nodes:walks.append(deepwalk_walk(walk_length=walk_length, start_node=v))return walks# 得到所有节点
nodes = list(G.nodes())
# 得到序列
walks = _simulate_walks(nodes, num_walks=80, walk_length=10)

3,嵌入

为了方便起见,这里就使用 gensim 中的 Word2Vec 来实现节点的 Embedding 了:

from gensim.models import Word2Vec
# 默认嵌入到100维
w2v_model = Word2Vec(walks,sg=1,hs=1)
# 打印其中一个节点的嵌入向量
print(w2v_model['1397'])

输出为:

array([-3.57212842e-01, -4.52286422e-01,  1.20047189e-01,  9.33077093e-03,-4.87361886e-02,  6.53029561e-01,  3.87212396e-01, -4.35320556e-01,4.67856340e-02, -4.55924332e-01, -5.82973696e-02,  1.50977358e-01,......,-1.48566559e-01,  4.78760689e-01,  9.73562971e-02, -5.75734824e-02,-2.45316476e-01, -2.85568893e-01,  2.79851675e-01,  3.75600569e-02],dtype=float32)

优点分析

使用随机游走有两个好处:

  • 并行化,随机游走是局部的,对于一个大的网络来说,可以同时在不同的顶点开始进行一定长度的随机游走,多个随机游走同时进行,可以减少采样的时间。
  • 适应性,可以适应网络局部的变化。网络的演化通常是局部的点和边的变化,这样的变化只会对部分随机游走路径产生影响,因此在网络的演化过程中不需要每一次都重新计算整个网络的随机游走。

参考文章:

Graph Embedding:从DeepWalk到SDNE - 知乎

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

【图嵌入】DeepWalk原理与代码实战相关推荐

  1. A.图机器学习(GML)图神经网络(GNN)原理和代码实现(前置学习系列二)

    图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk.node2vec):图神经网络算法(GCN.GAT.GraphSage),部分进阶 GNN 模型(UniMP标签传播.ERNIESa ...

  2. 图机器学习(GML)图神经网络(GNN)原理和代码实现(前置学习系列二)

    图机器学习(GML)&图神经网络(GNN)原理和代码实现(PGL)[前置学习系列二] 上一个项目对图相关基础知识进行了详细讲述,下面进图GML networkx :NetworkX 是一个 P ...

  3. 岭回归算法的原理和代码实战

    岭回归算法的原理和代码实战 前言 学过吴恩达老师的机器学习入门课程都应该知道,在逻辑回归那一讲,吴老师提到了使用正则化来防止逻辑回归模型过拟合.而岭回归在这里的作用是一样的,同样也是防止模型过拟合.这 ...

  4. sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战

    sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战 # 自定义损失函数 i ...

  5. 论文|Node2vec算法原理、代码实战和在微信朋友圈的应用

    1 概述 Node2vec是2016年斯坦福教授 Jure Leskovec.Aditya Grover提出的论文,论文的下载链接为:https://arxiv.org/pdf/1607.00653. ...

  6. 接口并发测试之:WebSocket从原理到代码实战,我没草率~

    1. WebSocket协议详解 1.1 WebSocket的由来 1.2 WebSocket的原理 2. WebSocket的请求 2.1 WebSocket模块 2.2 WebSocket请求与响 ...

  7. 论文|LINE算法原理、代码实战和应用

    1 概述 LINE是2015年微软发表的一篇论文,其全称为: Large-scale Information Network Embedding.论文下载地址:https://arxiv.org/pd ...

  8. 【Graph Embedding】图嵌入的最佳实践—EGES(Enhanced Graph Embedding with Side Information)

    文章目录 EGES背景-DeepWalk理论与实现 DeepWalk引入推荐系统-EGES 在阅读此文之前建议先学习 word2vec详解. 2018 年,阿里巴巴公布了其在淘宝应用的Embeddin ...

  9. 【CS224W】(task4/5)图嵌入表示学习(Deepwalk、Node2vec)更新中

    note Node embedding的基本框架:encoder+decoder 最简单encoder是embedding-lookup表:ENC(v)=zv=Z⋅v\mathrm{ENC}(v)=z ...

最新文章

  1. 中台到底是什么?中台包含哪些内容?(包邮送书)
  2. R语言ggplot2可视化:使用热力图可视化dataframe数据
  3. 论文阅读:An Enhanced Deep Feature Representation for Person Re-identification
  4. 盛大EverBox网盘
  5. (31)FPGA米勒型状态机设计(二段式)(第7天)
  6. 同时安装python2和python3
  7. UGNX1957安装说明视频教程
  8. 一个产品经理的工作经历与总结
  9. 苹果雪豹操作系统正式版_苹果为旧机型发布iOS 12.4.2;macOS 10.14.6发布了,Catalina还远吗?...
  10. 友情链接加nofollow_如何在WordPress中Nofollow所有外部链接
  11. C# 操作American_America.US7ASCII编码的Oracle数据库出现乱码的问题。
  12. IPv4和IPv6的相互转换
  13. 论文阅读报告 Traffic-Based Dynamic Beam Coverage Adjustment in Satellite Mobile Communication
  14. JavaBean对象与jfinal的Record对象互转
  15. 2021年高考语文作文成绩查询,2021年国家高考语文作文题
  16. matlab的spm,医学图像的批量配准(Matlab,SPM),医学影像,matlabSPM
  17. ZKNUOJ 1015
  18. python阴阳鱼绘制(使用turtle)
  19. android中的日期选择器,Android-PickerView
  20. 微信小程序客服消息(带流程图)

热门文章

  1. ubuntu云主机上Flask+uwsgi+Nginx配置
  2. 关于sklearn中“决策树是否可以转化为json并进行绘制”的调研
  3. 低秩矩阵表示(LRR)
  4. 利用zookeeper实现分布式服务故障自动剔除/服务自动注册的思路
  5. 云计算逼迫运营商重新出海
  6. python之路----验证客户端合法性
  7. 【352天】我爱刷题系列111(2018.01.23)
  8. 你知道到底什么是Unikernel吗
  9. OpenFileDialog对话框Filter属性
  10. junit No tests found matching Method