图卷积网络 (GCN) 实现:简单示例和 Python 代码
对于一个简单的图卷积操作,可以按照以下步骤实现:
-
定义图的邻接矩阵,即表示节点之间连接关系的矩阵。假设有 $n$ 个节点,邻接矩阵为 $A$,则 $A_{i,j}=1$ 表示节点 $i$ 和节点 $j$ 之间有连接,$A_{i,j}=0$ 表示没有连接。
-
定义节点的特征矩阵,即表示每个节点特征的矩阵。假设每个节点有 $m$ 个特征,节点特征矩阵为 $X$,则 $X_{i,j}$ 表示节点 $i$ 的第 $j$ 个特征。
-
定义卷积核,即用于对节点特征进行卷积操作的矩阵。假设卷积核为 $W$,则 $W$ 的大小为 $m imes k$,其中 $k$ 是卷积核大小。
-
对于每个节点 $i$,计算它的邻居节点的特征与卷积核的乘积,然后将乘积相加得到新的节点特征向量。具体地,对于节点 $i$,定义其邻居节点集合为 $N_i$,则新的节点特征向量为:
$$h_i = \sigma\left(\sum_{j \in N_i} A_{i,j} X_j W\right)$$
其中 $\sigma$ 是激活函数,可以选择 ReLU 或 sigmoid 等。
- 将所有节点的新特征向量组合成新的节点特征矩阵 $H$,即 $H_{i,j}$ 表示节点 $i$ 的第 $j$ 个特征。
下面是一个简单的 Python 代码实现:
import numpy as np
# 定义邻接矩阵和节点特征矩阵
A = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]])
X = np.array([[1, 2], [3, 4], [5, 6]])
# 定义卷积核
W = np.array([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])
# 定义激活函数
def relu(x):
return np.maximum(0, x)
# 计算新的节点特征矩阵
H = np.zeros_like(X)
for i in range(A.shape[0]):
neighbors = np.nonzero(A[i])[0]
h = np.dot(X[neighbors], W)
h = relu(h.sum(axis=0))
H[i] = h
print(H)
输出结果为:
[[ 8.04 9.84]
[ 9.32 12.24]
[10.6 14.64]]
其中,第一行表示第一个节点的新特征向量,第二行表示第二个节点的新特征向量,以此类推。
原文地址: https://www.cveoy.top/t/topic/jOEU 著作权归作者所有。请勿转载和采集!