2023 “华为杯”研赛F题|强对流降水临近预报,建模解析,小鹿学长带队指引全代码文章与思路

在这里插入图片描述

问题重述

  1. 设计一个模型,利用双偏振雷达资料(Z_H、Z_DR和K_DP)提取微物理特征信息,进行强对流降水的临近预报。模型输入为前1小时的雷达资料,输出为后1小时的Z_H预报。

  2. 在问题1的基础上,设计模型缓解“回归到平均”问题,使预报结果更真实充足。

  3. 用Z_H和Z_DR设计模型估计降水量,不可用K_DP。

  4. 设计模型评估双偏振雷达资料在强对流降水临近预报中的贡献,优化数据融合策略。

问题一

对问题1建立双偏振雷达资料提取微物理特征并进行强对流降水临近预报的模型,可以考虑以下思路:

  1. 数据预处理:对双偏振雷达数据进行必要的过滤、校准等预处理,得到质量较好的Z_H、Z_DR、K_DP数据。

  2. 特征工程:提取描述强对流系统微物理特征的统计量,如各变量的平均值、标准差、极值等,以及变量之间的相关性等。将这些统计量作为模型输入特征。

  3. 建模:可以考虑使用卷积神经网络(CNN)或循环神经网络(RNN),输入为前1小时的雷达特征,输出为后1小时的Z_H预报。损失函数为预测Z_H与真实Z_H的误差。

  4. 训练:使用历史雷达数据及对应Z_H标签训练模型,使损失函数最小化。

  5. 测试:用独立测试集评估模型预报能力。

对应的数学表达式可表示为:

设训练数据集为 { ( X i , Y i ) } \{(X_i,Y_i)\} {(Xi,Yi)},其中 X i X_i Xi表示第 i i i个样本的输入特征, Y i Y_i Yi表示对应的Z_H标签。

模型可表示为:
Z H p r e d = f θ ( X ) Z_{H_{pred}} = f_{\theta}(X) ZHpred=fθ(X)

其中, f θ f_\theta fθ表示参数为 θ \theta θ的神经网络模型, Z H p r e d Z_{H_{pred}} ZHpred表示预测的Z_H。

训练目标是最小化损失函数:
L ( θ ) = 1 N ∑ i = 1 N l ( Z H p r e d , Y i ) L(\theta) = \frac{1}{N}\sum_{i=1}^{N}l(Z_{H_{pred}}, Y_i) L(θ)=N1i=1Nl(ZHpred,Yi)

其中, N N N为样本数量, l l l表示损失函数,常见的有MSE, MAE等。通过训练使 L ( θ ) L(\theta) L(θ)最小化以得到最优参数 θ ∗ \theta^* θ

模型效果通过测试集上计算评估指标进行评价,如RMSE, CORR等。

# 导入需要的库
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
#定义数据集类
class RadarModel(nn.Module):
    
    def __init__(self):
        super().__init__()
        
        # 输入通道数
        in_channels = 3 
        
        # 卷积层
        self.conv1 = nn.Conv2d(in_channels, 64, kernel_size=3, padding=1)
        self.bn1 = nn.BatchNorm2d(64)
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        self.bn2 = nn.BatchNorm2d(128)
        self.conv3 = nn.Conv2d(128, 256, kernel_size=3, padding=1)
        self.bn3 = nn.BatchNorm2d(256)

        # 全连接层
        self.fc1 = nn.Linear(256 * 4 * 4, 1024) 
        self.fc2 = nn.Linear(1024, 1)
        
    def forward(self, x):
        
        # 输入大小 (batch_size, 3, 32, 32)
        
        x = self.conv1(x)
        x = self.bn1(x)
        x = nn.functional.relu(x)
        

