目录
1.快速了解的例子:
(1)假设所有节点的初始特征都是[1, 0, 0] ,那么AX的结果是:
(2) 的结果是:
(3) 总结:
2.计算结构系数的例子
(1)源代码的计算形式是:
(2) 正常的AX是:
(3) A转置以后发现和上面的源代码的 X 是一致的;仅仅展示转换后的结果;
3.总结:
来看这个例子:
目标节点是有向边箭头指向的点。在有向图中,每条有向边都有一个起点和一个终点,起点被称为源节点,终点被称为目标节点。箭头从源节点指向目标节点,表示数据或信息从源节点流向目标节点。
可以看到每一行的结果表示的是从目标节点传出的信息的和
这里每一行的结果才是从源节点(邻居节点)传入目标节点的信息。
pytorch geometric中为何要将稀疏邻接矩阵写成转置的形式adj_t?
原因就是:
pytorch geometric
的边信息可以有两种存储模式,第一种是edge_index
,它的shape是[2, N]
,其中 N
是边的数目。第一个N
维的元素存储边的原点的信息,称为source
,第二个N
维的元素存储边的目标点的信息,称为target。
举个例子,如果我们有以下这样一张有向图,那么edge_index
是这样的: tensor([[1, 2, 3, 4], [0, 0, 0, 0]])
,边是(1,0), (2,0), (3,0), (3,0)
pytorch geometric
的边信息的第二种存储模式是adj_t
,它是一个sparse tensor
。这里我们看到作者在adj
后面加上了t
,说明它是邻接矩阵的转置。为什么要写成转置呢,我们接着上面edge_index
讲节点的度数作为节点的初始特征
传入各节点的消息(不算自己):
这里的A不是标准的A,是weight,在计算的结构系数时候,weight[node][index]表示的是邻居 index 对与目标节点 node的重要程度。结果是:
计算的将原图的有向边的方向调转以后的新图:然后得到新图上从邻居节点到目标节点聚合的消息。
所以源代码的计算结果没错的。我的思路也是对的。
算的是正儿八经的原图的从源节点(邻居节点)到目标节点的信息。
参考的文章有:
pytorch geometric中为何要将稀疏邻接矩阵写成转置的形式adj_t_pytorch中的稀疏矩阵为什么要转置-CSDN博客