DCRNN代码解析
数据处理
时序数据(以METR-LA数据集为例)
读取metr-la.h文件,这个文件的格式为(num_samples,num_nodes),num_samples是时间步数共34272维,每五分钟采样;num_nodes为传感器数目,为207
划分训练集、验证集和测试集
每个集合中,划分模型用的监督样本(x,y),长度都是12
于是现在训练样本有34272-11-12=34249(输入和输出窗口大小都为12,滑动步长为1)
现在x和y的shape为(34292,12,207)
在代码中,实际还插入了一维,作为特征维(data = np.expand_dims(df.values, axis=-1))
这个特征维的第一维,也就是默认有的就是速度(这个是根据论文任务得知的)
现在x和yshape为(34292,12,207,1)
特征的可选项有add_time_in_day,add_day_in_week
对于add_time_in_day,数据是
06:00 → 0.25,18:00 → 0.75,范围[0,1),在一天的哪个时刻,是1维
对于add_day_in_week,数据是
Monday → [1,0,0,0,0,0,0],onehot向量,是7维
若add_time_in_day=True并且add_day_in_week=True,那么x和y的shape(34292,12,207,9)
对于y,似乎不需要特征维,只需要监督向量,这里读到后面的代码再说
然后根据这个形状,训练集70,验证集10,测试集20,那么x分别是:
train(23982,207,9)vali(3426,207,9) test(6852,12,207,9)
三个集合分别保存到.npy文件中
图数据
输入:distance_df ([from,to,distance]),sensor_id,normalized_k
用传感器数据构建邻接矩阵adj_mx,边的权重由传感器之间的距离得出

有参数normalized_k作为稀疏参数,小于这个值的边的权重都归零
最终[sensor_ids, sensor_id_to_ind(传感器与编号的对应关系), adj_mx]保存为pkl文件
区分一下sensor_id,index和id:

模型
加载预训练模型
准备数据
param x: shape (batch_size, seq_len, num_sensor, input_dim)
:param y: shape (batch_size, horizon, num_sensor, input_dim)
returns x shape (seq_len, batch_size, num_sensor*input_dim)
y shape (horizon, batch_size, num_sensor*output_dim)
在这里y的out_dim去掉了多余的特征维
加载预训练模型
损失计算:先把预测与真实值逆归一化,去掉缺失值(y_true=0)后,计算mae损失
DCRNNModel
主架构是编码器解码器架构
编码器和解码器都是n层图扩散卷积(DCRNN_Cell)
DCRNN_Cell
基于图卷积的GRU,可选用图卷积计算门控:



