【人工智能】用Python实现图卷积网络(GCN):从理论到节点分类实战

news2024/12/21 21:53:24

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界

目录

  1. 引言
  2. 图卷积网络理论基础
    • 2.1 图的基本概念
    • 2.2 卷积神经网络在图上的扩展
    • 2.3 GCN的数学模型
  3. GCN的实现
    • 3.1 环境配置
    • 3.2 数据集介绍与预处理
    • 3.3 模型构建
    • 3.4 训练与优化
  4. 实战:节点分类
    • 4.1 模型训练
    • 4.2 结果分析
    • 4.3 可视化
  5. 代码详解
    • 5.1 数据预处理代码
    • 5.2 GCN模型代码
    • 5.3 训练与评估代码
  6. 结论
  7. 参考文献

引言

随着社交网络、生物网络和知识图谱等复杂图结构数据的广泛应用,传统的深度学习方法在处理非欧几里得数据时面临诸多挑战。图卷积网络(GCN)作为图神经网络(Graph Neural Networks, GNNs)的一种重要变种,通过在图结构上进行卷积操作,实现了对图数据的有效表示和学习。自2017年Kipf和Welling提出GCN以来,其在节点分类、图分类、链接预测等任务中取得了显著成果。

本文将深入探讨GCN的理论基础,详细介绍其在节点分类任务中的实现方法。通过Python和PyTorch框架,我们将从零开始构建GCN模型,涵盖数据预处理、模型设计、训练优化及结果评估等全过程。文中提供的代码示例配有详尽的中文注释,旨在帮助读者理解并掌握GCN的实现细节。

图卷积网络理论基础

2.1 图的基本概念

在计算机科学中,**图(Graph)**是一种由节点(Vertices)和边(Edges)组成的数据结构,用于表示实体及其之间的关系。形式上,一个图可以表示为 ( G = (V, E) ),其中:

  • ( V ) 是节点集合,节点数量为 ( N = |V| )。
  • ( E ) 是边集合,边可以是有向的或无向的。

图可以用邻接矩阵(Adjacency Matrix)( A \in \mathbb{R}^{N \times N} )表示,其中 ( A_{ij} = 1 ) 表示节点 ( i ) 和节点 ( j ) 之间存在边,反之为0。

此外,图中的每个节点可以具有特征向量 ( X \in \mathbb{R}^{N \times F} ),其中 ( F ) 是每个节点的特征维度。

2.2 卷积神经网络在图上的扩展

传统的卷积神经网络(Convolutional Neural Networks, CNNs)主要应用于欧几里得数据(如图像、音频),其核心在于利用卷积操作捕捉局部特征。然而,图数据的非欧几里得性使得传统卷积难以直接应用。

为了解决这一问题,研究者提出了多种在图上进行卷积的方法,主要分为谱方法和空间方法:

  • 谱方法:基于图的谱理论,利用图拉普拉斯算子(Graph Laplacian)进行卷积操作。
  • 空间方法:直接在图的邻域结构上定义卷积操作,更加直观且易于扩展。

GCN属于谱方法的一种简化形式,通过对图拉普拉斯算子进行近似,实现高效的图卷积。

2.3 GCN的数学模型

GCN的核心思想是通过多层图卷积操作,将节点的特征与其邻居节点的特征进行聚合和变换。以Kipf和Welling提出的GCN为例,其基本的图卷积层可以表示为:

H ( l + 1 ) = σ ( D ^ − 1 / 2 A ^ D ^ − 1 / 2 H ( l ) W ( l ) ) H^{(l+1)} = \sigma\left( \hat{D}^{-1/2} \hat{A} \hat{D}^{-1/2} H^{(l)} W^{(l)} \right) H(l+1)=σ(D^1/2A^D^1/2H(l)W(l))

其中:

  • ( H^{(l)} ) 是第 ( l ) 层的节点特征矩阵,( H^{(0)} = X )。
  • ( \hat{A} = A + I_N ) 是加上自连接后的邻接矩阵,( I_N ) 是单位矩阵。
  • ( \hat{D} ) 是 ( \hat{A} ) 的度矩阵,即 ( \hat{D}{ii} = \sum_j \hat{A}{ij} )。
  • ( W^{(l)} ) 是第 ( l ) 层的可学习权重矩阵。
  • ( \sigma ) 是激活函数,如ReLU。

通过上述公式,GCN层实现了节点特征的聚合和线性变换,从而逐层提取更高层次的图结构信息。

GCN的实现

3.1 环境配置

