四个INOUT.h5文件
每一个h5文件有两个子集:
' date ':与**data**关联的时间段列表。
“data”:一个4D的形状张量(number_of_timeslots, 2,32,32),其中“data[i]”是一个时间块“date[i]”的形状三维张量(2,32,32),“data[i][0]”是一个“32x32”的流入矩阵,“data[i][1]”是一个“32x32”的流出矩阵。
文件名称:“BJ_Meteorology.h5’,它有以下四个子集:
*“日期”:一个时间段列表,它与以下类型的数据相关联。
*“温度”:连续值的列表,其中“i^{th}”值是“日期[i]”的分时段“温度”。
*“风速”:连续值的列表,其中“i^{th}”值是“日期[i]”处的“风速”。
*“天气”:2D矩阵,每一个都是一个热向量(“dim=17”),显示以下天气类型之一:
Sunny = 0,
Cloudy = 1,
Overcast = 2,
Rainy = 3,
Sprinkle = 4,
ModerateRain = 5,
HeavyRain = 6,
Rainstorm = 7,
Thunderstorm = 8,
FreezingRain = 9,
Snowy = 10,
LightSnow = 11,
ModerateSnow = 12,
HeavySnow = 13,
Foggy = 14,
Sandstorm = 15,
Dusty = 16,
文件名称:“BJ_Holiday.txt ',其中包括一个列表的假期(和相邻的周末)北京。
每行数据格式为[yyyy][mm][dd]。例如,“20150601”是“2015年6月1日”
最原始的数据集已经将整个北京市划分成了一个32×32 的小区域,并且也已经统计出了每个小区域每隔半小时(一个时间片)的进出流量,即已经表示成了[2,32,32] [2,32,32][2,32,32]的格式。同时论文在实现时候,采用的是用当前时刻的前3个时间片来模拟邻近性(Closeness),用当前时刻前一天的相同时刻的一个时间片来模拟周期性(Period),用当前时刻前一周的相同时刻的一个时间片来模拟趋势性(Trend),即代码中的len_closeness=3,len_period=1,len_trend=1作为三个超参数。也就是用这三个部分来预测ti时刻的流量
论文中还引入了其它额外的气象等数据,分别是:time_feature,holiday_feature,meteorol_feature
最终将这三个部分拼成一个向量meta_feature
对于每个时间片来说:
time_feature有8维度,前面7个维度为one-hot形式,最后以为表示当天是否为工作日;例如图p0069中的含义为,该时间片对应为星期四且为工作日。
holiday_feature有1个维度,0表示时间片所在的当天为工作日,1表示假期。
meteorol_feature有19个维度,前面17个也为one-hot形式,表示天气类型中的一种,后面两个维度分别表示风速和温度
最后将这个三个向量拼接成了一个28维度的向量。也就是说,现在我们已经知道了整个网络输入数据的形式了。对于数据预处理的这部分,直接调用下面函数即可获取:
X_train, Y_train, X_test, Y_test, mmn, external_dim, timestamp_train, timestamp_test =
load_data(len_closeness=3, len_period=1, len_trend=1, len_test=4*7* 48)
网络构建
首先定义了网络的输入部分,笔者将其分成了5个placeholder
,其含义如变量名;然后接着就是定义网络的部分,即Closeness,Period,Trend这三个部分和天气模块;最后就是评估和训练模块。分别在下面这几个方法中被定义:
def _build_placeholder(self):
def _build_stresnet(self, ):
def evaluate(self, mmn, x, y):
def train(self, x, y):
运行结果