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还扩展 ...
随机推荐
- SpringIOC循环依赖
目录 1. 什么是循环依赖 注意: 这⾥不是函数的循环调⽤,是对象的相互依赖关系. 循环调⽤其实就是⼀个死循环,除⾮有终结 条件. 2. 循环依赖处理机制 2.1 演示场景: 2.2 处理机制简图 总 ...
- 转载的一篇文章eclipse添加插件
eclipse没有(添加)"Dynamic Web Project"选项的方法 转载海边的第八只螃蟹 最后发布于2015-11-24 21:24:15 阅读数 40814 收藏 ...
- getElementBy系列和querySelector系列的区别
querySelector和querySelectorAll的用法和getElementBy大致一样,获取的时候带上符号,getElementBy获取的是元素的动态集合,querySelector获取 ...
- C#数据结构-二叉树-链式存储结构
对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...
- Python正则表达式re模块学习遇到的问题
Python正则表达式处理的组是什么? Python正则表达式处理中的匹配对象是什么? Python匹配对象的groups.groupdict和group之间的关系 Python正则表达式re.mat ...
- Day6 Scrum 冲刺博客
一.站立式会议# 1. 会议照片 2. 工作进度+燃尽图 团队成员 昨日完成工作 今日工作计划 遇到的困难 周梓波 将方块旋转变形 添加键盘监听事件 不熟悉监听事件的操作 纪昂学 左右 ...
- 题解-ARC058D Iroha Loves Strings
题面 ARC058D Iroha Loves Strings 给定 \(n\) 个字符串,从中选出若干个按给出顺序连接起来,总长等于 \(m\),求字典序最小的,保证有解. 数据范围:\(1\le n ...
- CSP-S2020 DP专项训练
前言 \(\text{CPS-S2020}\) 已然临近,而 \(\text{DP}\) 作为联赛中的常考内容,是必不可少的复习要点,现根据教练和个人刷题,整理部分好题如下(其实基本上是直接搬--). ...
- hash相关
转译☞:https://www.cs.rice.edu/~as143/COMP441_Spring17/scribe/lect4.pdf 1 大规模图片检索问题 基于树模型的算法在分类跟聚类中很受欢迎 ...
- SSM框架中常用的注解及含义
@Controller---使用它标记在一个类上,dispatcher会扫描使用该注解类的方法,并检测该方法是否使用了@RequestMapping注解,加上RequestMapping注解的方法才是 ...