在开始实现GCN之前,需要配置相应的开发环境。本文使用Python编程语言,结合PyTorch深度学习框架。以下是环境配置的主要步骤:

  1. 安装Python:建议使用Python 3.8及以上版本。
  2. 安装必要的库
pip install torch torchvision
pip install numpy scipy scikit-learn
pip install matplotlib
  1. 安装PyTorch Geometric(可选):虽然本文将手动实现GCN,但PyTorch Geometric提供了丰富的图神经网络工具,可供参考。
pip install torch-geometric

3.2 数据集介绍与预处理

节点分类任务常用的数据集包括Cora、Citeseer和Pubmed。本文以Cora数据集为例,介绍数据的结构和预处理方法。

Cora数据集包含2708个科研论文,这些论文根据内容被划分为7个类别,构成一个引用图,边表示论文之间的引用关系。每个节点的特征是一个1433维的词袋向量。

数据预处理步骤

  1. 加载数据:读取节点特征、标签和邻接关系。
  2. 构建邻接矩阵:基于引用关系构建稀疏邻接矩阵。
  3. 特征标准化:对节点特征进行标准化处理。
  4. 划分训练集、验证集和测试集

以下是数据预处理的Python代码示例:

import numpy as np
import scipy.sparse as sp
import torch
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

# 加载数据
def load_data(path="cora/", dataset="cora"):
    # 读取节点特征和标签
    idx_features_labels = np.genfromtxt("{}{}.content".format(path, dataset), dtype=np.dtype(str))
    features = sp.csr_matrix(idx_features_labels[:, 1:-1], dtype=np.float32)
    labels = idx_features_labels[:, -1]
    
    # 标签编码
    le = LabelEncoder()
    labels = le.fit_transform(labels)
    
    # 构建节点索引映射
    idx = np.array(idx_features_labels[:, 0], dtype=np.int32)
    idx_map = {
   j: i for i, j in enumerate(idx)}
    
    # 读取边信息并构建邻接矩阵
    edges_unordered = np.genfromtxt("{}{}.cites".format(path, dataset), dtype=np.int32)
    edges = np.array(list(map(idx_map.get, edges_unordered.flatten())), dtype=np.int32).reshape(edges_unordered.shape)
    adj = sp.coo_matrix((np.ones(edges.shape[0]), (edges[:,0], edges[:,1])), shape=(labels.shape[0], labels.shape[0]), dtype=np.float32)
    
    # 构建对称的邻接矩阵
    adj = adj + adj.T.multiply(adj.T > adj) - adj.multiply(adj.T > adj)
    
    return features

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

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

相关文章

搭建Tomcat(四)---Servlet容器

目录 引入 Servlet容器 一、优化MyTomcat ①先将MyTomcat的main函数搬过来: ②将getClass()函数搬过来 ③创建容器 ④连接ServletConfigMapping和MyTomcat 连接: ⑤完整的ServletConfigMapping和MyTomcat方法: a.ServletConfigMappin…

Iris简单实现Go web服务器

