圖神經網絡:消息傳遞算法

一、說明

圖網絡-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],并逐個元素乘以鄰接矩陣和總和的那行的每個元素。結果是相連鄰域的總和。按住?H?一會兒。?

????????現在我們將找到對角線度矩陣,它由對角線中的鄰域大小組成,即矩陣中每一列的總和:

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.pswp.cn/news/160885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160885.shtml
英文地址,請注明出處:http://en.pswp.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對于問題車載吸塵器處理結果…

opencv 存儲bgr格式/同理可類推yuv

需求背景 開發rk3588 音視頻硬件編解碼,然后看見他的輸入文件格式。。 只能是裸的文件。不能是壓縮過的。就是不能是jpg/png這種格式,只能是以下的圖像/視頻 的存儲格式.那么我沒有這個格式的,以前hi3559的bgr格式和他要的也不太一致&#x…

設計循環隊列,解決假溢出問題

什么是假溢出? 當我們使用隊列這種基本的數據結構時,很容易發現,隨著入隊和出隊操作的不斷進行,隊列的數據區域不斷地偏向隊尾方向移動。當我們的隊尾指針指向了隊列之外的區域時,我們就不能再進行入隊操作了&#xff…

單鏈表在線OJ題二(詳解+圖解)

1.在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針 本題的意思是要刪除鏈表中重復出現的節點,然后返回刪除重復節點后的鏈表。 我們可以直接用一個哨兵位以便于觀察鏈表…

【GIT】代碼倉庫服務器變更本地修改并推送

author: jwensh date: 20231122 問題背景 沒有使用域名的 gitlb 服務器搬移(IP地址變了), 以至于 gitlab 管理的項目無法進行連接及推送。因為涉及到多個項目工程,所以可以用本地配置修改的方式來進行重新關聯(這種修…

指針變量和地址

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項目的監控 實現 參考 項目 具體操…

算法通關村第十二關|青銅|字符串轉換整數

1.轉換成小寫字母 原題&#xff1a;力扣709. 字符串大寫轉小寫有現成的API使用&#xff0c;但是我們也可以自己來實現。 使用或運算進行加操作能提高效率&#xff0c;因為 32 對應的二進制表示為 00100000 &#xff0c;而大寫字母的范圍 [65, 90] 的二進制表示在 00100000 的…

經典中的經典之字符串

前言&#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等絕大多數…

封裝Redis工具類

基于StringRedisTemplate封裝一個緩存工具類&#xff0c;滿足下列需求&#xff1a; 方法1&#xff1a;將任意Java對象序列化為json并存儲在string類型的key中&#xff0c;并且可以設置TTL過期時間 方法2&#xff1a;將任意Java對象序列化為json并存儲在string類型的key中&…

【JVM精講與GC調優教程(概述)】

如何理解虛擬機(JVM)跨語言的平臺 java虛擬機根本不關心運行在其內部的程序到底是使用何種編程語言編寫的,他只關心“字節碼”文件。 java不是最強大的語言,但是JVN是最強大的虛擬機。 不存在內存溢出? 內存泄露? JAVA = (C++)–; 垃圾回收機制為我們打理了很多繁瑣的…

力扣刷題第二十八天--二叉樹

前言 今天的五道題都是層序遍歷的模板&#xff0c;深度優先的遞歸還不太熟。繼續努力。 內容 一、在每個樹行中找最大值 515.在每個樹行中找最大值 給定一棵二叉樹的根節點 root &#xff0c;請找出該二叉樹中每一層的最大值。 廣度優先搜素 時間復雜度&#xff1a;O(n)…

算法基礎:KMP算法詳細詳解

目錄 1、幾個最基本的概念 2、暴力算法 3、KMP算法 4、KMP代碼實現 5、時間復雜度 1、幾個最基本的概念 字符串的前綴&#xff1a; 主串&#xff08;目標串&#xff09;從索引0開始的子串被稱為主串的前綴。 字符串的后綴&#xff1a; 主串從索引大于0的位置到結尾的子串…