图神经网络:消息传递算法

一、说明

图网络-GNN(Graph Neural Networks)是近几年研究的主题之一,虽不及深度神经网络那么火爆,但在一些领域,如分子化学方面是不得不依赖的理论。本文就一些典型意义的图神经网络消息传递展开阐述。

二、图网络简述

        图神经网络是一种用于以图形式呈现的数据的神经网络。图形是由顶点(节点)和边组成的空间结构。有许多结构表示为图形:三维空间(x,y,z)中的结构,如物质分子(例如咖啡因)、蛋白质(由氨基酸组成)、DNA、计算机网络以及社交网络等结构。以下是一些使用 Wolfram Mathematica 制作的例子:

        咖啡因的分子结构

        蛋白

        蛋白质中原子的 XYZ 坐标

社交网络

        社交网络社区

        基本上,每个节点代表一个人、一个原子、一个金融交易,这些节点通过边连接,在这些实体之间建立关系。在人与人之间,这可能是领带的强度、社交距离、亲密程度。在分子结构中的原子中,这些边缘可能是共价键。在金融交易中,这些边缘可以定义某人与欺诈交易的距离。

        考虑到社交网络的例子(如上图),我们有密集连接的人集群,可能与“影响者”有关,也有薄弱环节(弱纽带),它们连接不同的人群,允许信息的多样性。当我们亲自或通过社交媒体相互交谈时,我们的信息会通过这个社交网络传播,并且可能会受到其内容的变形和误解的影响。原子及其电磁特性也会发生同样的情况:其他原子离得越近,它们受这些电磁特性的影响就越大。因此,经过一段距离后,这种影响会逐渐消失。此外,如果允许这种影响渗透到所有网络结构中,则由于饱和,整个网络可能会收敛到单一状态。

三、图网络的向量模型

        但是,我们如何才能用数学方式来表示这些复杂的关系,以便能够对这些相互作用进行建模呢?首先,我们应该定义每个参与者之间的联系。这是通过邻接矩阵完成的,其中相同的个体被放置在该矩阵的行和列中:

        基于邻接矩阵的网络结构

        此邻接矩阵中的每个数字 1 都表示一个连接。我们有一个 5 x 5 矩阵,其中节点 1 到 5 分别放置在线和列中。所以,如果你拿个体 2,他只与个体 5 相连。个体 1 连接到个体 3 和 5,依此类推。为了绘制这个网络,我使用了以下代码:

import numpy as np
import networkx as nxAdj = np.array([[0, 0, 1, 0, 1],[0, 0, 0, 0, 1], [0, 0, 0, 1, 1], [0, 0, 1, 0, 1], [1, 1, 0, 0, 0]]
)
g = nx.from_numpy_array(Adj)
pos = nx.circular_layout(g)fig, ax = plt.subplots(figsize=(8,8))
nx.draw(g, pos, with_labels=True, labels={i: i+1 for i in range(g.number_of_nodes())}, node_color='#f78c31', ax=ax, edge_color='gray', node_size=1000, font_size=20, font_family='DejaVu Sans')

        现在我们将邻接矩阵乘以由行数组成的向量。因此,我们将得到一个 5 x 5 矩阵乘以 5 x 1 向量。这意味着 n x p 乘以 p x m 将得到一个 n x m 向量。在本例中,5 x 1 向量:

H = Adj @ np.array([1,2,3,4,5]).reshape(-1,1)

        请注意,为了进行此乘法,您需要将 p x m 向量转置为 [1,2,3,4,5],并逐个元素乘以邻接矩阵和总和的那行的每个元素。结果是相连邻域的总和。按住 一会儿。 

        现在我们将找到对角线度矩阵,它由对角线中的邻域大小组成,即矩阵中每一列的总和:

D = np.zeros(Adj.shape)
np.fill_diagonal(D, Adj.sum(axis=0))

对角线度矩阵

现在,我们将为每个边分配一个权重。我们通过将恒等矩阵除以对角度矩阵来做到这一点。

D_inv = np.linalg.inv(D)

倒置度矩阵

通过将倒置的 D 乘以邻接矩阵,我们将得到一个平均的邻接矩阵

        平均邻接矩阵

        当我们处理一个没有单个值的节点,而是特征向量的集合时,平均的概念非常重要,就像图卷积网络一样。

        但是,我们真正想要操作的是消息传递算法,如下所示:

        反复应用的帽子将允许信息在图网络中流动。假设波浪号等于邻接矩阵加单位矩阵,我们有:

g = nx.from_numpy_array(Adj)
Adj_tilde = Adj + np.eye(g.number_of_nodes())

        现在我们需要创建 D 波浪号的平方根。我们创建一个零矩阵,并将邻接矩阵波浪号的线和值相加。

D_tilde = np.zeros_like(A_tilde)
np.fill_diagonal(D_tilde, A_tilde.sum(axis=1).flatten())

        然后我们计算 D 波浪号的平方反比根:

