FedR代码的学习--数据的预处理
def get_all_clients(all_data, args):
点击查看代码
wwcnt_mat = sparse.csr_matrix((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(axis=1):这是计算wwcnt_mat稀疏矩阵的每一行元素之和的操作。axis=1指定了计算行的和。因此,wwcnt_mat.sum(axis=1)的结果是一个列向量,其中每个元素是对应行的元素和。
- 
np.array(...):这是将计算得到的列向量转换为NumPy数组的操作。将稀疏矩阵的和转换为NumPy数组是为了更方便地进行后续的操作。
- 
.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 稀疏矩阵:
[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)
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号