node2vec实现源码详解
一、按照程序执行的顺序,第一步是walker.py中的preprocess_transition_probs()函数
这个函数的作用是生成两个采样预备数据,alias_nodes,alias_edges。
两份数据又各自包含两个列表,这两个列表分别对应着alias采样中的概率和另一个选项,具体alias采样详见https://blog.csdn.net/haolexiao/article/details/65157026
alias_nodes:根据node和它的邻居之间的权重确定采样的概率,权重越高,被采中的概率越大。
alias_edges:调用get_alias_edge()函数生成,返回在前一个访问顶点为t,当前顶点为v时决定下一次访问哪个邻接点时需要的alias表
1 def preprocess_transition_probs(self):
2 """
3 Preprocessing of transition probabilities for guiding the random walks.
4 """
5 G = self.G
6
7 alias_nodes = {}
8 for node in G.nodes():
9 unnormalized_probs = [G[node][nbr].get('weight', 1.0)
10 for nbr in G.neighbors(node)]
11 norm_const = sum(unnormalized_probs)
12 normalized_probs = [
13 float(u_prob)/norm_const for u_prob in unnormalized_probs]
14 alias_nodes[node] = create_alias_table(normalized_probs)
15
16 alias_edges = {}
17
18 for edge in G.edges():
19 alias_edges[edge] = self.get_alias_edge(edge[0], edge[1])
20
21 self.alias_nodes = alias_nodes
22 self.alias_edges = alias_edges
23
24 return
二、第二个比较重要的函数是node2vec_walk()函数
该函数是从start_node开始,生成walk_length长度的序列,序列的生成除了考虑当前节点,还考虑前一个遍历的节点。
采样方法是根据之前生成的alias数据进行采样。
对每一个节点都生成一个序列
def node2vec_walk(self, walk_length, start_node):
1 def node2vec_walk(self, walk_length, start_node):
2
3 G = self.G
4 alias_nodes = self.alias_nodes
5 alias_edges = self.alias_edges
6
7 walk = [start_node]
8
9 while len(walk) < walk_length:
10 cur = walk[-1]
11 cur_nbrs = list(G.neighbors(cur))
12 if len(cur_nbrs) > 0:
13 if len(walk) == 1:
14 walk.append(
15 cur_nbrs[alias_sample(alias_nodes[cur][0], alias_nodes[cur][1])])
16 else:
17 prev = walk[-2]
18 edge = (prev, cur)
19 try:
20 prob=alias_edges[edge][0]
21 alias=alias_edges[edge][1]
22 except KeyError:
23 print()
24 next_node = cur_nbrs[alias_sample(prob,alias)]
25 walk.append(next_node)
26 else:
27 break
28
29 return walk
三、之后就是调用gensim中的Word2Vec进行训练,得到每个节点的embedding。
node2vec实现源码详解的更多相关文章
- Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- 条件随机场之CRF++源码详解-预测
这篇文章主要讲解CRF++实现预测的过程,预测的算法以及代码实现相对来说比较简单,所以这篇文章理解起来也会比上一篇条件随机场训练的内容要容易. 预测 上一篇条件随机场训练的源码详解中,有一个地方并没有 ...
- [转]Linux内核源码详解--iostat
Linux内核源码详解——命令篇之iostat 转自:http://www.cnblogs.com/york-hust/p/4846497.html 本文主要分析了Linux的iostat命令的源码, ...
- saltstack源码详解一
目录 初识源码流程 入口 1.grains.items 2.pillar.items 2/3: 是否可以用python脚本实现 总结pillar源码分析: @(python之路)[saltstack源 ...
- Shiro 登录认证源码详解
Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...
- udhcp源码详解(五) 之DHCP包--options字段
中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说 ...
- Activiti架构分析及源码详解
目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...
- 源码详解系列(六) ------ 全面讲解druid的使用和源码
简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...
随机推荐
- 利用python库stats进行t检验
t检验通常分为三种,分别是单样本t检验.双样本t检验和配对样本t检验.本文基于python的scipy.stats函数对每种t检验进行了介绍和实验. 一.t检验介绍 无论哪种t检验,都有以下的基本 ...
- django+celery+redis应用
一.celery介绍 1.应用场景 a. Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用ce ...
- python实现自动发邮件
Python有两个内置库:smtplib和email,可以实现邮件功能,无需下载,直接import导入. smtplib库负责发送邮件 Email库负责构造邮件格式和内容 邮件发送需要遵守SMTP协议 ...
- 分布式文件系统HDFS-部署和配置
1 部署HDFS HDFS的基本操作可以分为集群管理和文件系统操作两种类型: 集群管理:包括Namenodede 的格式化.集群的启动和停止.集群信息查看等. 文件系统:包括对目录.文件和权限等内容的 ...
- John the Ripper快速密码破解工具简单使用
在某场比赛中师傅们说需要用到该工具,学习之 题目给了我们一个流量包,分析 发现 .hint.php.swp文件 该文件是使用 vim 编辑文件时异常退出而产生的,可以通过 vim -r 文件名 进行相 ...
- Mac上特殊方式启动Parallels Desktop 16.0.0 (48916)
背景: mbp升级到Big Sur版本,Parallels Desktop使用到是16.0.0 (48916)版本,然而由于兼容性问题,Parallels Desktop截止当前无法正常使用. 网上搜 ...
- webpack项目如何正确打包引入的自定义字体?
一. 如何在Vue或React项目中使用自定义字体 在开发前端项目时,经常会遇到UI同事希望在项目中使用一个炫酷字体的需求.那么怎么在项目中使用自定义字体呢? 其实实现起来并不复杂,可以借用CSS3 ...
- setTimeout和setInterval的区别,包含内存方面的分析?
setTimeout表示间隔一段时间之后执行一次调用,而setInterval则是每间隔一段时间循环调用,直至clearInterval结束. 内存方面,setTimeout只需要进入一次队列,不会造 ...
- 【题解】P3629 [APIO2010]巡逻
link 题意 有 \(n\) 个村庄,编号为 \(1, 2, ..., n\) .有 \(n – 1\) 条道路连接着这些村 庄,从任何一个村庄都可以到达其他任一个村庄.道路长度均为 1. 巡警车每 ...
- Salesforce LWC学习(二十八) 复制内容到系统剪贴板(clipboard)
本篇参考: https://developer.mozilla.org/zh-CN/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipb ...