2024中国高校计算机大赛 — 大数据挑战赛-赛后复盘

一、赛题描述

基于气象大数据的自动站实况联合预测

风光清洁能源的管理与气象关系密不可分,因为风能和太阳能的发电效率直接依赖于气象条件。风力发电需要精确的风速和风向预测,而太阳能发电则依赖于日照时间和云层覆盖情况的准确预报。优质的气象预测能够帮助能源管理者优化发电计划,提升能源利用效率,降低运行成本,并保障电网稳定性。因此,基于高精度的气象预测进行科学管理是对实现风光清洁能源稳定供应和高效利用具有重要意义。
近年来,随着气象大数据的不断增长,人工智能和深度学习技术在气象预报领域的应用日益增多,一般通过训练模型识别气候模式和趋势,提高对复杂气候系统的理解和预测能力,已发展出高效的数据分析算法和领域大模型。大力发展新能源产业是国家实现能源安全和碳中和等战略目标的重要环节,而对于气象数据的预测具有重要的应用价值,在包括风电、光电在内的多种新能源产业中有着重要地位。本赛题旨在推动气象大数据的应用和气象预报技术的发展,要求参赛者利用提供的全球气象站点观测来构建预测模型,以提高对未来天气状况的预测精度。
温度和风速是关键的气象要素,在气象预报中对温度和风速的准确预测对建模天气状况以及气候变化有着深远的指导意义。在本次比赛中,参赛者需要根据所提供的全球气象自动站点的温度与风速的两年历史观测,结合毗邻站点的重要气象要素训练预测模型,实现未来24小时-72小时、1小时间隔的温度和风速预报。

二、竞赛数据和要求

1.训练数据

  • 全球站点气象要素:包含全球范围内个3850自动站,每个自动站提供两年的1小时间隔数据,包含温度与风速绝对值两类气象要素。
  • 协变量:毗邻站点的气象要素包含周围3*3数值预报网格中经纬两个方向矢量风速、温度、平均气压的信息,时间点间隔为3小时。

2.测试数据

  • 中国站点气象要素:包含中国境内120个自动站,每个自动站提供71个测试窗口的1小时间隔数据,包含温度与风速绝对值两类气象要素。
  • 协变量:毗邻站点的气象要素包含周围3*3数值预报网格中经纬两个方向矢量风速、温度、平均气压的信息,时间点间隔为3小时。

3.赛题说明

  • 初赛和复赛的训练集:因变量(全球站点温度和风速)使用17544个时间点,使用所有3850个观测站点,协变量(全球ERA5数据)使用全球数据的5848个时间点,使用3850个观测站点。
  • 初赛的测试要求:初赛测试集因变量(中国站点温度和风速)使用71个测试窗口,时间点间隔为1小时,使用前60个观测站点,协变量(中国ERA5数据)使用71个测试窗口,时间点间隔为3小时,使用前60个观测站点。赛题要求模型输入长度为7天(即168个时间点),预测未来1天(24个时间点)的温度和风速。
  • 复赛的测试要求:复赛初赛测试集因变量(中国站点温度和风速)使用71个测试窗口,时间点间隔为1小时,使用所有120个观测站点;协变量(中国ERA5数据)使用71个测试窗口,时间点间隔为3小时,使用所有120个观测站点。赛题要求模型输入长度为7天(即168个时间点),预测未来3天(72个时间点)的温度和风速。

三、数据结构

在下表中,初赛x=60,复赛x=120,时刻t不公开。

因变量包括两个不同含义的变量:

  • 两米高度的温度值(℃)
  • 两米高度的风速的绝对值(m/s)

协变量中包含以下四个不同含义的变量,在数据中按照以下顺序排列:

  • 十米高度的矢量纬向风速10U,正方向为东方(m/s)
  • 十米高度的矢量经向风速10V,正方向为北方(m/s)
  • 两米高度的温度值T2M(℃)
  • 均一海平面气压MSL(Pa)

 1. 训练数据格式