package mainimport ("github.com/kataras/iris" )func main() {app : iris.New() // 实例一个iris对象//配置路由app.Get("/", func(ctx iris.Context) {ctx.WriteString("Hello Iris")})app.Get("/aa", func(ctx iris.Context) {ct…

MySql 中的解决某列中多个字段查询是否存在指定某个值, FIND_IN_SET 用法。

简言:今天公司数据库里面有个列是多个数据拼接而成的比如:**“,131113,749932833,749932825,749932826,749932827,749932828,749932829,”**想要通过sql 查找749932833值的列,很多同学第一想到的就是like 模糊匹配,模糊匹配不能保…

Git实用指南(精简版)

目录 读者须知 Git是什么 Git的原理 文件在Git中的几种状态 快速上手 结尾 读者须知 本文章适合从未接触过git,或者需要深度学习Git的用户进行阅读. 文末有详细的文档,读者可以前往Github下载阅读!!三克油 Git是什么 简单来说,Git是一个代码备份工具,你可以使用指令对…

jmeter 接口性能测试 学习笔记

目录 说明工具准备工具配置jmeter 界面汉化配置汉化步骤汉化结果图 案例1:测试接口接口准备线程组添加线程组配置线程组值线程数(Number of Threads)Ramp-Up 时间(Ramp-Up Period)循环次数(Loop Count&…

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书 一、下载影刀: https://www.winrobot360.com/share/activity?inviteUserUuid595634970300317698 二、加入应用市场 https://www.yingdao.com/share/accede/?inviteKeyb2d3f22a-fd6c-4a…

Unbuntu下怎么生成SSL自签证书?

环境: WSL2 Unbuntu 22.04 问题描述: Unbuntu下怎么生成SSL自签证书? 解决方案: 生成自签名SSL证书可以使用OpenSSL工具,这是一个广泛使用的命令行工具,用于创建和管理SSL/TLS证书。以下是生成自签名…

通过阿里云 Milvus 与 PAI 搭建高效的检索增强对话系统

背景介绍 阿里云向量检索服务Milvus版(简称阿里云Milvus)是一款云上全托管服务,确保了了与开源Milvus的100%兼容性,并支持无缝迁移。在开源版本的基础上增强了可扩展性,能提供大规模 AI 向量数据的相似性检索服务。相…

打靶记录22——Tomato

靶机: https://download.vulnhub.com/tomato/Tomato.ova 难度: 低 目标: 获得 Root 权限 Flag 攻击方法: 主机发现端口扫描信息收集路径爬取源码分析文件包含写入日志 /var/log/auth.log内核漏洞枚举 les.sh本地提权 主机…

三维引擎cesium学习经验

三维引擎cesium学习经验: 1、初始化viewer对象 2、对entity的操作:添加,隐藏,修改,去除,居中显示 3、去除掉entity的双击事件 4、获取当前视角高度 5、获取经纬度在屏幕上的位置 6、获取三维场景屏幕中心点…

【蓝桥杯】43699-四平方和

四平方和 题目描述 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方和。如果把 0 包括进去,就正好可以表示为 4 个数的平方和。 比如: 502021222 712121222; 对于一个给定的正整数,可…

十、从0开始卷出一个新项目之瑞萨RZN2L rzn-fsp v2.0.0 Release Notes

目录 一、概述 二、Github地址 三、 Features Added 3.1 Developer Assistance feature support added. 3.2 Multiplex interrupts support added. 四、Bug Fixes and Improvements 4.1 Added a noncache section for user applications. 4.2 Unified case of asm inst…

VM16+解压版CentOS7安装和环境配置教程(2024年12月20日)

VM16解压版CentOS7安装和环境配置教程-2024年12月20日 一、下载安装包二、vm安装三、解压版CentOS7安装四、CentOS设置静态IP 因为很多同学觉得配置CentOS7好麻烦,我特地提供了一个已经配置好的现成镜像,来简化操作本篇来记录过程。 如果你在看到这篇文章…

PC寄存器(Program Counter Register)jvm

在JVM(Java虚拟机)中,PC寄存器(Program Counter Register)扮演着至关重要的角色。以下是对JVM中PC寄存器的详细解释: 一、定义与功能 定义: JVM中的PC寄存器,也被称为程序计数器,是对物理PC寄存器的一种抽象模拟。它用于存储当前线程所执行的字节码指令的地址,即指…

学习threejs,scene.overrideMaterial全局材质效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.2 ☘️THREE.Scene 场景1.2 ☘️…

【原生js案例】前端封装ajax请求及node连接 MySQL获取真实数据

上篇文章,我们封装了ajax方法来请求后端数据,这篇文章将介绍如何使用 Node.js 来连接 MySQL,并对数据库进行操作。 实现效果 代码实现 后端接口处理 const express require("express"); const connection require("../da…

FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.2,RTP协议-RTP协议概述,协议详情

前提: 为什么要学习 RTP(Real-time Transport Protocol)重点 简介:RTP是一个实时传输媒体数据的协议,通常与RTSP一起使用。它负责在网络上传输音视频数据。特点:RTP通过UDP或TCP传输媒体数据,提供时间戳和序…

Chapter 18 CMOS Processing Technology

Chapter 18 CMOS Processing Technology 这一章介绍CMOS制造工艺, 介绍wafer制作, 光刻, 氧化, 离子注入, 沉淀(deposition)和刻蚀. 然后介绍MOS管制作流程, 最后介绍被动器件和互连接. 18.1 General Considerations sheet resistance为方块电阻. R ρL/(W t), 方块电阻定…

服务器数据恢复—V7000存储中多块磁盘出现故障导致业务中断的数据恢复案例

服务器存储数据恢复环境: 一台V7000存储上共12块SAS机械硬盘(其中1块是热备盘),组建了2组Mdisk,创建了一个pool。挂载在小型机上作为逻辑盘使用,小型机上安装的AIXSybase。 服务器存储故障: V7…

LabVIEW中的“Synchronize with Other Application Instances“

在LabVIEW中,“Synchronize with Other Application Instances”是一个常见的提示或错误,通常出现在尝试并行运行多个LabVIEW实例时,特别是当你打开多个VI或项目时。这个问题可能影响程序的执行流程,导致不同实例之间的数据同步或…