Python图嵌入信息潜在表征算法

2024-05-15 09:28

本文主要是介绍Python图嵌入信息潜在表征算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📜用例

📜Python社群纽带关系谱和图神经 | 📜C++和Python通信引文道路社评电商大规模行为图结构数据模型 | 📜角色图嵌入学习 | 📜图全局结构信息学习 | 📜图编码解码半监督学习 | 📜富文本表征学习 | 📜法律文本内容语义学习

✒️Python提取图节点嵌入信息

图可以定义为 G = (V, E),其中 V 是一组节点,E 是一组边。 边是两个节点之间的连接,例如节点A和D有一条边。 另外,重要的是要注意图可以是有向图或无向图。 例如,下面的图是无向的,因为 A 与 D 连接,D 与 A 连接。还有一件事,图可以获取不同的节点属性以及边属性,但就我们的目的而言,今天并不重要。

B
A
D
C
E

现在我们或多或少知道了图是什么,我们可以尝试从图中提取节点嵌入。

假设您需要解决如下场景:

  • 我们在社交网络中进行用户交互,我们需要预测两个用户何时连接。节点代表用户,边代表两个用户是“朋友”。 (链接预测任务)
  • 我们有一个研究出版物的引用网络,我们需要预测每个出版物的主题。节点代表出版物,边代表从一份出版物到另一份出版物的引用。 (节点预测任务)
  • 我们有一组蛋白质,可分为酶或非酶。节点代表氨基酸,如果两个节点相距小于 6 埃,则通过边连接它们。 (图分类任务)

对于所有提到的任务,我们需要有节点的表示。因此,如果我们需要运行机器学习算法,我们需要将图结构转换为向量空间。

💦 算法一:

随机游走是一种将图转换为节点序列以训练此模型的方法。 基本上,对于图中的每个节点,模型都会生成连接节点的随机路径。 一旦我们有了这些节点的随机路径,它就会训练此模型来获得节点嵌入。

出于学习目的,请在下面找到该算法的实现,请注意该代码尚未准备好用于大规模应用,可以进行一些并行化和内存改进。

import networkx as nx
import random
import numpy as np
from typing import List
from tqdm import tqdmclass DWk:def __init__(self, window_size: int, embedding_size: int, walk_length: int, walks_per_node: int):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]: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]]: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]]):model = Word2Vec(sentences=walks, window=self.window_size, vector_size=self.embedding_size)return model.wv

💦算法二:

该算法使用深度优先搜索和广度优先搜索算法的组合来提取随机游走。 这种算法组合由两个参数 P(返回参数)和 Q(输入输出参数)控制。

基本上,如果 P 很大,随机游走也会很大,所以它会进行探索,如果 P 很小,我们会停留在本地。 Q 也会发生类似但相反的行为,如果 Q 很小,它将进行探索,如果 Q 很大,它将停留在本地。

我们可以使用 PyTorch 几何测试算法。 该库实现了一系列图神经网络架构和方法来加速 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)def train():model.train() total_loss = 0for pos_rw, neg_rw in tqdm(loader):optimizer.zero_grad() loss = model.loss(pos_rw.to(device), neg_rw.to(device))  loss.backward()optimizer.step() total_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"with open("vectors.txt", "w") as f:f.write(all_vectors)with open("labels.txt", "w") as f:f.write("\n".join([str(label) for label in data.y.numpy()]))

模型训练完成后,我们将为图中的每个节点提供一个嵌入,每个嵌入将为 128 维。 训练结束后,我们可以保存嵌入,并在嵌入投影仪中查看表示与标签相比有多“好”。 为此,我使用 T-SNE 算法将 128 维数据减少到 3 维数据,以便我们可以绘制它。

参阅一:计算思维

参阅二:亚图跨际

这篇关于Python图嵌入信息潜在表征算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991441

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too