global/global_data.npy (5848, 4, 9, 3850) :协变量,用每个站点的地理位置寻找ERA5数据集中对应周围3*3格点的4个变量的值。第一维代表从时刻t开始每隔3小时共5848个时间点,最后一维代表3850个观测站点,第二维代表 ERA5的4个变量,第三维代表站点周围9个格点。9个格点的顺序为:左上、上、右上、左、中、右、左下、下、右下。

global/temp.npy (17544, 3850, 1):因变量,每个站点的温度观测值,其中第一维代表日从时刻t开始每隔1小时共17544个时间点,第二维代表3850个观测站点,第三维代表温度(℃)。

global/wind.npy (17544, 3850, 1):因变量,每个站点的风速绝对值观测值,其中第一维代表从时刻t开始每隔1小时共17544个时间点,第二维代表3850个观测站点,第三维代表风速(m/s)。

2. 测试数据格式

cenn/cenn_data.npy (71, 56, 4, 9, x):协变量,用每个站点的地理位置寻找ERA5数据集中对应周围3*3格点的4个变量的值。第一维代表71个样本窗口,第二维代表每个样本窗口中全部56个时间点,时间点间隔为3小时,最后一维代表x个观测站点,第二维代表 ERA5的4个变量,第三维代表站点周围9个格点。9个格点的顺序为:左上、上、右上、左、中、右、左下、下、右下。

cenn/temp_lookback.npy (71, 168, x, 1):因变量,每个站点的温度观测值,第一维代表71个样本窗口,第二维代表每个样本中长度为168个点的回溯窗口,时间点间隔为1小时,第三维代表x个观测站点,第四维代表温度(℃)。

cenn/wind_lookback.npy (71, 168, x, 1):因变量,每个站点的风速绝对值观测值,第一维代表71个样本窗口,第二维代表每个样本中长度为168个点的回溯窗口,时间点间隔为1小时,第三维代表x个观测站点,第四维代表风速(m/s)

四、模型建立

  本赛题Baseline 来源于《ITRANSFORMER: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING》,该文发表于2024ICLR会议上。文章提出了一种倒置Transformer,旨在解决长时间多变量时序预测问题。

 Transformer在自然语言处理和计算机视觉领域取得了巨大成功,并成为遵循缩放定律的基础模型。受许多领域成功应用的启发,具有强大的依赖关系提取能力和提取序列中多层次表示的能力的Transformer在时间序列预测中应用。然而,研究人员最近开始质疑基于Transformer预测模型的有效性,这些预测模型通常将同一时间步的多个变量嵌入到不可区分的通道中,并将注意力集中在这些时间标记上以捕获时间依赖性。考虑到时间点之间的数值关系,但语义关系较少,研究人员发现,简单的线性层,在性能和效率上都超过了复杂的Transformer。

 考虑到基于Transformer模型的争议,本文反思了为什么Transformer在时间序列预测中比线性模型表现更差,而在许多其他领域发挥主导作用。本文注意到现有的基于变压器的预测模型结构可能不适合多变量时间序列预测。如图1顶部所示,值得注意的是,由不一致的测量记录的基本上表示完全不同物理含义的同一时间步的点被嵌入到一个具有消除的多元相关性的标记中。而单个时间步形成的标记由于同时存在的时间点所表示的过度局部的接受域和时间不对齐的事件而难以显示有益信息

考虑到将同一时间步的多变量点作为(时间)标记嵌入的潜在风险,本文对时间序列采取了相反的看法,并将每个变量的整个时间序列独立嵌入到(变量)标记中,通过反转,嵌入令牌聚合了序列的全局表示,这些表示可以更加以变量为中心。同时,前馈网络可以熟练地学习任意回溯序列编码的不同变量的泛化表示,并解码以预测未来序列。基于上述动机,本文提出了iTransformer,贡献体现在三个方面:

 1.对Transformer的体系结构进行了反思,并指出标准Transformer组件在多变量时间序列上的提取能力尚未得到充分的开发。

2.本文提出了iTransformer,它将独立的时间序列作为标记,通过自关注来捕获多元相关性,并利用层归一化和前馈网络模块来学习更好的序列-全局表示,用于时间序列预测。

3.在实验上,iTransformer在真实数据集上具有较好的性能,并广泛地分析了倒置模块和架构选择,为未来基于Transformer的预测模型的改进指明了一个有希望的方向。

图1 Tranformer与iTransformer的对比
图2 iTransformer 结构图

 一句话总结:Transformer:一个变量与其他变量在不同时间的相关性,侧重时序关系;iTransformer:同一时间段一个变量与其他变量的相关性,侧重变量关系;

上代码:

4.1 iTransformer:

4.1.1 顶层

import torch
import torch.nn as nn
from layers.Transformer_EncDec import Encoder, EncoderLayer
from layers.SelfAttention_Family import FullAttention, AttentionLayer
from layers.Embed import DataEmbedding_invertedclass Model(nn.Module):"""Paper link: https://arxiv.org/abs/2310.06625"""def __init__(self, configs):super(Model, self).__init__()self.seq_len = configs.seq_lenself.pred_len = configs.pred_lenself.output_attention = configs.output_attention# Embeddingself.enc_embedding = DataEmbedding_inverted(configs.seq_len, configs.d_model, configs.dropout)# Encoderself.encoder = Encoder([EncoderLayer(AttentionLayer(FullAttention(False, attention_dropout=configs.dropout,output_attention=configs.output_attention), configs.d_model, configs.n_heads),configs.d_model,configs.d_ff,dropout=configs.dropout,activation=configs.activation) for l in range(configs.e_layers)],norm_layer=torch.nn.LayerNorm(configs.d_model))# Decoderself.projection = nn.Linear(configs.d_model, configs.pred_len, bias=True)def forecast(self, x_enc):# Normalization from Non-stationary Transformermeans = x_enc.mean(1, keepdim=True).detach()x_enc = x_enc - meansstdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5)x_enc /= stdev_, _, N = x_enc.shape# Embeddingenc_out = self.enc_embedding(x_enc, None)enc_out, attns = self.encoder(enc_out, attn_mask=None)dec_out = self.projection(enc_out).permute(0, 2, 1)[:, :, :N]# De-Normalization from Non-stationary Transformerdec_out = dec_out * (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))dec_out = dec_out + (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1))return dec_outdef forward(self, x_enc):dec_out = self.forecast(x_enc)return dec_out[:, -self.pred_len:, :]  # [B, L, C]

4.1.2 DataEmbedding_inverted

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.nn.utils import weight_norm
import mathclass DataEmbedding_inverted(nn.Module):def __init__(self, c_in, d_model, dropout=0.1):super(DataEmbedding_inverted, self).__init__()self.value_embedding = nn.Linear(c_in, d_model)self.dropout = nn.Dropout(p=dropout)def forward(self, x, x_mark):x = x.permute(0, 2, 1) # 此处即为转置所在 # x: [Batch Variate Time]if x_mark is None:x = self.value_embedding(x)else:x = self.value_embedding(torch.cat([x, x_mark.permute(0, 2, 1)], 1))# x: [Batch Variate d_model]return self.dropout(x)
# [batch_size,time,Variate]→[Batch Variate Time]→[batch_size,Variate,d_model]

其余注意力代码司空见惯不再赘述详细代码查看:https://github.com/thuml/iTransformer

里面全是好东西 哈哈哈

4.1.3 Baseline 数据流动

输入数据格式:输入数据[batch_size,time,Variate]
输出数据格式:输出数据[batch_size,pred_len,Variate]

模型内部输入查看:
1.模型输入 [batch_size,time,Variate]
2.输入数据归一化  mean→[batch_size,1,Variate];std→[batch_size,1,Variate] normed→[batch_size,time,Variate]
3.DataEmbedding_inverted :[batch_size,time,Variate]→[Batch Variate Time]→[batch_size,Variate,d_model]
4.encoder :
结构图: encode→EncoderLayer→AttentionLayer→FullAttention

由内到外
encoder输入x→[batch_size,Variate,d_model]  attn_mask  = None  
进入EncoderLayer的x→[batch_size,Variate,d_model] attn_mask = None
进入attention→AttentionLayer→FullAttention


