GCN是一种可直接作用于图并利用其结构信息的强大神经网络。
即使是随机初始化的两层GCN也可以生成图网络中节点的有用特征表征。
使用numpy编写一个有向的邻接矩阵:
import numpy as np
A = np.matrix([
[0, 1, 0, 0],
[0, 0, 1, 1],
[0, 1, 0, 0],
[1, 0, 1, 0]],
dtype = float)
然后是抽取特征。基于每个节点的索引为其生成两个整数特征,这里是为了后续计算方便,实际的特征由具体任务而定。
X = np.matrix([[i, -i] for i in range(A.shape[0])], dtype=float)
#X:
#[[0. 0.]
#[1. -1.]
#[2. -2.]
#[3. -3.]]
现在已经建立了一个图,其邻接矩阵为A,输入特征矩阵为X,应用传播规则后:
print(A * X)
#[[1. -1.]
#[5. -5.]
#[1. -1.]
#[2. -2.]]
每个节点的表征(即每一行)是其相邻节点特征的和。
也就是说,图卷积层将每个节点表示为其相邻节点的聚合。
这时候就会有两个问题:
1.节点的聚合表征不包含它自己的特征。该表征是相邻节点的特征聚合,因此只有具有自环(self-loop)的节点才会在该聚合中包含自己的特征。
2.度大的节