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题|强对流降水临近预报,建模解析,小鹿学长带队指引全代码文章与思路

猜你喜欢

转载自blog.csdn.net/Tech_deer/article/details/133183607