Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于多变量预测 #29

Open
Noitolar opened this issue Jan 10, 2025 · 1 comment
Open

关于多变量预测 #29

Noitolar opened this issue Jan 10, 2025 · 1 comment

Comments

@Noitolar
Copy link

Noitolar commented Jan 10, 2025

老师您好!我正在尝试复现这项工作,并使其可以进行多变量预测,目前遇到了几个问题想向咨询一下。
我的基本思路是这样子的:在论文中,有以下片段
'''
Spatio-Temporal Data. A spatio-temporal data X is defined as a four-dimensional tensor with dimensions T × C × H × W , where T represents time steps, C represents the number of variables, H and W represent spatial grids. T , C, H , and W can vary across different spatio-temporal scenarios.
'''
我的理解是,其中THW三个维度可以表示“某一天内的一个特定的时空坐标”,而C则表示这个时空坐标内的变量,我下载了TDrive和Cellular数据集,发现在最开始并没有C这个维度,初始维度是NTHW,我理解为一共有N天,每天一个THW大小的“时空方块”。

之后,在DataLoader之中,unsqueeze()进去了一个维度,我认为这个为u都就是C,且C=1,也就是说这两个数据集都是单变量的预测。

再之后,维度C会在嵌入阶段被从1被卷积的out_channel转换成设定好的emb_dim,而T/H/W也会根据卷积核在对应维度上的大小切块,其数值会被处以卷积核大小并摊平。N则保持不变。
也就是说,此时的数据形式变成:N-(T’H‘W’)-C,T'=T/(patch_time), H'=H/(patch_space), W'=W/(patch_space), C=emb_dim

现在我的问题就是:
在数据集中,在DataLoader处理后,x与x_period的实际数据shape分别为:
842,1,12,16,20
842,3,12,16,20

其中x_period指的应该是“在x表示的那前一天的前三天的数据”,然而,其中的“三天”没有单开一个维度,而是“占用”了表示变量数量的维度C,这和原文中的描述有冲突。

论文代码我还在复现中,可能有很多地方没有理解对,因此想向您了解一下实际思路,谢谢老师!

@Noitolar
Copy link
Author

Noitolar commented Jan 13, 2025

更加具体地,问题主要在基于x_origin生成空间Prompt的部分:
out_s = self.st_prompt.spatial_prompt(x)
out_s, s_loss = out_s['out'], out_s['loss']
out_s = [self.spatial_patch(i).unsqueeze(dim=1).repeat(1,self.args.pred_len//self.args.t_patch_size,1,1).reshape(i.shape[0],-1,self.embed_dim).unsqueeze(dim=0) for i in out_s]
out_s = torch.mean(torch.cat(out_s,dim=0),dim=0)
其中:
self.st_prompt.spatial_prompt是基于一组不同大小卷积核的2D卷积,其输入向量维度是(n, history_time, h, w)其中,代表历史时间片数量的history_time作为卷积计算的in_channel。
在后续的self.spatial_patch()计算中,也是2D卷积计算,其in_channel,h,w三个输入数据维度中同样不包含“变量数”C维度。
而self.st_prompt.temporal_prompt使用了encoder的3D卷积,并将实际的“变量数”C维度(因为在文章的任务中都是单变量预测,这个维度并不存在于原始数据集中,通常是unsqueeze()进来的),将其作为卷积计算的in_channel。

因此,我想咨询一下老师:
@YuanYuan98
如果想将多变量数据处理能力添加到本模型中,应该如何进行处理呢?
1、将self.st_prompt.spatial_prompt中的2D卷积修改为3D卷积;
2、将“变量数”C维度和“历史时间片数”history_time维度合并:
2.1、合并为“C*his”;
2.2、合并为“his*C”;
3、以上处理方式都不合适,应该_________________________________________

我还在继续分析代码,希望能得到老师的解答,谢谢老师!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant