FedR代码的学习--数据的预处理

def get_all_clients(all_data, args):

点击查看代码
wwcnt_mat = sparse.csr_matrix((dat_values, (row_indxs, col_indxs))) 
这句代码创建了一个稀疏矩阵(sparse matrix) `wwcnt_mat`,其中 `dat_values` 是矩阵中非零元素的值,而 `(row_indxs, col_indxs)` 是对应的非零元素所在的行和列的索引。

具体地说,sparse.csr_matrix((dat_values, (row_indxs, col_indxs))) 是使用 scipy.sparse 库的 csr_matrix 函数来创建一个稀疏矩阵。在这个函数中,第一个参数 dat_values 是一个包含了矩阵中所有非零元素值的列表;第二个参数 (row_indxs, col_indxs) 则是一个元组,其中 row_indxs 是一个包含了非零元素所在行的索引的列表,而 col_indxs 是包含了非零元素所在列的索引的列表。

例如,如果 dat_values = [3, 1, 2]row_indxs = [0, 1, 2]col_indxs = [1, 2, 0],那么 sparse.csr_matrix((dat_values, (row_indxs, col_indxs))) 将创建一个3x3的稀疏矩阵,其中 (0, 1) 处的元素值为 3,(1, 2) 处的元素值为 1,(2, 0) 处的元素值为 2,而其它位置的元素值都为零。注意,这里行索引和列索引的顺序与通常的 (row, column) 顺序相反,因为 csr_matrix 的参数顺序是 (data, (row_ind, col_ind))。

稀疏矩阵是一种特殊的矩阵存储方式,它仅存储非零元素的值及其索引,从而节省内存空间。在处理大规模数据时,稀疏矩阵能够显著提高计算效率和降低存储开销。

点击查看代码
sum_over_contexts = np.array(wwcnt_mat.sum(axis=1)).flatten()
这行代码计算了 `wwcnt_mat` 稀疏矩阵中每一行(即每个实体或关系)的元素和,并将结果存储在名为 `sum_over_contexts` 的NumPy数组中。

具体地说:

  1. wwcnt_mat.sum(axis=1):这是计算 wwcnt_mat 稀疏矩阵的每一行元素之和的操作。axis=1 指定了计算行的和。因此,wwcnt_mat.sum(axis=1) 的结果是一个列向量,其中每个元素是对应行的元素和。

  2. np.array(...):这是将计算得到的列向量转换为NumPy数组的操作。将稀疏矩阵的和转换为NumPy数组是为了更方便地进行后续的操作。

  3. .flatten():这是将NumPy数组展平为一维数组的操作。由于 wwcnt_mat.sum(axis=1) 的结果是一个列向量,使用 flatten() 可以将其转换为一维数组,方便后续的计算和处理。

最终,sum_over_contexts 是一个包含了 wwcnt_mat 稀疏矩阵每一行元素和的一维NumPy数组。它用于在计算边的权重时,作为上下文的统计信息,用于对实体和关系之间的共现进行归一化处理。

假设我们有一个简化的 wwcnt_mat 稀疏矩阵,其内容如下:

[0 1 2]
[3 0 4]
[5 6 0]

计算过程如下:

1.wwcnt_mat.sum(axis=1):按行求和,得到一个列向量:

[3]
[7]
[11]

2.np.array(...):将列向量转换为NumPy数组:

array([[ 3],
[ 7],
[11]])

3.flatten():将NumPy数组展平为一维数组:

[ 3, 7, 11]

点击查看代码
    adj = edge_mat + sparse.eye(edge_mat.shape[0], format="csr")
假设我们有一个简化的 edge_mat 稀疏矩阵和单位对角矩阵,它们的内容如下:

edge_mat 稀疏矩阵:

[0.0 0.3 0.2]
[0.4 0.0 0.5]
[0.1 0.6 0.0]

单位对角矩阵:

[1.0 0.0 0.0]
[0.0 1.0 0.0]
[0.0 0.0 1.0]

计算过程如下:
1.edge_mat.shape[0]:获取 edge_mat 稀疏矩阵的行数,因为它是一个方阵,所以行数也是列数,这里为3。

2.sparse.eye(edge_mat.shape[0], format="csr"):创建一个3x3的单位对角矩阵,如上所示。

3.edge_mat + sparse.eye(edge_mat.shape[0], format="csr"):将 edge_mat 稀疏矩阵与单位对角矩阵相加,对应位置的元素相加:

[1.0 0.3 0.2]
[0.4 1.0 0.5]
[0.1 0.6 1.0]

点击查看代码
        train_adj = compute_weighted_adj_matrix(train_triples.tolist(), nrelation).to(args.gpu) #change: nentity
        train_adj_list.append(train_adj)

1.compute_weighted_adj_matrix(train_triples.tolist(), nrelation): 这是一个函数调用,用于计算加权邻接矩阵。它接收 train_triples.tolist() 作为数据和 nrelation 作为关系的数量,并返回一个PyTorch稀疏张量表示的加权邻接矩阵。在上文提供的代码中,我们已经解释过 compute_weighted_adj_matrix 函数的功能。

2.train_adj = compute_weighted_adj_matrix(train_triples.tolist(), nrelation).to(args.gpu): 这行代码首先调用 compute_weighted_adj_matrix 函数,计算得到一个训练集的加权邻接矩阵,并将其保存在名为 train_adj 的变量中。然后,通过 .to(args.gpu) 将这个PyTorch稀疏张量移动到特定的计算设备(可能是GPU)上。这是为了在使用图神经网络进行训练和推断时,能够充分利用GPU加速来提高计算效率。

3.train_adj_list.append(train_adj): 将 train_adj 加权邻接矩阵添加到名为 train_adj_list 的列表中。在这段代码被多次执行(可能在多个训练集上)时,train_adj_list 将包含多个训练集的加权邻接矩阵,供后续的图神经网络训练使用。

点击查看代码
        embeddings = torch.nn.Embedding(nentity, args.emb_dim)
        ent_embed = torch.nn.init.xavier_normal_(embeddings.weight.data)
        ent_embed_list.append(ent_embed)

1.当我们创建 torch.nn.Embedding(nentity, args.emb_dim) 对象时,它内部会包含一个权重矩阵,该矩阵用于存储实体嵌入的参数。这个权重矩阵被称为嵌入层的权重,它的形状为 (nentity, emb_dim),其中 nentity 是实体的数量,emb_dim 是嵌入的维度。

2.在这里,我们使用 Xavier 正态分布方法对权重矩阵进行初始化。torch.nn.init.xavier_normal_ 是 PyTorch 提供的一个初始化函数,它会根据 Xavier 正态分布方法初始化权重矩阵的值。

3.具体地说,Xavier 正态分布初始化是一种常用的初始化方法,旨在帮助模型在前向传播和反向传播时更好地传播梯度,从而加速收敛和提高模型的训练效果。通过 Xavier 初始化,权重矩阵的值被随机采样自均值为0、方差为2 / (输入维度 + 输出维度) 的正态分布。这种初始化方法被广泛用于深度学习模型,特别是在神经网络中使用的嵌入层。这样的初始化有助于确保权重的初始值不过大或过小,从而在训练时更容易进行梯度传播,避免梯度消失或爆炸的问题,提高模型的收敛性和训练效率。

点击查看代码
        rel_freq = torch.zeros(nrelation)
        for r in data['train']['edge_type_ori'].reshape(-1):
            rel_freq[r] += 1
        rel_freq_list.append(rel_freq)
posted @ 2023-07-20 12:44  GraphL  阅读(68)  评论(0)    收藏  举报