D_tilde_invroot = np.linalg.inv(sqrtm(D_tilde))

        现在我们已经有了 A 波浪号,以及 D 波浪号的平方反比根,我们可以计算出 A 帽子:

A-hat(帽子)的程序表示:

A_hat = D_tilde_invroot @ A_tilde @ D_tilde_invroot

        请注意,numpy 中的 @ 与 matmul 的意思相同。

A-hat 帽子的结果

        现在我们将实现消息传递算法。让我们从我们拥有的消息向量 (H) 开始,检查它在图网络中的流动方式。我们知道:

H = Adj @ np.array([1,2,3,4,5]).reshape(-1,1)

        现在我们让信息流在图网络中:

epochs = 9
information = [H.flatten()]
for i in range(epochs):H = A_hat @ Hinformation.append(H.flatten())

四、图神经网的可视化 

        让我们看看这个热图中的信息流。注意每个个体(x 轴)如何随时间(y 轴)获取或丢失信息。

import matplotlib.pyplot as pltplt.imshow(information, cmap='Reds', interpolation='nearest')
plt.show()

        让我们把它画出来:

fig, ax = plt.subplots(figsize=(12, 12))
from time import timefor i in range(0,len(information)):colors = information[i]nx.draw(g, pos, with_labels=True, labels=node_labels, node_color=colors*2, ax=ax, edge_color='gray', node_size=1500, font_size=30, font_family='serif',vmin= np.array(information).min(), vmax=np.array(information).max())plt.title("Epoch={}".format(i))plt.savefig('/home/user/Downloads/message/foo{}.png'.format(time()), bbox_inches='tight', transparent=True)import glob
from PIL import Imagefp_in = "/home/user/Downloads/message/foo*.png"
fp_out = "/home/user/Downloads/message100_try.gif"img, *imgs = [Image.open(f) for f in sorted(glob.glob(fp_in))]
img.save(fp=fp_out, format='GIF', append_images=imgs,save_all=True, duration=1200, loop=0)

        从视觉上看,图网络中的信息流在每个时期都如下所示:

        在下图中,我们可以看到网络的每个节点随时间推移有多少信息。请注意节点 1、3、4 和 5 的收敛:

        有关消息传递算法在基于代理的模型中的实际应用,请参阅我在 COMSES 上使用 Python 和 NetLogo 制作的模型:鲁本斯·津布雷斯

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

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

相关文章

Vue 3 渲染机制解密:从模板到页面的魔法

Vue 3 渲染机制解密 前言Vue 3的响应性系统1. **Reactivity API:**2. **Proxy 对象:**3. **Getter 和 Setter:**4. **依赖追踪:**5. **批量更新:**6. **异步更新:**7. **递归追踪:**8. **删除属性:** 虚拟DOM的角色1. **减少直接操作真实 DOM:**2. **高效的批量更新:**3. **跨平…

【java】想要限制每次查询的结果集不能超过10000行,该如何实现?

文章目录 前言 前言 对于一些Saas化软件,当某个租户在执行查询SQL时,如果查询条件出现了BUG,导致去查了所有租户的数据,这种情况是非常严重的,此时就需要在架构层面做限制,禁止一些特殊SQL的执行&#xff…

@PropertySource适配通配符加载到Environment的一种方案

PropertySource可将配置文件加载到内存,时间有限说干的,PropertySource注解有4个参数,其中value表示要加载文件的路径,这个参数不支持通配符。还有一个参数PropertySourceFactory是加载配置文件的工厂,这两个参数配合使…

【GUI】-- 13 贪吃蛇小游戏之食物及成绩判断

GUI编程 04 贪吃蛇小游戏 4.4 第四步:食物及成绩判断 首先,添加食物与分数的数据定义: //食物的坐标int foodX;int foodY;Random random new Random();//积分面板数据结构int score;在初始化方法中,添加(画出)食物与分数&…

CSDN最新最全pytest系列——pytest-base-url插件之配置可选的项目系统UR

前言 ①当我们的自动化代码完成之后,通常期望可以在不同的环境进行测试,此时可以将项目系统的URL单独拿出来,并且可以通过pytest.ini配置文件和支持pytest命令行方式执行。 ② pytest-base-url 是一个简单的pytest插件,它通过命…

纽扣电池上架TEMU、亚马逊美国站需要做什么认证?纽扣电池认证标准16CFR1700.15,16CFR1700.20

近日,Temu连发多条卖家弹窗内容均为商品质量事故违规处理通告。其中一条为卖家销售的车载吸尘器发生烧毁、冒烟等情况,产生用户人伤、财损等舆情。经查实是商家偷换关键部件锂电池,导致商品质量下降造成事故。TEMU对于问题车载吸尘器处理结果…

