【机器学习】探索图神经网络 (GNNs): 揭秘图结构数据处理的未来

 

  💎 欢迎大家互三:2的n次方_ 

在这里插入图片描述

 

💎1. 引言

图结构数据在现实世界中无处不在,从社交网络中的用户关系,到推荐系统中的用户-物品交互,再到生物信息学中的分子结构。传统的机器学习模型在处理这些数据时常常力不从心,而图神经网络 (GNNs) 的出现,为这一难题提供了强有力的解决方案,GNNs 能够高效处理图结构数据,广泛应用于社交网络分析、推荐系统和生物信息学等领域。本文将深入探讨 GNNs 的基本原理及其在各个领域的应用,并提供代码示例来帮助理解。

💎2. 图神经网络的基本原理

💎2.1 图的基本概念

图由节点(vertices)和边(edges)组成,用于表示对象及其相互关系。一个图可以用 G = (V, E) 来表示,其中 V 是节点集合,E 是边集合。

💎2.2 图神经网络的构建

GNNs 的核心思想是通过迭代更新每个节点的特征表示,以捕捉节点及其邻居之间的结构信息。节点的表示通过与其邻居节点的信息进行聚合来更新。

💎2.3 图卷积网络 (GCN)

图卷积网络 (GCN) 是 GNNs 的一种常见变体。GCN 通过图卷积操作来更新节点表示,具体公式如下:

💎3. 图神经网络的应用

💎3.1 社交网络分析

在社交网络中,用户之间的关系可以表示为图结构。GNNs 可以用于检测社交圈、预测用户行为以及推荐好友。

代码示例:社交网络中的节点分类

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid# 加载数据集
dataset = Planetoid(root='/tmp/Cora', name='Cora')class GCN(torch.nn.Module):def __init__(self):super(GCN, self).__init__()self.conv1 = GCNConv(dataset.num_node_features, 16)self.conv2 = GCNConv(16, dataset.num_classes)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = F.relu(x)x = F.dropout(x, training=self.training)x = self.conv2(x, edge_index)return F.log_softmax(x, dim=1)# 模型训练和测试
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = GCN().to(device)
data = dataset[0].to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)model.train()
for epoch in range(200):optimizer.zero_grad()out = model(data)loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])loss.backward()optimizer.step()model.eval()
_, pred = model(data).max(dim=1)
correct = int(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item())
acc = correct / int(data.test_mask.sum())
print(f'Accuracy: {acc:.4f}')

💎3.2 推荐系统

在推荐系统中,用户和物品的交互可以表示为二分图。GNNs 可以通过捕捉用户和物品之间的复杂关系来提高推荐的准确性。

代码示例:推荐系统中的链接预测

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.data import Data# 模拟用户-物品图数据
edge_index = torch.tensor([[0, 1, 2, 3],[1, 0, 3, 2]], dtype=torch.long)
x = torch.eye(4, dtype=torch.float)  # 4个节点的特征data = Data(x=x, edge_index=edge_index)class GCN(torch.nn.Module):def __init__(self):super(GCN, self).__init__()self.conv1 = GCNConv(4, 16)self.conv2 = GCNConv(16, 4)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = F.relu(x)x = self.conv2(x, edge_index)return x# 模型训练
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = GCN().to(device)
data = data.to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)model.train()
for epoch in range(100):optimizer.zero_grad()out = model(data)loss = F.mse_loss(out, data.x)loss.backward()optimizer.step()# 链接预测
model.eval()
with torch.no_grad():pred = model(data)print(pred)

💎3.3 生物信息学

在生物信息学中,分子结构可以表示为图。GNNs 可以用于预测分子的化学性质、药物发现等领域。

