GCN 对矩阵数据的训练和向量化表示

本文介绍了如何使用PyTorch库构建一个简单的图卷积网络(GCN),包括数据预处理、构建邻接矩阵、定义GCN层、模型训练和节点嵌入的获取过程。
import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd

# 假设输入的矩阵数据为邻接矩阵 A 和特征矩阵 X
# 在这个示例中,我们用随机生成的数据作为示例输入

data=pd.read_csv('datasets/graph.csv')
data=data.values
print(data.shape)

import numpy as np
from scipy.sparse import csr_matrix


# 假设有5个节点,节点对应关系如下(示例数据)
node_relations=[]
for line in data:
    my_tuple = (int(line[0]),int(line[1]))
    node_relations.append(my_tuple)

# 计算节点的个数
num_nodes = max(max(edge) for edge in node_relations) + 1

# 构建初始邻接矩阵
adj_matrix = np.zeros((num_nodes, num_nodes))

# 填充邻接矩阵
for edge in node_relations:
    adj_matrix[edge[0], edge[1]] = 1
    adj_matrix[edge[1], edge[0]] = 1  # 如果是无向图,需对称填充

# 将邻接矩阵转换为稀疏矩阵(这里使用 CSR 稀疏格式)
sparse_adj_matrix = csr_matrix(adj_matrix)

print("邻接矩阵:")
print(adj_matrix.shape)
# print("\n稀疏矩阵表示:")
# print(sparse_adj_matrix.shape)
A = torch.Tensor(adj_matrix)# torch.rand((num_nodes, num_nodes))  # 邻接矩阵
print(A.shape)
X = torch.rand((num_nodes, 64))  # 特征矩阵,假设每个节点有10维特征
print(X.shape)

# 定义图卷积层
class GraphConvLayer(nn.Module):
    def __init__(self, in_features, out_features):
        super(GraphConvLayer, self).__init__()
        self.linear = nn.Linear(in_features, out_features)

    def forward(self, A, X):
        AX = torch.matmul(A, X)  # 对特征矩阵和邻接矩阵进行乘积操作
        return self.linear(AX)  # 返回线性层的输出


# 定义简单的GCN模型
class SimpleGCN(nn.Module):
    def __init__(self, in_features, hidden_features, out_features):
        super(SimpleGCN, self).__init__()
        self.conv1 = GraphConvLayer(in_features, hidden_features)
        self.conv2 = GraphConvLayer(hidden_features, out_features)

    def forward(self, A, X):
        h = torch.relu(self.conv1(A, X))  # 第一个图卷积层
        out = self.conv2(A, h)  # 第二个图卷积层
        return out


# 初始化GCN模型
gcn_model = SimpleGCN(in_features=64, hidden_features=128, out_features=64)  # 输入特征为10维,隐藏层特征为16维,输出为8维

# 损失函数和优化器
criterion = nn.MSELoss()  # 均方误差损失函数
optimizer = optim.Adam(gcn_model.parameters(), lr=0.01)  # Adam优化器

# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
    optimizer.zero_grad()
    output = gcn_model(A, X)
    loss = criterion(output, torch.zeros_like(output))  # 示范用零向量作为目标值,实际情况需要根据具体任务调整
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item()}')

# 得到节点的向量化表示
node_embeddings = gcn_model(A, X)
print("节点的向量化表示:")
print(node_embeddings.shape)

### 如何使用GCN(图卷积网络)来训练数据集 #### GCN的核心概念 图卷积网络(GCN)是一种专门设计用于处理图结构数据的深度学习模型[^1]。它通过定义在图上的卷积操作,可以有效地捕捉节点及其邻居之间的关系。这种特性使得GCN非常适合应用于诸如节点分类、链接预测以及图分类等问题。 #### 数据准备阶段 要使用GCN进行训练,首先需要准备好适合该算法的数据格式。通常情况下,这些数据包括: - **节点特征矩阵(X)**:每一行代表一个节点的属性向量。 - **邻接矩阵(A)** 或者稀疏版 `edge_index` 表示法:描述了哪些节点之间存在连接关系。 - (可选)目标变量(y),比如类别标签或者回归值。 对于实际应用中的具体任务来说,则可能还需要额外的一些预处理步骤,例如标准化/归一化数值型字段等等[^2]。 #### 实现过程概述 以下是基于PyTorch Geometric库的一个典型实现流程: 1. 定义模型类继承自torch.nn.Module; 2. 初始化函数里设置好各层参数,这里主要涉及两个部分——线性变换权重W与规范化后的拉普拉斯算子L̃; 3. 前馈过程中依次执行消息传递机制(即聚合相邻顶点的信息)及激活函数映射操作直至最终输出为止; 下面给出一段简单的代码片段作为示范: ```python import torch from torch_geometric.datasets import Planetoid from torch_geometric.transforms import NormalizeFeatures from torch_geometric.nn import GCNConv dataset = Planetoid(root='/tmp/Cora', name='Cora', transform=NormalizeFeatures()) data = dataset[0] class Net(torch.nn.Module): def __init__(self): super().__init__() self.conv1 = GCNConv(dataset.num_node_features, 16) self.conv2 = GCNConv(16, dataset.num_classes) def forward(self, x, edge_index): x = self.conv1(x, edge_index) x = torch.relu(x) x = torch.dropout(x, training=self.training) x = self.conv2(x, edge_index) return torch.log_softmax(x, dim=1) device = 'cuda' if torch.cuda.is_available() else 'cpu' model = Net().to(device) data = data.to(device) optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4) def train(): model.train() optimizer.zero_grad() out = model(data.x, data.edge_index) loss = torch.nn.functional.nll_loss(out[data.train_mask], data.y[data.train_mask]) loss.backward() optimizer.step() @torch.no_grad() def test(): model.eval() pred = model(data.x, data.edge_index).argmax(dim=1) correct = (pred[data.test_mask] == data.y[data.test_mask]).sum() acc = int(correct) / int(data.test_mask.sum()) return acc for epoch in range(1, 201): train() print(f'Test Accuracy: {test():.4f}') ``` 此脚本选取了著名的Cora学术论文引用网络作为例子来进行说明[^4]。 #### 结果分析与评估指标选择 经过多次迭代优化之后,可以通过比较不同超参组合下的表现情况选出最优解;常用的评价标准有精确度(Precision)、召回率(Recall)、F1分数(F1 Score)等针对二元或多分类场景下适用的不同选项[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值