设计循环队列,解决假溢出问题

什么是假溢出? 当我们使用队列这种基本的数据结构时,很容易发现,随着入队和出队操作的不断进行,队列的数据区域不断地偏向队尾方向移动。当我们的队尾指针指向了队列之外的区域时,我们就不能再进行入队操作了&#xff…

单链表在线OJ题二(详解+图解)

1.在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针 本题的意思是要删除链表中重复出现的节点,然后返回删除重复节点后的链表。 我们可以直接用一个哨兵位以便于观察链表…

指针变量和地址

A.指针变量和地址 理解了内存和地址的关系&#xff0c;我们再回到C语⾔&#xff0c;在C语⾔中创建变量其实就是向内存申请空间&#xff0c;比如&#xff1a; #include <stdio.h> int main() {int a 10;return 0; } ⽐如&#xff0c;上述的代码就是创建了整型变量a&…

spring-boot-admin-starter-server监控springboot项目

文章目录 场景实现具体操作展示 场景 监控三件套Prometheus、Grafana、Alertmanager 部署起来太复杂,如果公司没有运维而且项目很小就可以使用spring-boot-admin-starter-server替代。这个包使用起来还是很简单的, 下面就实现一个对springCloud项目的监控 实现 参考 项目 具体操…

经典中的经典之字符串

前言&#xff1a;前段时间发烧了&#xff0c;所以耽误了很多事情&#xff0c;一直没有更新&#xff0c;多穿点衣服&#xff0c;感冒不好受。 接下来有时间就会陆续更新一些基础的算法题&#xff0c;题目都很经典&#xff0c;大家可以先尝试着做&#xff0c;再看 解析。 第一…

Windows常用cmd网络命令详解

中午好&#xff0c;我的网工朋友。 上回给你们梳理了一些有趣的cmd命令&#xff0c;很多朋友希望再拓展一下&#xff0c;这不就来了&#xff1f; 今天从windows切入&#xff0c;给你分享一些常用cmd网络命令&#xff0c;如果能熟悉上手&#xff0c;很多功能都可以快速实现&am…

Java Class 类文件格式看这一篇就够了

本文将揭开Java Class文件的神秘面纱&#xff0c;带你了解Class文件的内部结构&#xff0c;并从Class文件结构的视角告诉你&#xff1a; 为什么Java Class字节码文件可以“写一次&#xff0c;遍地跑”&#xff1f;为什么常量池的计数从1开始&#xff0c;而不是和java等绝大多数…

【JVM精讲与GC调优教程(概述)】

如何理解虚拟机(JVM)跨语言的平台 java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,他只关心“字节码”文件。 java不是最强大的语言,但是JVN是最强大的虚拟机。 不存在内存溢出? 内存泄露? JAVA = (C++)–; 垃圾回收机制为我们打理了很多繁琐的…

【人工智能入门学习资料福利】

总目录如下&#xff08;部分截取&#xff09;&#xff1a; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1bfDVG-xcPR3f3nfBJXxqQQ?pwdifu6 提取码&#xff1a; ifu6

B站已经部分上线前台实名,如不同意实名,后期账号流量将收影响!

B站部分百万粉丝博主的主页显示账号运营人名字的政策是从10月31日开始的。当天&#xff0c;B站官方发布了《哔哩哔哩关于头部“自媒体”账号前台实名的公告》&#xff0c;表明了其前台实名制的实施计划。 B站部分上线前台实名的过程可以追溯到2021年。当时&#xff0c;中国政府…

SQL语句执行过程

一条 SQL 的执行过程可以大致分为以下几个步骤&#xff1a; 连接器&#xff1a; ○ 客户端与数据库建立连接&#xff0c;并发送 SQL 语句给数据库服务。 ○ 连接器验证客户端的身份和权限&#xff0c;确保用户有足够的权限执行该 SQL 语句。查询缓存&#xff1a; ○ 连接器首先…

基于鹰栖息算法优化概率神经网络PNN的分类预测 - 附代码

基于鹰栖息算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鹰栖息算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鹰栖息优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

Motion v5.6.7 苹果电脑上的视频编辑

Motion mac是一款运行在苹果电脑上的视频编辑软件&#xff0c;它能让您自定Final Cut Pro字幕、转场和效果。 它可以在2D或3D空间中创建您自己的精美炫目的动画&#xff0c;同时还能在您工作时提供实时反馈。广色域支持让你的动态图形更显出色光彩。3D文字功能经过优化增强&am…

01背包与完全背包学习总结

背包问题分类见下图 参考学习点击&#xff1a;代码随想录01背包讲解 01背包问题&#xff1a; 核心思路&#xff1a; 1、先遍历物品个数&#xff0c;再遍历背包容量。因为容量最先是最大的&#xff0c;往背包里放物品&#xff0c;所以背包容量在慢慢减少&#xff0c;但背包容量…