代码示例:分子属性预测

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.data import Data# 模拟分子图数据
edge_index = torch.tensor([[0, 1, 1, 2],[1, 0, 2, 1]], dtype=torch.long)
x = torch.tensor([[1], [2], [3]], dtype=torch.float)  # 3个节点的特征data = Data(x=x, edge_index=edge_index)class GCN(torch.nn.Module):def __init__(self):super(GCN, self).__init__()self.conv1 = GCNConv(1, 16)self.conv2 = GCNConv(16, 1)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = F.relu(x)x = self.conv2(x, edge_index)return x# 模型训练
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = GCN().to(device)
data = data.to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)model.train()
for epoch in range(100):optimizer.zero_grad()out = model(data)loss = F.mse_loss(out, data.x)loss.backward()optimizer.step()# 分子属性预测
model.eval()
with torch.no_grad():pred = model(data)print(pred)

💎4. 图神经网络的优势

图神经网络(GNNs)相较于传统的神经网络和其他图处理方法,具有多方面的优势。这些优势使得GNNs在处理图结构数据时表现尤为出色。

💎4.1 捕捉复杂关系

复杂关系建模: 图神经网络通过节点间的边来捕捉节点之间的关系,不仅仅局限于直接相邻的节点,还可以通过多层卷积操作捕捉远距离的节点关系。这种能力使得GNNs能够建模复杂的图结构。

迭代信息聚合: GNNs 通过迭代更新每个节点的表示,将节点的自身特征与其邻居节点的特征进行聚合,从而形成更丰富的节点表示。这种迭代过程能够有效地捕捉节点之间的高阶关系。

代码示例:捕捉复杂关系

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.data import Data# 模拟简单图数据
edge_index = torch.tensor([[0, 1, 2, 2],[1, 0, 1, 3]], dtype=torch.long)
x = torch.tensor([[1], [2], [3], [4]], dtype=torch.float)  # 节点特征data = Data(x=x, edge_index=edge_index)class GCN(torch.nn.Module):def __init__(self):super(GCN, self).__init__()self.conv1 = GCNConv(1, 4)self.conv2 = GCNConv(4, 4)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = F.relu(x)x = self.conv2(x, edge_index)return xmodel = GCN()
out = model(data)
print(out)

💎4.2 数据高效处理

稀疏矩阵操作: GNNs 通常利用稀疏矩阵来表示图的邻接关系,这使得它们能够高效处理大规模图数据。稀疏矩阵的存储和计算开销相对较低,适合大图的处理。

批处理优化: 现代GNN框架(如PyTorch Geometric)提供了高效的批处理机制,使得模型训练和推理过程更加快速。通过批处理,可以一次处理多个子图或整个图的一部分,从而大大提升处理速度。

代码示例:高效处理大规模图数据

import torch
from torch_geometric.data import Data, DataLoader
from torch_geometric.nn import GCNConv# 创建多个小图数据集
data_list = []
for i in range(100):edge_index = torch.tensor([[0, 1, 2, 2],[1, 0, 1, 3]], dtype=torch.long)x = torch.tensor([[1], [2], [3], [4]], dtype=torch.float)data_list.append(Data(x=x, edge_index=edge_index))loader = DataLoader(data_list, batch_size=10)class GCN(torch.nn.Module):def __init__(self):super(GCN, self).__init__()self.conv1 = GCNConv(1, 4)self.conv2 = GCNConv(4, 4)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = torch.relu(x)x = self.conv2(x, edge_index)return xmodel = GCN()
for batch in loader:out = model(batch)print(out)

💎4.3 处理非欧几里得数据

非欧几里得结构: 传统的卷积神经网络(CNN)擅长处理欧几里得数据(如图像、音频),但对于非欧几里得数据(如图结构数据),表现有限。GNNs 可以自然地处理这些非欧几里得结构,通过图卷积操作有效提取特征。

多样化应用场景: 由于GNNs能够处理多种形式的图结构数据,它们在社交网络、推荐系统、生物信息学、交通网络等多种领域都有广泛应用。

