Deep Walk 和 Node2Vec:图嵌入

特杰帕尔·库马瓦特

特杰帕尔·库马瓦特

·

一、说明

        DeepWalk 是一种基于图的机器学习算法,可为给定图生成节点嵌入。它由纽约大学的 Bryan Perozzi、Rami Al-Rfou 和 Steven Skiena 于 2014 年开发。

        该算法的目标是通过分析图中每个节点的局部邻域来学习图中每个节点的表示。 DeepWalk应用了skip-gram的概念(也用于自然语言处理)来为每个节点生成向量嵌入。这个想法是将图上的随机游走视为句子,并将每个节点视为句子中的一个单词。

        DeepWalk 在各个领域都有应用,包括网络分析、推荐系统和生物信息学。它广泛用于社区检测、链接预测和节点分类任务。

        研究 Node2Vec 和 DeepWalk 以从图中提取嵌入

二、图综合知识

        G = (V, E),其中 V 是节点的集合,E 是边的列表,可用于定义图形。两个节点之间的链接称为边。例如,边连接节点 A 和 D。同样重要的是要记住,图形可以是有向的,也可以是无向的。例如,下图是无向的,因为 A 和 D 链接在一起,反之亦然。另一个问题是,图形可以具有各种节点和边缘质量,尽管对于我们今天的目的来说,两者都不重要。

2.1 为什么我们需要节点嵌入

  • 在社交网络中,用户相互通信,我们必须预测两个用户何时链接。用户由节点表示,而个人之间的关系由边缘表示。我们需要在引文网络中预测每篇研究文章的主题(链接预测任务)。
  • 出版物由节点表示,而出版物之间的引文由边缘表示。(节点预测任务)
  • 有特定的蛋白质属于酶和非酶的类别。氨基酸由节点表示,如果两个节点相距小于6埃,则它们通过边缘连接。(图形分类任务)

2.2 DeepWalk深度漫步

        DeepWalk由石溪大学的研究人员在论文“DeepWalk:社会表征的在线学习”(2014)中提出。

        DeepWalk是一种学习图中节点表示的方法。DeepWalk背后的主要思想是在图中生成随机游走,并使用这些随机游走来学习使用Word2Vec算法的节点表示。

        更详细地说,给定一个图形,DeepWalk 首先生成一组从图形中的每个节点开始的随机漫游。每个随机游走只是一系列节点,从特定节点开始,并在每一步移动到其邻居之一。这些随机游走捕获图的局部结构,并提供一种方法来学习捕获其与附近节点关系的节点表示。

        接下来,Word2Vec 算法用于根据生成的随机游走学习节点的表示。Word2Vec是一种流行的算法,用于学习自然语言处理中的单词表示,但它也可以应用于学习图中节点的表示。Word2Vec背后的基本思想是学习一个神经网络,该神经网络预测给定上下文(即出现在其前后的单词)的单词的概率。

        在DeepWalk的情况下,从图中生成的随机游走充当“句子”,图中的节点充当“单词”。然后使用 Word2Vec 算法来学习神经网络,该神经网络预测节点在给定图形中的邻居的情况下出现在随机游走中的概率。然后,学习到的节点表示可用于各种下游任务,例如节点分类或链路预测。

        总体而言,DeepWalk是一种功能强大且广泛使用的方法,用于学习图中节点的表示,以捕获图形的局部结构。

