Node2Vec实战

数据结构

两个两个连接的节点

1 2
2 3
4 5

主程序构建

G = nx.read_edgelist('../data/text.txt',create_using=nx.DiGraph(), nodetype=None, data=[('weight', int)])
## 构建模型
model = Node2Vec(G, walk_length=10, num_walks=80,p=0.25, q=4, workers=1, use_rejection_sampling=0)
## 训练
model.train(embed_size=4, window_size=5, iter=3)
embeddings = model.get_embeddings()
print(embeddings)

初始生成节点到节点的概率

def preprocess_transition_probs(self):'''Preprocessing of transition probabilities for guiding the random walks.'''####get_alias_edge这个函数是对每条边设定为二阶randomwalk的概率形式###这个函数的作用是生成每个边界的概率,同时会有alias_setup这个函数将概率进行转换,方便后面抽样G = self.Gis_directed = self.is_directedalias_nodes = {}for node in G.nodes():unnormalized_probs = [G[node][nbr]['weight'] for nbr in sorted(G.neighbors(node))]#读取每个邻点权重norm_const = sum(unnormalized_probs)###权重求和,作为公式中正则项常数的那个分母normalized_probs =  [float(u_prob)/norm_const for u_prob in unnormalized_probs]###除以分母alias_nodes[node] = alias_setup(normalized_probs)alias_edges = {}triads = {}if is_directed:for edge in G.edges():alias_edges[edge] = self.get_alias_edge(edge[0], edge[1])else:for edge in G.edges():alias_edges[edge] = self.get_alias_edge(edge[0], edge[1])alias_edges[(edge[1], edge[0])] = self.get_alias_edge(edge[1], edge[0])self.alias_nodes = alias_nodesself.alias_edges = alias_edgesreturn

get_alias_edge是得到节点到节点的概率

def get_alias_edge(self, src, dst):####二阶ramdom walk#src是随机游走序列中的上一个节点,dst是当前节点'''Get the alias edge setup lists for a given edge.'''G = self.Gp = self.pq = self.qunnormalized_probs = []for dst_nbr in sorted(G.neighbors(dst)):if dst_nbr == src:unnormalized_probs.append(G[dst][dst_nbr]['weight']/p)elif G.has_edge(dst_nbr, src):unnormalized_probs.append(G[dst][dst_nbr]['weight'])else:unnormalized_probs.append(G[dst][dst_nbr]['weight']/q)norm_const = sum(unnormalized_probs)normalized_probs =  [float(u_prob)/norm_const for u_prob in unnormalized_probs]return alias_setup(normalized_probs)

alias_setup :输入概率,得到对应的两组数,方便后面的抽样调用

def alias_setup(probs):'''alias_setup的作用是根据二阶random walk输出的概率变成每个节点对应两个数,被后面的alias_draw函数所进行抽样'''K = len(probs)q = np.zeros(K)J = np.zeros(K, dtype=np.int)smaller = []larger = []for kk, prob in enumerate(probs):q[kk] = K*probif q[kk] < 1.0:smaller.append(kk)else:larger.append(kk)##kk是下标,表示哪些下标小while len(smaller) > 0 and len(larger) > 0:small = smaller.pop()##smaller自己也会减少最右边的值large = larger.pop()J[small] = largeq[large] = q[large] + q[small] - 1.0if q[large] < 1.0:smaller.append(large)else:larger.append(large)return J, q

alias_draw 抽样函数

def alias_draw(J, q):'''Draw sample from a non-uniform discrete distribution using alias sampling.'''K = len(J)kk = int(np.floor(np.random.rand()*K))if np.random.rand() < q[kk]:return kkelse:return J[kk]

node2vec_walk就是对于给定的长度,对于开始节点开始模拟这个节点的路径,涉及的函数都在上面提及

def node2vec_walk(self, walk_length, start_node):'''Simulate a random walk starting from start node.'''G = self.Galias_nodes = self.alias_nodesalias_edges = self.alias_edgeswalk = [start_node]######alias_draw这个函数是等于是根据二阶random walk概率选择下一个点while len(walk) < walk_length:cur = walk[-1]cur_nbrs = sorted(G.neighbors(cur))###G.neighbors(cur)得到cur一级关联的节点if len(cur_nbrs) > 0:if len(walk) == 1:####cur[0]walk.append(cur_nbrs[alias_draw(alias_nodes[cur][0], alias_nodes[cur][1])])else:prev = walk[-2]next = cur_nbrs[alias_draw(alias_edges[(prev, cur)][0], alias_edges[(prev, cur)][1])]walk.append(next)else:breakreturn walk

