[GNN グラフ ニューラル ネットワーク] 通常の隣接行列と隣接行列と COO 疎行列 (edge_index と edge_w) は相互に変換されます

 はじめに: この記事では、主に Pytorch と Numpy を使用して、グラフの隣接行列と COO 疎行列 (edge_index と edge_w) の間の相互変換を実現します。

1. グラフの 2 つの表現

1.1 通常の隣接行列 AdjacencyMatrix

この記事で言及されているグラフは、無向グラフ G(V, E) を指しており、隣接行列は以下の図 F に示されています。

1.2 グラフ edge_index, edge_w のエッジの結合度と結合重み、つまり COO 疎行列

グラフは、edge_index と edge_w で表すこともできます。ここで、edge_index は 2*n 行列で、edge_w は 1*n 行列です。

2.コードを実装する

import torch
import scipy.sparse as sp
import numpy as np

#定义edge_index 和edge_w表示的图
edge_index = torch.tensor([[0, 0, 0, 1, 1, 2, 2, 2, 3, 3],
                           [1, 2, 3, 0, 2, 0, 1, 3, 0, 2]])
edge_w = torch.rand(10)

#将edge_index 和edge_w扩展成3维的张量,实做中第0维就是表示batch,这里batch_size = 64
big_edge_index = edge_index.unsqueeze(dim = 0)
big_edge_index = big_edge_index.repeat_interleave(64, dim=0)

big_edge_w = torch.rand(64, 10)

n = 64

#将edge_index 和edge_w表示的图 转化成 邻接矩阵表示的图
adj = torch.zeros(64, 4, 4)
for i in range(n):
    adj_matrix = sp.coo_matrix(arg1=(big_edge_w[i, :], (big_edge_index[i,0,:], big_edge_index[i,1,:])), shape=(4,4))
    adj_matrix = adj_matrix.todense()
    adj[i] = torch.from_numpy(adj_matrix)

#邻接矩阵表示的图转化为edge_index 和edge_w表示的图
for j in range(n):
    tmp_index = torch.nonzero(adj[j]).T
    tmp_data= adj[j][tmp_index[0], tmp_index[1]]
    tmp_index = tmp_index.unsqueeze(dim=0)
    tmp_data = tmp_data.unsqueeze(dim=0)
    if j == 0:
        index = tmp_index
        data = tmp_data
    else:
        index = torch.cat([index, tmp_index], dim=0) 
        data = torch.cat([data, tmp_data], dim=0)

new_edge_index = index
new_edge_w = data

*ご不明な点やエラーがある場合は、以下にメッセージを残してください。転載 出典を明示してください

参考記事:

[1]通常の隣接行列は edge_index の COO 疎行列形式に変換され、形式は [2, num_messages]_weixin_46269351 のブログ - CSDN ブログ 通常の隣接行列は edge_index の COO 疎行列形式に変換されます、形式は [2, num_edges] です。通常接触する隣接行列 adj の形式は、密行列 (元の 2 次元行列) ですが、PyG フレームワークを使用すると、形式が間違っていることがわかり、その形式の coo_matrix が必要になります。フォーム[2、エッジ]。まず、adj を通常の coo_matrix 行列に変換します: adj = sp.coo_matrix(adj)(0, 633) 1(0, 1862) 1(0, 2582) 1(0, 2) 1. .. .(2707, 165 ) 1(27 https://blog.csdn.net/weixin_46269351/article/details/121609178 )

[2] 疎行列を通常の行列に変換する python の解決に成功しました matrix_littlehaes のブログ - CSDN blog_python todense todense() メソッドを呼び出すだけです。次の例のように、b は疎行列です。密行列に変換されます cimport scipy.sparse as spimport numpy as npa = np.array([[0,3,2],[0,4,5],[1,3,6],[1,5, 7 ],[2,4,10]])b = sp.coo_matrix(arg1=(a[:, 2], ... https://blog.csdn.net/littlehaes/article/details/103523512

おすすめ

転載: blog.csdn.net/weixin_45203752/article/details/126095111