问题二

  1. 利用生成对抗网络(GAN)
  • 在模型中加入一个判别器D,其目的是区分真实的Z_H和生成的Z_H_pred。

  • 判别器的损失函数是鼓励其判断真实Z_H为正例,Z_H_pred为负例。

  • 在生成器损失函数中加入判别器的误分类损失,使生成的Z_H_pred更逼真,可以欺骗判别器。

  • 通过生成器和判别器的对抗训练,可以得到细节更丰富的Z_H_pred。

  1. 添加感知损失
  • 定义一个特征提取函数φ,输入是Z_H,输出是高维特征。

  • 在损失函数中添加真实和生成Z_H特征的差异,使其在特征级别更匹配。

  • 这可以增强细节的生成,因为高维特征包含了更丰富的细节信息。

  1. 辅助风场预测
  • 同时预测近期风场,作为生成器的辅助输入信息。

  • 风场提供了流动信息,可以帮助生成器合成更真实的Z_H分布。

  • 最终生成的Z_H既符合降水物理约束,也匹配准确的风场信息。

对应的数学表达方式:

原损失函数:

L M S E = 1 N ∑ i = 1 N ∣ Z H p r e d − Z H t r u e ∣ 2 L_{MSE}=\frac{1}{N}\sum_{i=1}^{N}\left | Z_{H_{pred}} - Z_{H_{true}} \right |^2 LMSE=N1i=1N ZHpredZHtrue 2

添加感知损失:

L p e r c e p t u a l = 1 N ∑ i = 1 N ∣ ϕ ( Z H p r e d ) − ϕ ( Z H t r u e ) ∣ 2 L_{perceptual} = \frac{1}{N}\sum_{i=1}^{N}\left | \phi(Z_{H_{pred}}) - \phi(Z_{H_{true}}) \right |^2 Lperceptual=N1i=1N ϕ(ZHpred)ϕ(ZHtrue) 2

其中 ϕ \phi ϕ表示高维特征提取函数。

则新的损失函数为:

L = L M S E + λ L p e r c e p t u a l L = L_{MSE} + \lambda L_{perceptual} L=LMSE+λLperceptual

添加判别器损失:

L D = − 1 N ∑ i = 1 N [ log ⁡ D ( Z H t r u e ) + log ⁡ ( 1 − D ( Z H p r e d ) ) ] L_{D} = -\frac{1}{N}\sum_{i=1}^{N}[\log D(Z_{H_{true}}) + \log(1-D(Z_{H_{pred}}))] LD=N1i=1N[logD(ZHtrue)+log(1D(ZHpred))]

最终损失函数:

L t o t a l = L + λ L D L_{total} = L + \lambda L_D Ltotal=L+λLD

import torch
import torch.nn as nn
from torch.nn import functional as F

# 生成器 
class Generator(nn.Module):

  def __init__(self, in_channels, out_channels):
    super().__init__()
    self.net = nn.Sequential(
        nn.Conv2d(in_channels, 64, kernel_size=3),
        nn.BatchNorm2d(64),
        nn.ReLU(),
        nn.Conv2d(64, 128, kernel_size=3),
        nn.BatchNorm2d(128),
        nn.ReLU(),
        nn.ConvTranspose2d(128, out_channels, kernel_size=4, stride=2, padding=1),
        nn.Tanh()
    )

  def forward(self, x):
    return self.net(x)

# 判别器  
class Discriminator(nn.Module):

  def __init__(self, in_channels):
    super().__init__()
    self.net = nn.Sequential(
        nn.Conv2d(in_channels, 64, kernel_size=4, stride=2, padding=1),
        nn.LeakyReLU(0.2),
        nn.Conv2d(64, 128, kernel_size=4, stride=2, padding=1),
        nn.BatchNorm2d(128),
        nn.LeakyReLU(0.2),
        nn.Conv2d(128, 1, kernel_size=4, stride=1, padding=0),
        nn.Sigmoid()
    )

  def forward(self, x):
    return self.net(x)

# 特征提取网络
class FeatureExtractor(nn.Module):

完整版的代码请关注我的专栏:
2023 “华为杯”研赛F题|强对流降水临近预报,建模解析,小鹿学长带队指引全代码文章与思路

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值