映射前 x→[batch_size,Variate,d_model] 映射后 qkv [batch_size,Variate,d_model] view后[batch_size,Variate,n_head,d_model//n_head]

score→[batch_size,n_head,Variate,Variate]: torch.einsum("blhe,bshe->bhls", queries, keys)
scale→对最后一个维度[batch_size,n_head,Variate,Variate] →A
after_attention_output→[batch_size,Variate,n_head,d_model//n_head] torch.einsum("bhls,bshd->blhd", A, values)
out→[batch_size,Variate,d_model]


进入到EncoderLayer→residual→norm→2*conv1d(transpose(-1, 1) 通道数放在第一个位置 论文中时间上分别两次映射)→transpose(-1, 1)恢复数据形状
encoder 输出 →[batch_size,Variate,d_model]

4.2 Tricks 合集 (来源于各位大佬开源)

4.2.1 短时预测纠正长时间预测:多时间步增强 (可以更加细致)

4.2.2 损失函数设计

4.2.3 TTA

        测试时增强(Test-Time Augmentation,TTA)是一种在深度学习模型的测试阶段应用数据增强的技术手段。它是通过对测试样本进行多次随机变换或扰动,产生多个增强的样本,并使用这些样本进行预测的多数投票或平均来得出最终预测结果。

     本赛题:多个插值推理结果进行加权

4.2.4 特征工程

4.2.5 跳步采样

原始baseline 采样方式:滑窗采样 / 1h

跳步采样方式:滑窗采样/6h

4.2.6 多元注意力编码设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/20611.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

J.U.C - 深入解析ReentrantLock原理源码

文章目录 概述synchronized的缺陷1)synchronized不能控制阻塞,不能灵活控制锁的释放。2)在读多写少的场景中,效率低下。 独占锁ReentrantLock原理ReentrantLock概述AQS同步队列1. AQS实现原理2. 线程被唤醒时,AQS队列的…

基于Java+Springboot+Jpa+Mysql实现的在线网盘文件分享系统功能设计与实现二

一、前言介绍: 免费学习:猿来入此 1.1 项目摘要 在线网盘文件分享系统的课题背景主要源于现代社会对数字化信息存储和共享需求的日益增长。随着互联网的普及和技术的快速发展,人们越来越依赖电子设备来存储和传输各种类型的数据文件。然而…

DBSCAN聚类——基于密度的聚类算法(常用的聚类算法)

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)简称密度聚类或密度基础聚类,是一种基于密度的聚类算法,也是一种常用的无监督学习算法,特别适用于形状不规则的聚类和含有噪声的数据集。主要用于…

C++:指针和引用

指针的基础 数据在内存当中是怎么样被存储的 数据在内存中的存储方式取决于数据的类型和计算机的体系结构 基本数据类型 整数类型:整数在内存中以二进制补码的形式存储。对于有符号整数,最高位为符号位,0 表示正数,1 表示负数。…

LabVIEW多通道面阵烟雾透过率测试系统

LabVIEW面阵烟雾透过率测试系统通过高精度多通道数据采集和实时处理技术,能够实现对固体推进剂烟雾的透过率进行精确测量。系统利用了LabVIEW的图形化编程环境及其丰富的设备驱动接口,有效提升了测试的自动化程度和数据处理的实时性。 项目背景&#xf…

PDF电子发票信息转excel信息汇总

PDF电子发票信息提取,支持将pdf发票文件夹下的剩所有发票,转为excel格式的信息,对于发票量比较大,不好统计,需要一个一个去统计的情况,可节省2个点以上的时间,一次下载,终身有效。 使…

51c视觉~合集7

我自己的原文哦~ https://blog.51cto.com/whaosoft/11536996 #Arc2Face 身份条件化的人脸生成基础模型,高一致性高质量的AI人脸艺术风格照生成 将人脸特征映射到SD的CLIP的编码空间,通过微调SD实现文本编码器转换为专门为将ArcFace嵌入投影到CLIP潜在…

【西瓜书】机器学习的模型评估

