DeepInf算法代码实现中的问题总结

@[TOC]DeepInf算法代码实现中的问题总结

data_loader.py文件中的代码

首先是InfluenceDataSet(Dataset)这个类:
这是对pytorch的DataSet这个类的继承
graphs表示多个ego network的邻接矩阵(源代码给出的是24428个)
identity返回一个对角线为1的方阵,这里主要的作用是为邻接矩阵加入self-loop

if model == "gat" or model == "pscn":
	self.graphs.astype(np.dtype('B'))将数组类型转换成bool类型

gcn这里是计算每个ego network邻接矩阵的归一化图拉普拉斯矩阵(这里的计算方式没有看太懂)

接下来的代码段就是加载其他的数据:
目前来看,influence_feature没有太大的用处
label主要标记节点是否被激活
vertex_id记录节点的编号

self.graphs, self.influence_features, self.labels, self.vertices = \
                    sklearn.utils.shuffle(
                        self.graphs, self.influence_features,
                        self.labels, self.vertices,
                        random_state=seed
                        #对数据进行洗牌,因为随机种子相同,所以按照相同方式打乱顺序

vertex_feature,节点的特征

preprocessing.scale(vertex_features)
对节点的特征数据进行标准化操作,默认的axis为0(也就是每列进行标准化计算,按照论文中的意思就是这样可以较好的获得全局信息),计算均值与标准差对其进行标准化,论文中的3.2Instance Normalization
max_vertex_idx:节点的最大id编号,可以用来记录节点的个数

embedding:节点的表示向量
这里计算节点的表示向量时,跳转到了utils.py这个文件中,调用了load_w2v_feature这个函数,这个函数的主要作用就是读取deepwalk.emb_64这个文件中的数据:
文件第一行有节点个数,特征维度这两个参数,所以需要拉出来单独处理;
接下来创建n个长度为d的数组,表示为feature,所有的值为0;
index是每行数据前面节点的索引,如果刚才创建的feature长度小于当前读取文件的节点个数(可能是文件标注错误),就需要append一个数组,用文件里面的值对其进行赋值,最后验证一下每个特征数组的长度是不是d维,不是的话就assert终止,返回得到的feature数组return np.array(feature, dtype=np.float32)

N表示的是ego network的个数

n_classes调用了get_num_class(self)函数来得到label的个数,我测试了一下,这里就只有两类,0和1,也就是感染或者未感染

class_weight表示类的权重是多少,这里用到了一个函数np.bincount(self.labels),这个函数的功能是计算计算当前索引值在labels中出现的次数。

get_feature_dimension这里有一个shape[-1],这个-1表示的就是最后一个维度的长度,比如说[[1,2],[1,3],[1,5]],这里的shape[-1]的值就是2了

接下来就是PatchySanDataSet(InfluenceDataSet):

**__init__函数:**

assert model == "pscn"只有pscn才会调用这个类,否则直接退出
super表示调用父类或者兄弟类中的方法,在这里是调用兄弟类中的init函数
n_vertices表示一个ego中的节点个数
receptive_fields表示感知野,这是pscn这个方法特有的一个东西,类似于图卷积操作时的卷积块的大小,这里表示节点邻居(一阶、二阶)的数量。
np.where()这个函数在这里返回的是非零元素的索引(不懂的可以看看这篇np.where()的解释
zip(*)类似于解压操作,edges最后就是多个列表组成的边列表。
这里使用igraph来建立图(这个确实比networkx这个包的运算快太多了,不得不承认C和C++的效率确实高呀。。。)
g.simplify()表示 removing self-loops and/or multiple edges.
sequence就是对邻居节点进行一个排序,也就是对感知野中的节点进行一个排序操作,论文中说bfs会有比较好的效果,所以这里使用bfs方法.
得到sequence以后,生成一个(sequence_size, neighbor_size)大小的零元素数组,然后用-1填充
neighborhoods = neighborhoods.reshape(sequence_size * neighbor_size)# (16,5)->(80,)

get_bfs_order(self, g, v, size, key)这个方法
首先这里调用了igraph中的bfs这个方法,
bfs(vid, mode=OUT)
Conducts a breadth first search (BFS) on the graph.
Parameters
vid: the root vertex ID
mode: either IN or OUT or ALL, ignored for undirected graphs.
Return Value a tuple with the following items:
• The vertex IDs visited (in order)
• The start indices of the layers in the vertex list
• The parent of every vertex in the BFS
这是开发文档中对于这个函数的解释。
也就是说,order是我们用bfs得到的节点ID序列,indices是每层在order中的起始下标
start:end表示当前层的节点,key[x][0]表示是否被激活,也就是influence_features[i][x][0]
bfsiter这个方法
bfsiter(vid, mode=OUT, advanced=False)
Constructs a breadth first search (BFS) iterator of the graph
Parameters
vid: the root vertex ID
mode: either IN or OUT or ALL.
advanced: if False, the iterator returns the next vertex in BFS order in every step. If True, the iterator returns the distance of the vertex from the root and the parent of the vertex in the BFS tree as well.
Return Value
the BFS iterator as an igraph.BFSIter object.

这个文件的代码到这里就基本完成
下面来说一下参数
embedding(279631,64)
graphs(24428,50,50)
influence_feature(24428,50,2)
24428个都是最后一个的第二位为1
labels(24428,)
节点的标签,对应label这个文件
receptive_fields(24428,80)
vertices(24428,50)
一个ego中的节点ID,对应着vertex_id这个文件
vertex_feature(279680,7)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值