一、按照程序执行的顺序,第一步是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实现源码详解的更多相关文章

  1. Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解

    Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...

  2. spring事务详解(三)源码详解

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  3. 条件随机场之CRF++源码详解-预测

    这篇文章主要讲解CRF++实现预测的过程,预测的算法以及代码实现相对来说比较简单,所以这篇文章理解起来也会比上一篇条件随机场训练的内容要容易. 预测 上一篇条件随机场训练的源码详解中,有一个地方并没有 ...

  4. [转]Linux内核源码详解--iostat

    Linux内核源码详解——命令篇之iostat 转自:http://www.cnblogs.com/york-hust/p/4846497.html 本文主要分析了Linux的iostat命令的源码, ...

  5. saltstack源码详解一

    目录 初识源码流程 入口 1.grains.items 2.pillar.items 2/3: 是否可以用python脚本实现 总结pillar源码分析: @(python之路)[saltstack源 ...

  6. Shiro 登录认证源码详解

    Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...

  7. udhcp源码详解(五) 之DHCP包--options字段

    中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说 ...

  8. Activiti架构分析及源码详解

    目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...

  9. 源码详解系列(六) ------ 全面讲解druid的使用和源码

    简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...

随机推荐

  1. uni-app 封装接口request请求

    我们知道一个项目中对于前期架构的搭建工作对于后期的制作有多么重要,所以不管做什么项目我们拿到需求后一定要认真的分析一下,要和产品以及后台沟通好,其中尤为重要的一个环节莫过于封装接口请求了.因为前期封装 ...

  2. 再也不担心写出臃肿的Flink流处理程序啦,发现一款将Flink与Spring生态完美融合的脚手架工程-懒松鼠Flink-Boot

    目录 你可能面临如下苦恼: 接口缓存 重试机制 Bean校验 等等...... 它为流计算开发工程师解决了 有了它你的代码就像这样子: 仓库地址:懒松鼠Flink-Boot 1. 组织结构 2. 技术 ...

  3. 【NOIP2017提高A组模拟9.12】Arrays and Palindrome

    [NOIP2017提高A组模拟9.12]Arrays and Palindrome[SPJ] 题目 Description Input Output Sample Input 1 6 Sample O ...

  4. 从TFS到git的持续集成之路

    前言 公司目前使用TFS,由于TFS不灵活不能很好的持续集成,且给测试造成很大重的负担,所以近期准备迁移到git上 目标 解决项目运转的瓶颈(版本太多,导致测试跟不上,需引入自动化测试) 过程 主线分 ...

  5. PyQt学习随笔:QTableWidget的信号signal简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget非继承自父类的信号如下: cellActivated(int row, in ...

  6. PHP代码审计分段讲解(5)

    11 sql闭合绕过 源代码为 <?php if($_POST[user] && $_POST[pass]) { $conn = mysql_connect("**** ...

  7. git——同步本地文件到github上

    参考教程: 1.https://blog.csdn.net/weixin_37769855/article/details/99439904 2.https://www.liaoxuefeng.com ...

  8. NET CORE通过NodeService调用js

    在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 .NET C ...

  9. 第 4 篇 Scrum 冲刺博客

    每天举行会议 会议照片: 昨天已完成的工作与今天计划完成的工作及工作中遇到的困难: 成员姓名 昨天完成工作 今天计划完成的工作 工作中遇到的困难 蔡双浩 实现收藏夹功能 实现重设计的个人界面功能 无 ...

  10. CF1407D Discrete Centrifugal Jumps 题解

    蒟蒻语 写了 \(100\) 行的 线段树上ST表维护二分维护单调栈维护dp, 结果最后发现只要俩单调栈就好了 = = 蒟蒻解 首先 \(dp_i\) 表示从 \(1\) 楼到 \(i\) 楼要跳几次 ...