Tomorrowdawn / EvolveGCN

Semester project for social computing of USTC.
0 stars 3 forks source link

RoadMap #1

Open Tomorrowdawn opened 2 months ago

Tomorrowdawn commented 2 months ago

目前需要完成的代码部分:

  1. load_dataset(可以直接使用pd.read_json)
  2. generator. 需要完成similarity的定义, init内部的准备和实时生成. 应当将数据集改造成按照时间排序的(u, v, weight)格式, 然后根据时间窗口获得edge mask, 通过subgraph构造图.
  3. model. Model需要将EvolveGCN的分类头拆掉, 暴露出内部的hidden states, 然后加上AttentionCls(因为提案者不固定)
  4. Inspecter: 给定输入图, 检测该图的特定结构. 用于测试 & 报告. 需要统计尽可能多的指标.
RuibaiXu commented 2 months ago

关于GraphGenerator的预期行为和逻辑

class GraphGenerator: def init(self, proposals: pd.DataFrame, members: pd.DataFrame, votes: pd.DataFrame):

外部预期表现: 根据 输入参数 内含的 meeting 的数据(102-116的编号),将数据集划分为15个 meeting 所属,并根据每个 meeting对应的数据生成该 meeting 对应的 1个 DGLGraph; 对于 g_list = gen[start:end] 这样的访问, g_list 将会是一个元素为 DGLGraph 的 List

由于meeting_id是时序的,同一个meeting里面每个人表决的bill数量是不同的

对于每次会议的votes部分 新建一个列把meeting_id从bill_name种独立出来,然后每个meeting的数据生成一个子图,总共15个子图, 维护一个 num_bills X num_members的矩阵,初始化为-inf 对于每项 bill, 如果对应的member, 投票为 y +1, 为 n -1, 为 nv +0,

然后最后得到一个该次会议的投票矩阵,用这个矩阵去算这次会议的成员之间的 投票部分的相似度

m_copy = m
mask = m==-inf
m_copy[mask]=0
sum m_copy

然后关于meetingnum * billnum * member的大矩阵 meeting就按 102-116的编号 从0-14 bill 先按meeting_id 排序 再按字典序 全部转换成0开始的数字下标 member 直接按 id 字典序 没问题吧 全部转换成0开始的数字下标

除此以外,还要补充proposal部分的 edge_weight 信息

MottledPanpipe commented 2 months ago

网络中重要节点/关系Inspecter: relation.py class RelaAnaly(object): def init(self,G) 输入为DGL图,需要有边权值、节点相关信息 调用class内函数可返回各类度量指标,具体功能注释内已详细说明 已补充简单测试样例,可直接运行

MottledPanpipe commented 2 months ago

relation.txt 没权限,这么给下代码吧

Tomorrowdawn commented 2 months ago

关于GraphGenerator的预期行为和逻辑

class GraphGenerator: def init(self, proposals: pd.DataFrame, members: pd.DataFrame, votes: pd.DataFrame, start_time, window_size, window_step):

外部预期表现: 根据 start_time, window_size, window_step 三项参数,将数据集划分为若干窗口(窗口之间可能有部分区域重叠),并根据每个窗口内部的数据生成该窗口对应的 1个 DGLGraph; 对于 g_list = gen[start:end] 这样的访问, g_list 将会是一个元素为 DGLGraph 的 List

内部大致实现逻辑: 单个DGLGraph的生成策略可以分成 3个环节(步骤): 1.根据输入的参数,生成一个大的graph和权重表(这应该是一个[T,E]大小的tensor) 2.根据访问参数的对应窗口,调用mask和权重表得到该窗口对应的 subgraph 3.根据 threshold 确定subgraph哪些边被保留,权重低于 threshold 的边被删去,大于threshold的边及其权重被保留

大的graph和权重表实现: (待细化)

mask实现: (待细化) 根据窗口内部数据确定该窗口对应的 所有节点间的窗口内权重(边权重)

image

Tomorrowdawn commented 2 months ago

relation.txt 没权限,这么给下代码吧

请把邮箱发给我, 我给你拉进collaborator

RuibaiXu commented 2 months ago

关于GraphGenerator的预期行为和逻辑

class GraphGenerator: def init(self, proposals: pd.DataFrame, members: pd.DataFrame, votes: pd.DataFrame):

外部预期表现: 根据 输入参数 内含的 meeting 的数据(102-116的编号),将数据集划分为15个 meeting 所属,并根据每个 meeting对应的数据生成该 meeting 对应的 1个 DGLGraph; 对于 g_list = gen[start:end] 这样的访问, g_list 将会是一个元素为 DGLGraph 的 List

由于meeting_id是时序的,同一个meeting里面每个人表决的bill数量是不同的

对于每次会议的votes部分 新建一个列把meeting_id从bill_name种独立出来,然后每个meeting的数据生成一个子图,总共15个子图, 维护一个 num_bills X num_members的矩阵,初始化为-inf 对于每项 bill, 如果对应的member, 投票为 y +1, 为 n -1, 为 nv +0,

然后最后得到一个该次会议的投票矩阵,用这个矩阵去算这次会议的成员之间的 投票部分的相似度

m_copy = m
mask = m==-inf
m_copy[mask]=0
sum m_copy

然后关于meetingnum billnum member的大矩阵 meeting就按 102-116的编号 从0-14 bill 先按meeting_id 排序 再按字典序 全部转换成0开始的数字下标 member 直接按 id 字典序 没问题吧 全部转换成0开始的数字下标

除此以外,还要补充proposal部分的 edge_weight 信息

A3EC60C7FDC1DE3F1BDA3A14729A6479 generator需要提供一个get_num_nodes, 以及g.ndata['vote'],g.ndata['vote'] 指的是每个节点上的 vote 数据

subgraph 需要手动加 add_self_loop,并对边权重进行 edge norm

迭代需要返回subgraph_meeting 和 subgraph_bills,subgraph_bills是个字典,包含了sponsors和cosponsors