import networkx as nx
import random
import numpy as np
from typing import List
from tqdm import tqdm
from gensim.models.word2vec import Word2Vecclass DeepWalk:def __init__(self, window_size: int, embedding_size: int, walk_length: int, walks_per_node: int):""":param window_size: window size for the Word2Vec model:param embedding_size: size of the final embedding:param walk_length: length of the walk:param walks_per_node: number of walks per node"""self.window_size = window_sizeself.embedding_size = embedding_sizeself.walk_length = walk_lengthself.walk_per_node = walks_per_nodedef random_walk(self, g: nx.Graph, start: str, use_probabilities: bool = False) -> List[str]:"""Generate a random walk starting on start:param g: Graph:param start: starting node for the random walk:param use_probabilities: if True take into account the weights assigned to each edge to select the next candidate:return:"""walk = [start]for i in range(self.walk_length):neighbours = g.neighbors(walk[i])neighs = list(neighbours)if use_probabilities:probabilities = [g.get_edge_data(walk[i], neig)["weight"] for neig in neighs]sum_probabilities = sum(probabilities)probabilities = list(map(lambda t: t / sum_probabilities, probabilities))p = np.random.choice(neighs, p=probabilities)else:p = random.choice(neighs)walk.append(p)return walkdef get_walks(self, g: nx.Graph, use_probabilities: bool = False) -> List[List[str]]:"""Generate all the random walks:param g: Graph:param use_probabilities::return:"""random_walks = []for _ in range(self.walk_per_node):random_nodes = list(g.nodes)random.shuffle(random_nodes)for node in tqdm(random_nodes):random_walks.append(self.random_walk(g=g, start=node, use_probabilities=use_probabilities))return random_walksdef compute_embeddings(self, walks: List[List[str]]):"""Compute the node embeddings for the generated walks:param walks: List of walks:return:"""model = Word2Vec(sentences=walks, window=self.window_size, vector_size=self.embedding_size)return model.wv

2.3 节点2Vec

        Node2Vec由斯坦福大学的研究人员在论文“node2vec:网络的可扩展特征学习”(2016)中提出。

        在使用Deepwalk的一些概念时,这种方法使它们更进一步。为了提取随机游走,它结合了DFS和BFS技术。两个参数 P(返回参数)和 Q 控制这种算法组合(输入-输出参数)。

        本质上,如果P很大,随机游走就会很大,所以它会探索,如果P很小,我们就会靠近家。Q表现出类似但相反的行为;如果 Q 很小,它将参与探索,而如果 Q 很大,它将保持局部。原始文件包含更多信息。

        Node2vec 的采样策略接受 4 个参数: — 漫游次数:从图形中的每个节点生成的随机漫游次数 — 漫游长度:每个随机漫游中有多少个节点 — P:返回超参数 — Q:Inout 超参数以及标准的 skip-gram 参数
        我们可以使用 PyTorch 几何来测试 Node2Vec。为了加快 GNN 的使用,该软件包实现了各种图形神经网络拓扑和技术。我将使用 Pytorch 几何指令的一小部分来测试它。他们为此利用了Cora数据集。Cora 数据集中的 2708 篇科学出版物分为七类。引文网络中有5429个链接。0/1 值的词向量表示字典中不存在/存在匹配的单词,用于描述数据集中的每个出版物。字典中有1433个不同的单词。

from torch_geometric.nn import Node2Vec
import os.path as osp
import torch
from torch_geometric.datasets import Planetoid
from tqdm.notebook import tqdmdataset = 'Cora'
path = osp.join('.', 'data', dataset)
dataset = Planetoid(path, dataset)  # dowload or load the Cora dataset
data = dataset[0]
device = 'cuda' if torch.cuda.is_available() else 'cpu'  # check if cuda is available to send the model and tensors to the GPU
model = Node2Vec(data.edge_index, embedding_dim=128, walk_length=20,context_size=10, walks_per_node=10,num_negative_samples=1, p=1, q=1, sparse=True).to(device)loader = model.loader(batch_size=128, shuffle=True, num_workers=4)  # data loader to speed the train 
optimizer = torch.optim.SparseAdam(list(model.parameters()), lr=0.01)  # initzialize the optimizer def train():model.train()  # put model in train modeltotal_loss = 0for pos_rw, neg_rw in tqdm(loader):optimizer.zero_grad()  # set the gradients to 0loss = model.loss(pos_rw.to(device), neg_rw.to(device))  # compute the loss for the batchloss.backward()optimizer.step()  # optimize the parameterstotal_loss += loss.item()return total_loss / len(loader)for epoch in range(1, 100):loss = train()print(f'Epoch: {epoch:02d}, Loss: {loss:.4f}')all_vectors = ""
for tensor in model(torch.arange(data.num_nodes, device=device)):s = "\t".join([str(value) for value in tensor.detach().cpu().numpy()])all_vectors += s + "\n"
# save the vectors
with open("vectors.txt", "w") as f:f.write(all_vectors)
# save the labels
with open("labels.txt", "w") as f:f.write("\n".join([str(label) for label in data.y.numpy()]))

