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

news2025/1/9 1:41:47

  💎 欢迎大家互三: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_index
        x = 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_index
        x = 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_index
        x = 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_index
        x = self.conv1(x, edge_index)
        x = F.relu(x)
        x = self.conv2(x, edge_index)
        return x

model = 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_index
        x = self.conv1(x, edge_index)
        x = torch.relu(x)
        x = self.conv2(x, edge_index)
        return x

model = 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_index
        x = self.conv1(x, edge_index)
        x = F.relu(x)
        x = self.conv2(x, edge_index)
        return x

model = GCN()
out = model(data)
print(out)

💎5. 总结

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

在这里插入图片描述

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

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

相关文章

C#高级:枚举(Enum)从索引、值到注释的完整使用技巧

目录 一、推荐的枚举写法 二、获取注释的封装代码 三、已知【枚举】,获取注释、索引 四、已知【索引】,获取枚举值、注释 五、已知【注释】,获取枚举值、索引 六、创建一个【枚举字典】,key索引,value(枚举值&am…

入选ICML!麻省理工团队基于AlphaFold实现新突破,揭示蛋白质动态多样性

作为生物体的重要组成部分,蛋白质具有不同状态,基于集体运动或无序波动的不同结构组合,采用复杂的三维结构,来执行丰富的生物功能,例如,蛋白质构象变化对转运体、通道和酶的功能至关重要,而平衡…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 围棋的气(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

Oracle特有的DECODE函数

Oracle中的DECODE函数是一种条件表达式函数,用于基于给定的条件从一组值中选择一个值返回。它的基本语法如下: DECODE(expression, search1, result1, [search2, result2, ...], [default])expression:要比较的表达式或列。searchN&#xff…

正点原子imx6ull-mini-Linux驱动之pinctrl 和 gpio 子系统(5)

1:pinctrl 子系统 1.1:pinctrl 子系统简介 Linux 驱动讲究驱动分离与分层,pinctrl 和 gpio 子系统就是驱动分离与分层思想下的产物, 驱动分离与分层其实就是按照面向对象编程的设计思想而设计的设备驱动框架 来回顾一下上一章是…

2006年威廉王子提出分手 舞会上凯特一袭护士装令他再次沦陷 迅速和好

虽然威廉王子和凯特米德尔顿是当今最有影响力和最令人心动的情侣之一,但许多人可能忘记了,早在 2006 年,两人还在约会时,他们曾短暂分手。尽管当时他们的分手可能让英国媒体感到意外,但不到一年后,两人就和…

Window部署Ollama+Qwen2.0+Open-WebUI

文章目录 Windows下安装Docker安装Docker检查是否安装成功, 出现版本即为安装成功安装Ollama启动 Ollama 并拉取模型(选做) 修改默认地址和端口(选做) Ollama 进行跨域配置安装open-webui Windows下安装Docker 准备条件 开启Hyper-V,在“启用或关闭Windows功能”里…

全网最强Linux教程 | 万字长文爆肝Linux操作系统

Linux 1.Linux的引言 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保…

【数据保护】微软开源数据保护项目Presidio-匿名器

Presidio是由微软维护的开源数据保护项目,其主要包含三个功能模块,分别是: Presidio analyzer:该模块主要负责文本类数据敏感信息扫描。Presidio anonymizer:该模块主要负责对已检测到的敏感实体进行脱敏处理。Presidio image redactor&…

【深度学习】语音,Tacotron 2 ,TTS合成

图1展示了Tacotron 2系统架构的框图。该系统包含两个主要部分:特征预测网络和WaveNet vocoder。以下是架构的详细说明: 特征预测网络 输入文本:系统从输入文本开始,经过一系列处理生成语音特征。字符嵌入层:输入的字…

ITSS三级认证需要多少钱?

信息技术服务标准(ITSS)认证是评估一个企业在信息技术服务领域能力的标准之一,它涵盖了从基础标准、支撑标准到基于业务的需求侧和供给侧标准的全面内容。 具体条件 独立法人地位:申请单位需要具有独立的法人地位,这是…

[leetcode hot 150]第二百三十题,二叉搜索树中第k小的元素

题目: 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 二叉搜索树(BST)有一个特性:对于树中的任何节点,其左…

lora网关到底能带多少设备,lora网关容量是多少?

引言:在推广LoRa模块的过程中,我频繁地遇到关于LoRa网关设备承载能力与容量的询问。为了更清晰地解答这些疑问,本文将深入探讨一个LoRa网关能支持的设备数量,以及这些数量如何受不同参数影响。 那么今天我们就详细的看下一个网关能…

如何使用Apache Web服务器提供自定义错误页面?

当您管理网站时,会花费大量时间来定制软件、运行软件以及调整布局和设计以符合您对网站外观的想法。通常我们只考虑网站中我们期望访问者看到的部分。不幸的是,有些常见页面可能会被忽略:错误页面。 错误页面 虽然理想情况下任何人都不应该在…

Codigger 之软件项目体检:提升企业软件交付质量的秘密武器

在当今竞争激烈的商业环境中,企业软件交付的质量直接关系到企业的市场竞争力和客户满意度。高质量的软件不仅能够满足用户需求,还能降低长期的维护成本,提高企业的运营效率。因此,提升软件交付质量已成为企业关注的焦点。Codigger…

【限免】频控阵雷达:概念、原理与应用【附MATLAB代码】

​微信公众号:EW Frontier QQ交流群:949444104 主要内容 PDA、FDA MATLAB代码 %---------------------------------------- %功能:FDA和相控阵天线方向图 %版本:ver1.0 %时间:2017.11.1 %--------------------------------------- clear all; clc; disp…

一文速通GIT版本管理与分支控制

目录 1、了解Git功能 2、第一次使用Git(首次配置好,后续不用再操作) 打开git后端 设置用户签名 结果 3、初始项目架构 创建本地新仓库并初始化 文件添加到本地仓库 a.文件添加缓存区 b.缓存区内容提交到本地仓库 c.改写提交的注释 …

【产品分析】作业帮

​基本信息 作业帮是目前国内最大的 K12 在线教育类 APP,致力于为全国中小学生提供全学段的学习辅导服务,其课程覆盖小学,初中,高中所有学科,并支持在线答题解题、一对一辅导、作文搜索、直播课、题库练习等众多功能&…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第六十三章 输入子系统实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Rpi Zero W做的老头乐声控灯

祭图__|\0>历经各种尝试,最后选了docker 里装个rhasspy,配上paho-mqtt搞出了这个奇葩夜灯。各种曲折就不说了,直接分享捷径思路。 这个绿板子是respeaker hat with 2 mic 用的是seeed-voicecard,跟着github编译,不…