来源于西瓜书、南瓜书等内容。 误差与偏差 学习器的实际预测输出与样本的真实输出之间的差异,称为”误差“(error)。学习器在训练集上的误差,称为”训练误差“(training error)或”经验误差“(…

Mac安装Docker Desktop搭建K8s集群,解决镜像无法下载的问题

使用 Docker Desktop可以在本地方便地搭建出 K8s集群,但开启 K8s集群后往往会遇到 K8s 镜像拉取失败问题,本文旨在解决该问题,从而在本地搭建 K8s 集群。 安装Docker Desktop 安装 Docker Desktop 建议安装历史版本, 不建议安装最新版。因为…

【Leecode】Leecode刷题之路第54天之旋转矩阵

题目出处 54-螺旋矩阵-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 54-旋转矩阵-官方解法 方法1:模拟 思路: 代码示例:(Java&#xff…

【YOLOv8】安卓端部署-1-项目介绍

【YOLOv8】安卓端部署-1-项目介绍 1 什么是YOLOv81.1 YOLOv8 的主要特性1.2 YOLOv8分割模型1.2.1 YOLACT实例分割算法之计算掩码1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系1.2.1.2 插值时的目标检测中提取的物体特征1.2.1.3 coefficients(系数)作用1.…

Cesium教程01_实现Cartesian3 三维坐标操作

在 Vue 项目中使用 Cesium 实现 Cartesian3 三维坐标操作 目录 一、引言二、Cesium 与 Cartesian3 的优势三、示例应用:在地图上标注和计算距离 1. 项目结构2. 主要代码实现3. 运行与效果 四、代码讲解与扩展 1. Cartesian3 的基础操作2. 距离计算与中点标注 五、…

Qt5-雷达项目

界面: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QTimer> #include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget(); pr…

A040-基于springboot的智能停车计费系统设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

数据结构初识

目录 1.初识 2.时间复杂度 常见时间复杂度举例&#xff1a; 3.空间复杂度 4.包装类&简单认识泛型 4.1装箱和拆箱 5.泛型 6.泛型的上界 7.泛型方法 8.List接口 1.初识 1.多画图 2.多思考 3.多写代码 4.多做题 牛客网-题库/在线编程/剑指offer 算法篇&#xff1a…

CUDA HOME does not exist, unable to compile CUDA op(s),已解决

有一个服务器上没有/usr/loacl/cuda&#xff0c;我也没有权限在这个目录装cuda&#xff0c;使用pip装完torch&#xff0c;llama factory使用时出现&#xff1a; 应该是本地没有nvcc相关执行文件。 先使用了&#xff1a; conda install -c cudatoolkit-dev不管用&#xff0c; …

杰发科技AC7801——ADC定时器触发的简单使用

使用场景 在需要多次采样结果的情况下&#xff0c;比如1s需要10w次的采样结果&#xff0c;可以考虑使用定时器触发采样&#xff0c;定时器设置多少的时间就会多久采样转换一次。 再加上使用dma&#xff0c;采样的结果直接放在dma的数组里面。 实现了自动采样&#xff0c;自动…

【有啥问啥】基于文本的图像检索(Text-Based Image Retrieval, TBIR)技术详解

基于文本的图像检索&#xff08;Text-Based Image Retrieval, TBIR&#xff09;技术详解 1. 背景理论知识 1.1 什么是基于文本的图像检索&#xff08;TBIR&#xff09;&#xff1f; 基于文本的图像检索&#xff08;Text-Based Image Retrieval&#xff0c;简称TBIR&#xff…

探索PyMuPDF:Python中的强大PDF处理库

文章目录 **探索PyMuPDF&#xff1a;Python中的强大PDF处理库**第一部分&#xff1a;背景第二部分&#xff1a;PyMuPDF是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;至少5个简单的库函数使用方法第五部分&#xff1a;结合至少3个场景…

HarmonyOS Next 关于页面渲染的性能优化方案

HarmonyOS Next 关于页面渲染的性能优化方案 HarmonyOS Next 应用开发中&#xff0c;用户的使用体验至关重要。其中用户启动APP到呈现页面主要包含三个步骤&#xff1a; 框架初始化页面加载布局渲染 从页面加载到布局渲染中&#xff0c;主要包含了6个环节&#xff1a; 执行页…