代码示例:处理非欧几里得数据

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.data import Data# 模拟非欧几里得图数据
edge_index = torch.tensor([[0, 1, 1, 2],[1, 0, 2, 1]], dtype=torch.long)
x = torch.tensor([[1], [2], [3]], dtype=torch.float)  # 节点特征data = Data(x=x, edge_index=edge_index)class GCN(torch.nn.Module):def __init__(self):super(GCN, self).__init__()self.conv1 = GCNConv(1, 16)self.conv2 = GCNConv(16, 1)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = F.relu(x)x = self.conv2(x, edge_index)return xmodel = GCN()
out = model(data)
print(out)

💎5. 总结

图神经网络 (GNNs) 是处理图结构数据的强大工具,能够在多种应用场景中展现出色的性能。通过捕捉节点之间的复杂关系,GNNs 提供了比传统方法更高效和准确的解决方案。

 

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

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

相关文章

【Unity插件】Editor Console Pro:提升开发效率的神器

在 Unity 开发过程中,控制台(Console)是我们排查错误、获取信息的重要窗口。而 Editor Console Pro 则是 Unity 编辑器控制台的强大替代品,为 Unity 的控制台带来了更多实用的功能和改进,极大地提升了开发效率。 一、…

力扣刷题----42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xf…

PHP超级全局变量

PHP 中的超级全局变量(Superglobals)是 PHP 4.1.0 引入的一个特性,它们在脚本的全部作用域中都是可用的。这意味着一旦一个脚本被载入,这些变量就可以在脚本的任何地方被访问,无论是在函数内部还是外部。PHP 提供了几个…

TCP程序设计

TCP概述 建立连接 客户端和服务器端在建立连接时: 服务端是典型的监听接受连接的模式,就是ListenAccept 客户端是主动建立连接的模式,就是Dial Go语言中使用 net包实现网络的相关操作,包括我们TCP的操作。 用于建立连接的典型…

【JavaEE】阻塞队列

目录 一.阻塞队列(Blocking Queue) 1.什么是阻塞队列 2.特性 二.生产者消费者模型 1.什么是生产者消费者模型? 2.生产者消费模型的好处 2.1解耦合 2.2削峰填谷 三.如何在java中使用阻塞队列 四.模拟实现阻塞队列 1.加锁 2.阻塞等待实现 3.解决interru…

学习c语言第十三天(结构体)

一.结构体声明 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 描述复杂对象。 结构体成员可以是标量、数组、指针、结构体。 定义和初始化: struct peo {char namer[20];char tele[12];char sex[5];int high; }; s…

支付交易——支付渠道与路由引擎

摘要 支付渠道与路由引擎是现代支付系统中关键的组成部分。支付渠道指的是连接商家和支付网络的通道,如信用卡、支付宝等。而路由引擎则负责根据交易特征和规则,将支付请求导向最合适的渠道,以确保安全高效的资金转移。这些系统不仅简化了支付过程,还增强了支付系统的灵活…

git 迁移仓库的方法

git Git是一个开源的分布式版本控制系统,由Linus Torvalds在2005年创建,用于有效、高速地处理从小到大的项目管理。它最初是为Linux内核开发而设计的,但很快被广泛用于各种项目。 以下是Git的一些主要特性: 分布式架构&#xff…

Python设计模式 - 工厂方法模式

定义 工厂方法模式是一种创建型设计模式,它定义一个创建对象的接口,让其子类来处理对象的创建,而不是直接实例化对象。 结构 抽象工厂(Factory):声明工厂方法,返回一个产品对象。具体工厂类都…

4.JAVA-运算符

算数运算符 隐式类型转换 强制转换 字符串操作 字符相加 小结 自增自减运算符 赋值运算符 关系运算符 逻辑运算符 短路逻辑运算 三元运算符 运算符优先级 这里小括号优先于所有,所以想要哪一个优先运算,就可以将哪一个用小括号扩起来,比较方便…