Node2Vec实战相关推荐

  1. 手撕图机器学习,图神经网络

    手撕图机器学习,图神经网络 写在前面 & 配套链接(访者必读) 图的基本表示 图的基本参数 图的类别 节点连接数(Node degree) 图的矩阵表示(邻接矩阵) 连接列表和邻接列表 其他图 ...

  2. 论文|Node2vec算法原理、代码实战和在微信朋友圈的应用

    1 概述 Node2vec是2016年斯坦福教授 Jure Leskovec.Aditya Grover提出的论文,论文的下载链接为:https://arxiv.org/pdf/1607.00653. ...

  3. 7天搞定图神经网络,实战助力新冠疫情防控!

    要问这几年一直在逆势而上的技术有哪些?你一定不会忽略它--图神经网络. 相比传统神经网络,图神经网络的优势非常明显: 1.非顺序排序的特征学习:GNN的输出不以节点的输入顺序为转移的. 2.两个节点之 ...

  4. B.图算法:图学习之项目实践(UniMP算法实现论文节点分类、新冠疫苗项目实战,助力疫情)[系列九]

    图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk.node2vec):图神经网络算法(GCN.GAT.GraphSage),部分进阶 GNN 模型(UniMP标签传播.ERNIESa ...

  5. 【CS224W】(task4/5)图嵌入表示学习(Deepwalk、Node2vec)更新中

    note Node embedding的基本框架:encoder+decoder 最简单encoder是embedding-lookup表:ENC(v)=zv=Z⋅v\mathrm{ENC}(v)=z ...

  6. PyG基于Node2Vec实现节点分类及其可视化

    文章目录 前言 一.导入相关库 二.加载Cora数据集 三.定义Node2Vec 四.定义模型 五.模型训练 六.可视化 完整代码 前言 大家好,我是阿光. 本专栏整理了<图神经网络代码实战&g ...

  7. 图机器学习【从理论到实战】

    图机器学习 1.图机器学习导论 1.1图神经网络与普通神经网络的异同 2.图的基本表示和特征工程 2.1 图的基本表示 2.1.1 图的本体设计 2.1.2 图的种类 2.1.3节点连接数(度) 2. ...

  8. 推荐系统[八]算法实践总结V0:淘宝逛逛and阿里飞猪个性化推荐:召回算法实践总结【冷启动召回、复购召回、用户行为召回等算法实战】

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排).系统架构.常见问题.算法项目实战总结.技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排 ...

  9. IDEA的Docker插件实战(Dockerfile篇)

    IDEA的Docker插件实战(Dockerfile篇) IntelliJ IDEA的Docker插件能帮助我们将当前工程制作成Docker镜像.运行在指定的远程机器上,是学习和开发阶段的好帮手,本文 ...

  10. 数据结构(04)— 线性顺序表实战

    1. 设计思路 本实战的实质是完成对学生成绩信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运 ...

最新文章

  1. SpringBoot最最最常用的注解梳理
  2. adobexd怎么录屏_请问如何使用Adobe XD制作应用动效?
  3. CSP认证201509-2 日期计算[C++题解]:枚举、模拟
  4. 【Curl】 获取网站下载速率(Bytes/s)
  5. bitmap画文字 居中_【每日问答29】一键居中CAD表格中的文字
  6. java深度学习(一)Maven创建一个新的ND4J工程
  7. ASP.NET Core集成现有系统认证
  8. 包含内部类的.java文件编译后生成几个.class文件
  9. Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!...
  10. day20线程Thread的sleep方法
  11. 重拾《 两周自制脚本语言 》- 支持中文标识符
  12. Android抓包工具tcpdump
  13. 图灵机和冯洛伊曼体系结构
  14. 粗糙集(Rough set) 理论
  15. 英文金曲大赛c语言,英文歌曲_最激情!佐治亚理工开学典礼欢迎辞_沪江英语
  16. 阳光系统下载 Win7电脑锁屏壁纸怎么设置
  17. 企业选择局域网即时通讯软件的必要性是什么?
  18. 【Java】Java的垃圾回收
  19. elm and halogen
  20. 关于taz文件解压成tar文件这件事(根源在于7-Zip)

热门文章

  1. 用算法去扫雷(go语言)
  2. 【推荐】微信运营书一箩筐,微信运营手册、微信力量
  3. 双向DC/DC变换器设计-硬件主拓扑
  4. 华为认证hcia含金量_华为hcna认证用处大吗 什么是hcna
  5. 微信、支付宝迎劲敌?华为拿下支付牌照
  6. 01 LeNet-5论文笔记-Gradient-Based Learning Applied to Document Recognition
  7. 语音对话机器人,百行Python代码就能轻松实现
  8. mongoDB mongochef-x64 搭建
  9. 什么是 1号信令、7号信令和PRI信令?
  10. C语言的中常用的函数