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还扩展 ...
随机推荐
- MiniUI日期选择框MonthPicker英文修改为中文
一.详细内容及解决方案 正常MIniUI的MonthPicker中的月份和星期默认是英文的,我百度搜索关于这个问题的博客少之又少,下面说下解决办法,非常简单. <input id="d ...
- moviepy音视频剪辑:AudioClip的max_volume方法报TypeError: bad operand type for abs(): ‘list‘错
☞ ░ 前往老猿Python博文目录 ░ 一.环境 操作系统:win7 64位 moviepy:1.0.3 numpy:1.19.0 Python:3.7.2 二.应用代码及报错信息 应用代码 imp ...
- PyQt(Python+Qt)学习随笔:QWidget部件的palette属性以及ColorGroup、colorRole的用途和含义
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 1.palette属性 QWidget部件的palette属性用于控制 ...
- PyQt(Python+Qt)学习随笔:树型部件的QTreeWidgetItem项中列不同角色数据的有关访问方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget中的QTreeWidgetItem项中可以有多列数据,每列数据可以根据 ...
- PyQt学习随笔:槽函数获取信号发送对象的方法
在PyQt中,相似控件发送的信号可以每个控件信号对应一个槽函数,也可以将相似控件的相同信号对应到一个槽函数,但如果槽函数相同,怎么区分信号是谁发送的呢?那就是在信号函数中使用sender()函数获取信 ...
- CF500G / T148321 走廊巡逻
题目链接 这题是 Codeforces Goodbye 2014 的最后一题 CF500G,只是去掉了 \(u \not= x, v \not = v\) 的条件. 官方题解感觉有很多东西说的迷迷瞪瞪 ...
- BJOI2017 机动训练
落谷.Loj. Description 定义机动路径为: 没有自环 路径至少包含两个格子 从起点开始每一步都向不远离终点的方向移动 相同地形序列指路径上顺序经过的地形序列. 定义机动路径的权值为相同地 ...
- STL——容器(List)list 数据的存取
list.front(); //返回第一个元素 list.back(); //返回最后一个元素 1 #include <iostream> 2 #include <list> ...
- 如何自定义Kubernetes资源
目前最流行的微服务架构非Springboot+Kubernetes+Istio莫属, 然而随着越来越多的微服务被拆分出来, 不但Deploy过程boilerplate的配置越来越多, 且繁琐易错, 维 ...
- Spring Boot 日志各种使用姿势,是时候捋清楚了!
@ 目录 1. Java 日志概览 1.1 总体概览 1.2 日志级别 1.3 综合对比 1.4 最佳实践 2. Spring Boot 日志实现 2.1 Spring Boot 日志配置 2.2 L ...