机器学习——图神经网络
图神经网络(GNN):理解复杂网络数据的有效工具
图神经网络(Graph Neural Network, GNN)是近年来机器学习领域的热门话题。GNN 以图结构数据为核心,能够高效地捕捉节点和边的复杂关系,广泛应用于社交网络、推荐系统、生物信息学等领域。本文将深入探讨图神经网络的基本概念、主要模型及其应用,并通过代码示例展示如何从头实现一个 GNN。
1. 图神经网络基础
1.1 什么是图?
在讨论 GNN 之前,我们首先要了解什么是图(Graph)。图是一种数据结构,用来表示实体(节点)以及它们之间的关系(边)。形式上,图可以定义为 G = ( V , E ) G = (V, E) G=(V,E),其中 V V V 是节点的集合, E E E 是边的集合。
图的表示形式可以适应各种数据,例如:
- 社交网络:用户是节点,好友关系是边。
- 分子结构:原子是节点,化学键是边。
- 推荐系统:用户和商品都是节点,购买行为或评分是边。
1.2 图神经网络的目标
图神经网络的主要目标是通过图的结构和节点的特征来进行学习。具体来说,GNN 可以用来解决以下问题:
- 节点分类:例如,在社交网络中预测用户的兴趣。
- 边预测:例如,在推荐系统中预测用户是否会对某个商品感兴趣。
- 图分类:例如,判断一个分子是否具有某种化学性质。
2. 图神经网络的工作原理
GNN 的核心思想是通过迭代地聚合每个节点邻居的信息来更新节点的表示。这种聚合操作可以概括为以下步骤:
- 消息传递(Message Passing):每个节点从其邻居接收信息。
- 特征更新:使用某种函数(通常是神经网络)来更新节点特征。
- 迭代更新:多次迭代上述步骤,直到节点特征达到稳定状态。
一个典型的节点特征更新公式可以表示为:
h v ( k ) = σ ( W ( k ) ⋅ ∑ u ∈ N ( v ) h u ( k − 1 ) ) h_v^{(k)} = \sigma \left( W^{(k)} \cdot \sum_{u \in \mathcal{N}(v)} h_u^{(k-1)} \right) hv(k)=σ⎝⎛W(k)⋅u∈N(v)∑hu(k−1)⎠⎞
其中, h v ( k ) h_v^{(k)} hv(k) 表示第 k k k 轮迭代中节点 v v v 的特征, N ( v ) \mathcal{N}(v) N(v) 表示节点 v v v 的邻居, W ( k ) W^{(k)} W(k) 是学习的权重, σ \sigma σ 是激活函数(例如 ReLU)。
3. GNN 模型及代码实现
3.1 图卷积网络(Graph Convolutional Network, GCN)
图卷积网络是一种最基础的 GNN 模型,其核心思想是通过卷积操作来聚合邻居节点的特征。下面是使用 PyTorch 和 PyTorch Geometric 实现 GCN 的示例代码:
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid# 加载Cora数据集
dataset = Planetoid(root='/tmp/Cora', name='Cora')data = dataset[0]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 = self.conv2(x, edge_index)return F.log_softmax(x, dim=1)# 创建模型并训练
model = GCN()
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()print(f'Epoch {epoch}, Loss: {loss.item()}')
在上述代码中,我们使用 PyTorch Geometric 加载了 Cora 数据集,并实现了一个简单的两层 GCN 模型。第一层将节点特征映射到16维空间,第二层将其映射到类别数,并使用 ReLU 激活函数进行非线性变换。
3.2 图注意力网络(Graph Attention Network, GAT)
图注意力网络通过引入注意力机制来聚合邻居节点的特征。GAT 使用注意力系数来衡量邻居节点的重要性。
以下代码展示了如何实现一个简单的 GAT 模型:
from torch_geometric.nn import GATConvclass GAT(torch.nn.Module):def __init__(self):super(GAT, self).__init__()self.gat1 = GATConv(dataset.num_node_features, 8, heads=8, concat=True)self.gat2 = GATConv(8 * 8, dataset.num_classes, heads=1, concat=False)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.gat1(x, edge_index)x = F.elu(x)x = self.gat2(x, edge_index)return F.log_softmax(x, dim=1)# 创建并训练GAT模型
model = GAT()
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()print(f'Epoch {epoch}, Loss: {loss.item()}')
在这个示例中,我们使用 GATConv 代替了 GCNConv。GAT 使用多头注意力机制来捕获不同邻居的重要性信息。
3.3 图自编码器(Graph Autoencoder, GAE)
图自编码器是一种用于无监督学习图嵌入的方法。GAE 通过编码器和解码器来学习节点的低维表示。
以下是实现 GAE 的示例代码:
from torch_geometric.nn import GCNConv, VGAEclass Encoder(torch.nn.Module):def __init__(self, in_channels, out_channels):super(Encoder, self).__init__()self.conv1 = GCNConv(in_channels, 2 * out_channels, cached=True)self.conv2 = GCNConv(2 * out_channels, out_channels, cached=True)def forward(self, x, edge_index):x = F.relu(self.conv1(x, edge_index))return self.conv2(x, edge_index)# 定义模型和优化器
encoder = Encoder(dataset.num_node_features, 16)
model = VGAE(encoder)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)model.train()
for epoch in range(200):optimizer.zero_grad()z = model.encode(data.x, data.edge_index)loss = model.recon_loss(z, data.edge_index)loss.backward()optimizer.step()print(f'Epoch {epoch}, Loss: {loss.item()}')
在这个代码中,我们使用了 Variational Graph Autoencoder (VGAE) 来进行图的无监督学习。GAE 可以有效地学习图的潜在结构,特别适合于节点嵌入和链接预测任务。
4. 图神经网络的应用
4.1 社交网络分析
在社交网络中,GNN 可以用于节点分类(如用户兴趣预测)、边预测(如好友推荐)以及社区发现等任务。GCN 和 GAT 等模型能够有效地捕获社交网络中的复杂关系。
4.2 推荐系统
在推荐系统中,用户和商品可以看作是图中的节点,用户与商品之间的交互(如评分、点击)可以作为图的边。通过 GNN,我们可以构建用户和商品的嵌入,用于预测用户对某商品的兴趣。
4.3 生物信息学
在生物信息学中,GNN 被广泛用于蛋白质结构预测、药物发现和基因相互作用网络的分析。通过 GNN,可以有效地学习分子结构的表示,从而加速药物的筛选和发现。
5. GNN 的优势与挑战
5.1 优势
- 灵活性:GNN 可以处理任意拓扑结构的数据,特别适合于非欧几里得数据(如社交网络、分子图等)。
- 有效性:GNN 通过聚合邻居信息,可以捕捉节点和边之间的复杂关系,提高模型的预测性能。
5.2 挑战
- 计算复杂度:当图的规模非常大时,GNN 的训练和推理的计算开销很高。
- 过平滑问题:在多次聚合邻居信息后,节点的表示可能会趋于相同,这会影响模型的性能。
6. 未来展望
GNN 在处理图数据方面展现了强大的能力,未来的研究将更加关注以下方向:
- 大规模图的高效训练:开发更加高效的算法和分布式计算框架,以处理大规模图数据。
- 动态图神经网络:现实世界中的图通常是动态变化的,例如社交网络中的好友关系,研究动态 GNN 是一个重要的方向。
- 可解释性:增强 GNN 的可解释性,帮助人们更好地理解 GNN 的决策过程。
7. 结论
图神经网络作为一种强大的工具,已经在许多领域取得了显著的成果。本文详细介绍了 GNN 的基本概念、核心算法(如 GCN、GAT 和 GAE)以及它们的实现方法。通过这些技术,研究者和工程师可以在各种图结构数据中挖掘潜在的信息,为社交网络、推荐系统和生物信息学等领域提供更好的解决方案。
希望这篇文章对你有所帮助。如果你想要进一步深入学习 GNN,建议阅读一些经典的论文,如《Semi-Supervised Classification with Graph Convolutional Networks》和《Graph Attention Networks》。另外,通过实践练习,例如使用 PyTorch Geometric 实现自己的 GNN 项目,也会大大加深你对 GNN 的理解。
参考资料
- Kipf, T. N., & Welling, M. (2017). Semi-Supervised Classification with Graph Convolutional Networks. ICLR.
- Veličković, P., et al. (2018). Graph Attention Networks. ICLR.
- Hamilton, W., Ying, Z., & Leskovec, J. (2017). Inductive Representation Learning on Large Graphs. NeurIPS.
相关文章:
机器学习——图神经网络
图神经网络(GNN):理解复杂网络数据的有效工具 图神经网络(Graph Neural Network, GNN)是近年来机器学习领域的热门话题。GNN 以图结构数据为核心,能够高效地捕捉节点和边的复杂关系,广泛应用于社交网络、推荐系统、生…...
一、在cubemx下RTC配置调试实例测试
一、rtc的时钟有lse提供。 二、选择rtc唤醒与闹钟功能 内部参数介绍 闹钟配置 在配置时间时,注意将时间信息存储起来,防止复位后时间重新配置。 if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0)! 0x55AA)//判断标志位是否配置过,没有则进…...
【Nas】X-DOC:Mac mini Docker部署中国特供版Jellyfin
【Nas】X-DOC:Mac mini Docker部署中国特供版Jellyfin 1、拉取镜像:2、启动镜像3、访问服务4、参考文档 Mac mini Docker部署中国特供版Jellyfin 1、拉取镜像: docker pull nyanmisaka/jellyfin:230901-amd64jellyfin 10.8.10版本ÿ…...
合合信息:生成式Al时代的内容安全与系统构建加速,开启智能文档的全新潜能
文章目录 写在前面图像内容安全图像篡改应用场景伪造文档/证照检测伪造人脸检测 GAI时代系统构建加速通用文档解析 合合信息 写在前面 随着人工智能技术的飞速发展,生成式AI已经悄然步入了我们的日常生活,以其强大的内容生成能力,重塑了信息…...
京东双十一高并发场景下的分布式锁性能优化
背景 在电商领域,尤其是像京东双十一这样的大促活动,系统需要处理极高的并发请求。这些请求往往涉及库存的查询和更新,如果处理不当,很容易出现库存超卖、数据不一致等问题。分布式锁作为一种有效的解决方案,能够在多…...
华为ICT题库-AI 人工智能部分
1178、以下哪个选项是华为的云端AI芯片?(云服务考点) (A)Inferentia (B)MLU100 (C)Cloud TPU (D)Ascend 910 答案:D 解析:华为的云端AI芯片被称为Ascend芯片系列,其中Ascend 910是其旗舰产品。Ascend 910…...
React Native 修改安卓应用图片和名称
在React Native(RN)项目中,修改安卓应用图标和名称通常涉及对Android原生代码的一些修改。以下是详细步骤: 修改应用图标 准备图标资源: 创建或获取你想要的图标,并确保它们符合Android的图标规范…...
普推知产:商标初审已下,商标申请通过如何高些!
近期下来一批商标注册的初步审公告通知书,一些客户对商标下证要求比较高的,普推知产商标老杨发现,要像下证高核心还是在于名称,名称起好备用的多,让商标专业人士经检索后层层过滤后提报,通过会好很多。 普推…...
HICP--2
在area 0的路由器只生成 area 0 的数据库,只在area 1 的一样。但是既在又在的生成两个 area的 LSDB 一、区域间三类LSA 在OSPF(Open Shortest Path First)协议中,区域间三类LSA(Link-State Advertisement)…...
sheng的学习笔记-AI基础-正确率/召回率/F1指标/ROC曲线
AI目录:sheng的学习笔记-AI目录-CSDN博客 分类准确度问题 假设有一个癌症预测系统,输入体检信息,可以判断是否有癌症。如果癌症产生的概率只有0.1%,那么系统预测所有人都是健康,即可达到99.9%的准确率。 但显然这样的…...
Linux -- 共享内存(2)
目录 命令 ipcs -m : 命令 ipcrm -m shmid: 共享内存的通信: 为什么共享内存更高效? 代码: ShmClient.cc: ShmServer.cc: 结果: 如何让共享内存实现同步? 代码&a…...
云函数实现发送邮件,以qq邮箱为例
云函数实现发送邮件,前端传参调用发送邮件即可。以qq邮箱为例。 1、开启qq邮箱的smtp服务并且生成授权码,操作界面如下图: 2、在腾讯云新建一个云函数代码如下: const nodemailer require("nodemailer");// 云函数入口函数 export…...
Kafka如何控制消费的位置?
大家好,我是锋哥。今天分享关于【Kafka如何控制消费的位置?】面试题?希望对大家有帮助; Kafka如何控制消费的位置? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中,控制消费位置主要通过以下几个机制来实…...
python爬虫——Selenium的基本使用
目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…...
【Linux】【xmake】安装 + C/C++常用项目配置
文章目录 0. 环境准备1. 子命令create - 快速创建项目build - 构建程序config - 配置编译需要的参数show - 查看当前工程基本信息update - 程序自更新 2. C/C 项目常用配置2.1 项目目标类型2.2 添加宏定义2.3 头文件路径和链接库配置2.4 设置语言标准2.5 设置编译优化2.6 添加源…...
Android 添加菜单开关控制Camera相机和第三方相机
本文主要通过SystemProperties系统属性和Settings.System存储数据库的状态进行判断,从而实现控制相机 /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml <!--camera--> <string name="manager_camera_switch"&…...
【Java知识】使用jacoco实现代码覆盖率测试
文章目录 1. 添加JaCoCo插件到项目2. 配置Maven Surefire Plugin3. 执行测试并生成报告4. 查看覆盖率报告注意事项 要使用JaCoCo实现代码覆盖率测试,你需要遵循以下步骤: 1. 添加JaCoCo插件到项目 在Maven项目的pom.xml文件中添加JaCoCo插件。这允许你执…...
道路车辆功能安全 ISO 26262标准(9-2)—面向汽车安全完整性等级 (ASIL) 和安全的分析
写在前面 本系列文章主要讲解道路车辆功能安全ISO26262标准的相关知识,希望能帮助更多的同学认识和了解功能安全标准。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 1. 道路车辆功能安全ISO 26262标准 9. ISO 26262-9 面向汽车安全完整…...
hutool常用方法
1、树结构工具-TreeUtil 构建Tree示例 package com.sl.transport.common.util;import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core…...
CloudSat数据产品数据下载与处理 (matlab)
CloudSat数据下载 这个数据我之前和CALIPSO弄混了,后来发现它们虽然是同一个火箭上去,但是数据产品却在不同的平台下,CloudSat的数据更加关注云的特性,包括云覆盖、云水当量、云分类数据。 数据网址在:CloudSat网址 …...
LDR6500 一拖三快充线的定义与特点
定义:LDR6500 一拖三快充线是一种具有 Type-C 接口的充电线,它的最大特点是可以同时连接三个设备进行快速充电。 特点: 高效充电:采用先进的快充技术,能够快速为设备充电,大大缩短充电时间。同时…...
Elasticsearch安装使用
ES 概述 Elasticsearch,简称为 ES,是一款非常强大的开源的高扩展的分布式全文检索引擎,可以帮助我们从海量数据中快速找到需要的内容,它可以近乎实时的存储、检索数据.还可以可以实现日志统计、分析、系统监控等功能. 官网:https://www.elast…...
计算机网络的主要知识点小结
计算机网络是指将多台计算机通过通信线路连接起来,实现资源共享和信息传递的系统。 一、计算机网络概述 1. 定义和功能 - 定义:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操…...
fastjson/jackson对getter,setter和constructor的区分
在复现完fastjson1.2.24-1.2.80和jackson的所有相关漏洞后,总结的一些规则 以下均指对json的反序列化过程 setter fastjson调用setter:遍历所有方法,找出所有满足setter要求的方法,再根据传入的json去反射调用 jackson调用set…...
认识CSS语法
CSS(网页美容) 重点:选择器、盒子模型、浮动、定位、动画,伸缩布局 Css的作用: 美化网页:CSS控制标签的样式 网页布局:CSS控制标签的位置 概念:层叠样式表(级联样式表…...
Linux运维篇-ansible的使用
目录 ansible简介ansible架构1、连接插件2、核心模块3、自定义模块4、插件5、剧本6、主机清单 ansible的执行过程安装Ansibleansible的使用ansible.cfg文件修改添加主机清单方式一方式二方式三 测试主机清单连接 ansible简介 简单来说,ansible就是一个自动化运维工…...
【MySQL】日志
1. 日志基本了解 常见的MySQL Server日志类型,以及记录的日志信息(场景通俗理解) 错误日志 记录的主要信息由服务器关闭、启动、崩溃事件;MySQL运行过程中出现的错误、警告和严重事件以及与权限、配置相关的问题使用场景 诊断MyS…...
2024年CentOS镜像下载地址,包括CentOS官网、国内镜像下载,超详细也
这里给大家提供了4种镜像下载地址,包括CentOS官方镜像下载、阿里云开源镜像站下载、网易开源镜像下载搜狐开源镜像下载。 1.CentOS官网镜像下载 因为服务器在国外所以打开CentOS官方网站的时候可能会比较慢。大家可以选择后面几种国内镜像下载方式。 1.1进入CentO…...
STL学习-顺序容器-array数组
array模板类是C11引入。它是有着固定大小用于保存一系列同类型元素的顺序容容器,因此不能对它进行增加或者删除,只能使用或者替换它的元素值。 1.定义及初始化 array定义对象时,需要传入类型和大小,且大小不能修改。array是唯--个如果不初始化,它的初始化是不明确…...
Spring Boot框架下的酒店住宿登记系统
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
做鸭网站/如何在百度做推广
一.RF之UI自动化测试环境 1:通过pip安装扩展库: pip install robotframework-seleniumlibrary 2.:下载谷歌游览器和对应驱动 https://www.cnblogs.com/loved-wangwei/p/8993013.html 3.将游览器驱动放在python的目录下 比如:我的python安装在D:\install…...
游戏交易类网站seo怎么做/官网排名优化
/* * 提取URL的收索字符串中的参数 * 这个函数用来解析来自URL的查询串中的namevalue参数对 * 它将namevalue对存储在一个对象的属性中,并返回该对象 * 这样来用它 * var args urlArgs();//从URL中解析参数 * var q args.q || "";//如果有参数就使用参数…...
服装定制图片/整站seo排名外包
王利芬:接下来请你就“自定人生”这几个字,做一个十分钟的小讲演。 李开复:好的,谢谢。其实我今天想讲的就是说,在过去在创新工场走的这两年多,我接触了很多创业者,也接触了很多优秀的创业型的…...
帝国网站模版/百度广告投放电话
当今,Spring Boot成为了Java开发中最受欢迎的技术之一。它是一个快速,开箱即用的开发框架,为Java开发人员提供了一个有效的方法来构建和运行应用程序。在本文中,我们将探讨Spring Boot的一些重要特性和它的优势。 Spring Boot的特…...
wordpress七号技师/怎么创建一个自己的网站
2 通过CBitmap类显示位图 通过CBitmap类显示位图的基本原理是将要显示的位图导入到CBitmap对象中,之后将该对象选入到兼容设备上下文(DC)中,最后将兼容设备上下文在设备上下文中显示。需要注意的是显示位图的代码要写在对话框程序…...
备份wordpress配置/佛山企业用seo策略
程序1: void myMalloc(char *s) //我想在函数中分配内存,再返回 { s(char *) malloc(100); } void main() { char *pNULL; myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么? if(p) free(p); } 程序2: void myMalloc(cha…...