酒店押金原路退回系统开通方法,手机查看报表

一、酒店押金管理有哪些? 1.渠道有银行预授权 2.微信押金支付 3.酒店押金系统 4.支付押金管理 二、专业酒店押金管理VS银行 序号功能专业押金系统银行预授权1收款方式支持微信、支付宝、银联app、信用卡、花呗需要带银行卡刷卡2资金安全区分房费和押金&#x…

qt多线程

QFuture<int> future QtConcurrent::run(someFunction, 42);QFutureWatcher<int> watcher; watcher.setFuture(future);// 连接信号槽以处理任务完成后的操作 QObject::connect(&watcher, &QFutureWatcher<int>::finished, [&]() {int result …

PermissionError: [Errno 13] Permission denied

PermissionError: [Errno 13] Permission denied 目录 PermissionError: [Errno 13] Permission denied 【常见模块错误】 【错误原因】 【解决方案】 检查文件或目录的权限 确保文件路径正确 关闭其他占用文件的程序 运行程序时提升权限 更改 Python 的工作目录 示例代…

强化学习算法之策略迭代动态规划算法——以悬崖漫步环境(CliffWalking)为例

import copy class CliffWalkingEnv:def __init__(self,ncol12,nrow4):self.ncolncol#定义网格世界的列self.nrownrow#定义网格世界的行self.Pself.createP()#转移矩阵P[state][action][(p,next_state,reward,done)]包含下一个状态和奖励def createP(self):P[[[]for i in range…

[C#面对对象] 之抽象方法 虚方法 接口

1.虚方法 我的理解 "法国的“巴黎公社”&#xff0c;俄国的“十月革命”&#xff0c;都是把主要战略方向首先夺取中心城市 " 设计为 一个父类中的虚方法(virtual),这个虚方法已经有实现了(就是通过暴力革命夺取的方法 最终返回 城市)然而秋收暴动(子类)失败…

linux安装hive

linux安装hive 安装Java&#xff1a;下载Hive&#xff1a;解压Hive&#xff1a;配置环境变量&#xff1a;初始化Hive&#xff1a;启动Hive&#xff1a; 在Linux上安装Hive需要几个步骤&#xff0c;包括安装Java、下载并解压Hive、配置环境变量等。以下是基于最常用的Hive版本&a…

什么是职场?如何在职场中提升自己的情商?

职场这一概念&#xff0c;实质上是指在工作场所中&#xff0c;员工与员工之间、员工与组织之间相互发生作用和影响的一个特定环境。它不仅仅局限于办公室&#xff0c;还延展到会议室、休息室、餐厅等场所&#xff0c;这些场所交织成了一个错综复杂的职场生态系统。在这个系统中…

哪里可以查找短视频素材?6个素材查找下载渠道分享!

在短视频的风靡浪潮中&#xff0c;不少创作者纷纷投身于这一领域&#xff0c;无论是分享生活点滴还是进行商业宣传&#xff0c;高质量的短视频内容总能吸引众多观众的目光。然而&#xff0c;精良的短视频制作离不开优质的素材支持。本文将为大家介绍6个优秀的高质量短视频素材下…

POJ2739.Sum of Consecutive Prime Numbers

欧拉筛处理2-1e4的质数&#xff0c;再用尺取法即可 // Problem: Sum of Consecutive Prime Numbers // Contest: POJ - Japan 2005 // URL: http://poj.org/problem?id2739 // Memory Limit: 65 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.or…

2024 Linux 运维面试题分享-2

1、shell编程常用哪些脚本   自动备份&#xff0c;lnmp一键安装&#xff0c;for循环&#xff0c;case语句&#xff0c;if判断&#xff0c;数据库自动备份脚本&#xff0c;日常日志切割&#xff0c;自动化安装lnmp,安装nginx&#xff0c;redis&#xff0c;tomcat&#xff0c;自…