从图神经网络入门到gcn+lstm

该文章已生成可运行项目,

图神经网络(GNN)

1. 图的基本概念

​ 通常使用G = (V, E)来表示图,其中V表示节点的集合、E表示边的集合。对于两个相邻节点u , v 使用e=(u,v)表示这两个节点之间的边。两个节点之间边既可能是有向,也可能无向。若有向,则称之有向图(Directed Graph), 反之,称之为无向图(Undirected Graph)。

2. 图的表示

​ 在图神经网络中,常见的表示方法有邻接矩阵、度矩阵、拉普拉斯矩阵等。

在这里插入图片描述
在这里插入图片描述

3. 经典的图神经网络模型

  • GCN: Graph Convolution Networks(图卷积网络)

    ​ GCN是一种在图中结合拓扑结构和顶点属性信息学习顶点的embedding表示的方法。然而GCN要求在一个确定的图中去学习顶点的embedding,无法直接泛化到在训练过程没有出现过的顶点,即属于一种直推式(transductive)的学习。

  • GraphSAGE:Graph Sample and aggregate (图采样和聚合)

    ​ GraphSAGE则是一种能够利用顶点的属性信息高效产生未知顶点embedding的一种归纳式(inductive)学习的框架。其核心思想是通过学习一个对邻居顶点进行聚合表示的函数来产生目标顶点的embedding向量。

  • GAT:Graph Attention Networks(图注意力网络)

    ​ 为了解决GNN聚合邻居节点的时候没有考虑到不同的邻居节点重要性不同的问题,GAT借鉴了Transformer的idea,引入masked self-attention机制,在计算图中的每个节点的表示的时候,会根据邻居节点特征的不同来为其分配不同的权值。

4.GCN: Graph Convolution Networks(图卷积网络)

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch_geometric.data import Data
from torch_geometric.nn import GCNConv

# 1. 创建数据并标准化
# 节点特征 (4个节点,每个节点3维特征)
x = torch.tensor([
    [1.0, 0.2, 0.5],  # 节点0
    [0.4, 0.9, 0.1],  # 节点1
    [0.8, 0.3, 0.6],  # 节点2
    [0.1, 0.7, 0.4]   # 节点3
], dtype=torch.float)
edge_index = torch.tensor([
    [0, 1, 1, 2, 2, 3],   # 源节点
    [1, 0, 2, 1, 3, 2]    # 目标节点
], dtype=torch.long)
y = torch.tensor([12.5, 18.3, 22.1, 15.4], dtype=torch.float).view(-1, 1)

# 数据标准化
x_mean, x_std = x.mean(dim=0), x.std(dim=0)
y_mean, y_std = y.mean(), y.std()
data = Data(
    x=(x - x_mean) / x_std,
    edge_index=edge_index,
    y=(y - y_mean) / y_std,
    train_mask=torch.tensor([True, True, False, False]),     # 前两个节点训练
    test_mask=torch.tensor([False, False, True, True])       # 后两个节点测试
)


# 2. 增强模型
class EnhancedGCNRegressor(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = GCNConv(3, 32)
        self.conv2 = GCNConv(32, 16)
        self.conv3 = GCNConv(16, 8)
        self.linear = nn.Linear(8, 1)
        self.dropout = 0.2

    def forward(self, x, edge_index):
        x = F.relu(self.conv1(x, edge_index))
        x = F.dropout(x, self.dropout
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值