图卷积分为两大类,一类是基于谱方法(spectral methods),就是将图信号进行傅里叶变换在频域进行研究,以GCN为代表的模型,但是谱方法有一个理论要求就是拉普拉斯矩阵L要求为对称矩阵,L = D-A,即图为无向图才能满足;二类,是基于空域的研究方法(spatial methods),以GraphSage为代表的模型,空域是不分有向图和无向图的,均可以计算;
因此从理论上来说GCN是不能用于有向图的,但是从代码实现层面上来看是可以的,gcn代码的实现层面是按照空域实现的,所以gcn也能够用于有向图。
详情参考:https://github.com/rusty1s/pytorch_geometric/issues/397
edge_index是coo()形式的情况下[2,num_edges],edge_index[0]表示source节点,edge_index[1]表示target 节点
当flow = 'source_to_target'时,消息传递的方向为source->target,即edge_index[0] - > edge_index[1],反之,消息传递的方向为target->source;
有向图的方向与消息传递方向的区别,一般情况下,建立有向图的时候应该保持有向图方向和消息传递的方向相同,比如下面的有向图:
节点A收到来自节点X,Y的message,所以A = aggr(X,Y);
edge_index的定义为:
edge_index = torch.tensor([
[X, Y, A, A, B, B, C],
[A, A, B, C, D, E, F],
])
详细参考:
https://github.com/rusty1s/pytorch_geometric/issues/1845
https://github.com/rusty1s/pytorch_geometric/issues/1040
https://github.com/rusty1s/pytorch_geometric/issues/126
有向图的情况下,消息传递的方向与有向图方向一致,但是采样方向是与有向图方向相反的,因为只有K阶采样的方向与图的方向相反,才能保证在消息传递的时候方向与有向图方向一致;
详情见:GraphSAGE 无监督训练源码剖析 这边文章中的关键问题1
https://blog.csdn.net/minemine999/article/details/118658429
https://zhuanlan.zhihu.com/p/397560946
待更新...