三、结论

        本案例提出用G-ML的方式实现 word2vec的方式;以DeepWalk表征训练过程;在这个过程中,自然地将N-gram结合进去,有效地实现 word2vec。

四、参考

  • 对于 skip-gram 和 word2vec,请参阅此视频
  • [1] https://en.wikipedia.org/wiki/Graph_theory
  • [2] Graph Machine Learning: 通过应用机器学习技术和算法将图形数据提升到一个新的水平 作者:Aldo Marzullo、Claudio Stamile 和 Enrico Deusebio
  • [3] node2vec · PyPI
  • [4] https://arxiv.org/pdf/1607.00653.pdf

Deep Walk and Node2Vec: Graph Embeddings | by Tejpal Kumawat | Medium

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/79099.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香港人力资源服务商迦里仕人才,申请纳斯达克IPO上市

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于香港的人力资源服务商迦里仕人才(Galaxy Payroll Group)近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市&am…

Scrum敏捷开发流程图怎么画?

1. 什么是Scrum敏捷开发流程图? Scrum敏捷开发流程图是一种可视化工具,用于形象地描述Scrum敏捷开发方法中的工作流程和活动。Scrum敏捷开发流程图展示了项目从需求收集到产品交付的整个开发过程,帮助团队理解和跟踪项目进展,促…

解决VScode远程服务器时opencv和matplotlib无法直接显示图像的问题

解决VScode远程服务器时opencv和matplotlib无法直接显示图像的问题 1、本方案默认本地已经安装了VScode与MobaXterm2、在服务器端3、在本地端安装MobaXterm4、测试5、opencv显示测试(测试过程中需保持MobaXterm开启的状态)6、 matplotlib显示测试&#x…

原型链污染

文章目录 1. javascript 原型链2. 原型链变量的搜索3. prototype 原型链污染4. 原型链污染例题4.1 题1:4.2.题2: 1. javascript 原型链 js在ECS6之前没有类的概念,之前的类都是用funtion来声明的。如下 可以看到b在实例化为test对象以后&…

ElasticSearch:全文检索及倒排索引原理

1.从全文检索说起 首先介绍一下结构化与非结构化数据: 结构化数据将数据具有的特征事先以结构化的形式定义好,数据有固定的格式或有限的长度。典型的结构化数据就是传统关系型数据库的表结构,数据特征直接体现在表结构的字段上,…

电商数据获取:网络爬虫还是付费数据接口?

随着电商行业的迅速发展,对电商数据的需求也越来越大。在获取电商数据时,常常面临一个选择:是自己编写网络爬虫进行数据爬取,还是使用现有的付费数据接口呢?本文将从成本、可靠性、数据质量等多个角度进行分析&#xf…

深入学习 Redis - 事务、实现原理、指令使用及场景

目录 一、Redis 事务 vs MySQL事务 二、Redis 事务的执行原理 2.1、执行原理 2.2、Redis 事务设计这么简单,为什么不涉及成 MySQL 那样强大呢? 三、Redis 事务的使用 3.1、使用场景 3.2、具体演示 开启/执行/放弃事务 watch 监控 watch 实现原理…

Dockerfile部署golang

使用go镜像打包,运行在容器内 redis和mysql用外部的 项目目录结构 w1go项目: Dockerfile # 这种方式是docker项目加上 本地的mysql和redis环境 # go打包的容器 FROM golang:alpine AS builder# 为我们镜像设置一些必要的环境变量 ENV GO111MODULEon …

Nginx可视化NginxWebUI

