一、按照程序执行的顺序,第一步是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. 04-Python里字符串的常用操作方法三-判断

    1. startswith(): 判断字符串是否以某个子串开始,是则返回True,否则返回False 示例: my_str = 'hello world and my and test and pyt ...

  2. 孪生网络入门(上) Siamese Net及其损失函数

    最近在多个关键词(小数据集,无监督半监督,图像分割,SOTA模型)的范畴内,都看到了这样的一个概念,孪生网络,所以今天有空大概翻看了一下相关的经典论文和博文,之后做了一个简单的案例来强化理解.如果需要 ...

  3. java并发编程实战《七》安全性、活跃性以及性能问题

    安全性.活跃性以及性能问题 安全性问题 那什么是线程安全呢?其实本质上就是正确性,而正确性的含义就是程序按照我们期望的执行,不要让我们感到意外. 存在共享数据并且该数据会发生变化,通俗地讲就是有多个线 ...

  4. 区块链学习7:超级账本项目Hyperledger与Fabric以及二者的关系

    ☞ ░ 前往老猿Python博文目录 ░ 一.超级账本(hyperledger) 超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,成员包括 ...

  5. 第7.14节 Python类中的实例方法详析

    第7.14节 Python类中的实例方法详析 一.    实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1.    类体中定义实例方法 第一种方式很简单,就是在类体 ...

  6. 转:为什么浏览器的user-agent字符串以'Mozilla'开头呢?

    本文转自:https://blog.csdn.net/S_gy_Zetrov/article/details/79463093 感谢sgyzetrov翻译 如果熟悉元素审查的童鞋,很多都会发现requ ...

  7. PyQt(Python+Qt)学习随笔:QAbstractItemView的defaultDropAction属性

    老猿Python博文目录 老猿Python博客地址# 一.概述 defaultDropAction属性用于控制QAbstractItemView及其子类的实例视图中拖放时放下的默认操作.该属性的类型为 ...

  8. PyQt学习随笔:重写组件的event方法捕获组件的事件

    在PyQt的组件对象中,都有从QWidget中继承的方法event,而QWidget.event是对QObject类定义的虚拟方法event的实现. event方法的语法: bool event(QE ...

  9. 初识python-名片管理系统v1.0

    一.项目说明 本项目分享一个简单的名片管理系统,主要是通过实现简单的功能,来学习python基础. 具体功能有:新建名片.显示全部名片.查询.修改.删除名片 通过对名片的增删改查,来快速看懂pytho ...

  10. 浅谈php反序列化漏洞

    关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize(). 简单的理解: 序列化就是将一个对象变成字符串 反序列化是将字符串恢复成对象 这 ...