Nginx可视化Web Github:https://github.com/cym1102/nginxWebUI 支持window、linux 安装方式支持docker、window直接运行 jar包cmd运行:port可自行替换 java -jar -Dfile.encodingUTF-8 D:/软件/Nginx-Ui/nginxWebUI-3.6.3.jar --server.port8380 --project.hom…

centos7 yum源安装出错及更新问题

如下 首先,在搜索jdk时报错如下: 解决办法 1、进入 yum的repo目录 cd /etc/yum.repos.d/2、修改所有的CentOS文件内容 sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-*sed -i s|#baseurlhttp://mirror.centos.org|baseurlhttp://vau…

HDFS集群滚动升级以及回滚相关

HDFS集群滚动升级以及回滚相关 介绍不停机滚动升级非联邦HA集群联邦HA集群 停机升级--非HA集群HDFS集群降级和回滚异同点共同点不同点 HA集群降级(downgrade)注意事项 集群回滚操作 介绍 在hadoop v2中,HDFS支持namenode高可用(H…

Benchmarking Augmentation Methods for Learning Robust Navigation Agents 论文阅读

论文信息 题目:Benchmarking Augmentation Methods for Learning Robust Navigation Agents: the Winning Entry of the 2021 iGibson Challenge 作者:Naoki Yokoyama, Qian Luo 来源:arXiv 时间:2022 Abstract 深度强化学习和…

java.util.NoSuchElementException: No value present-报错(已解决)

阿丹: 今天在spring-boot整合MongoDB的过程中出现了下面的错误,是因为追求新技术、更优雅产生的。 记录一下。 错误截图如下: 错误位置代码如下: 主要问题(问题原因): 因为之前升级了我的jdk的…

Red Hat 安装MySQL 8.0与 Navicat

目录 Red Hat 安装 MySQL 8.0 1、更新软件包列表 2、安装MySQL服务器和客户端 3、启动MySQL服务 4、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL,输入mysql密码 7、MySQL默认位置 Red Hat 安装 Navicat 1、下载 Navicat 2、执行命令 Red H…

布基纳法索ECTN(BESC)申请流程

根据BURKINA FASO布基纳法索签发于 11/07/2006法令编号 00557的规定: 自2006年11月07 日起所有出口至布基纳法索(Burkina Faso)的货物,必须申请ECTN/BESC。ECTN是ELECTRONIC CARGO TRACKING NOTE的英文缩写,BESC是BORDEREAU DE SU…

Maven分模块-继承-聚合-私服的高级用法

Maven分模块-继承-聚合-私服的高级用法 JavaWeb知识,介绍Maven的高级用法!!! 文章目录 Maven分模块-继承-聚合-私服的高级用法1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承…

vue2中使用mock数据发送请求

1.安装 npm i mockjs1.1 2.准备json数据 说明:mock数据需要的图片放置到public文件夹中(原封不动的打包到dist文件夹) [{"id": "1","imgUrl": "/images/banner1.jpg"},{"id": "2&qu…

python excel 操作

excel文件内容如下: 一、xlrd 读Excel 操作 1、打开Excel文件读取数据 filexlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个 r 2、常用函数 (1)获取一个sheet工作表 table file.sheets(…

C++11 新特性 ---- 原始字面量

一、原始字面量 R “xxx(原始字符串)xxx”&#xff0c;其中&#xff08;&#xff09;两边的字符串可以省略。 #include <iostream> #include <string> using namespace std; int main() {string str1 R"(D:\hello\heheda\test.txt)";string str2 R&q…

day1-牛客67道剑指offer-JZ4 JZ6 JZ7 JZ9 JZ11 JZ69 JZ70 替换空格 斐波那契数列及其变形 左移/右移运算符

文章目录 1. JZ4 二维数组中的查找暴力法右上角往左下角逼近二分查找-左闭右开区间 2. 替换空格3. JZ6 从尾到头打印链表4. JZ7 重建二叉树思路1哈希加速 5. JZ9 用两个栈实现队列6. JZ11 旋转数组的最小数字常规遍历二分法 7. 斐波那契数列动态规划递归 8. JZ69 跳台阶动态规划…