• 2023 “华为杯” 中国研究生数学建模竞赛(F题)深度剖析|数学建模完整代码+建模过程全解全析


    F题代码+思路

    当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2021年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。
    让我们一起看看研赛的F题呀!全文都已放出哦~

    问题重述

    1.如何利用双偏振雷达的数据有效改进强对流降水的短临预报?要求建立可以提取双偏振雷达数据中的微物理特征信息的模型,进行0-1小时的降水预报。
    2.当前一些数据驱动模型存在“回归到均值”的问题,生成的强降水预报往往过于模糊。要求在问题1的基础上,设计模型以生成更真实、更丰富细节的降水预报结果。
    3.要求利用雷达反射率Z_H和差分反射率Z_DR,建立模型进行定量降水估计,即利用这两个变量预测降水量。
    4.要求设计模型来评估双偏振雷达数据对强降水预报的贡献,并通过优化数据融合策略,与其他数据源集成,以提高强降水检测与预报的准确性。
    在这里插入图片描述

    问题一

    1.输入输出设计
    输入: X = X t − 9 , . . . , X t X=Xt−9 ,...,Xt X=Xt9,...,Xt
    其中 X t ∈ R H × W × C Xt ∈RH×W×C XtRH×W×C表示时刻t的雷达图像,H、W为高度和宽度,C为通道数。
    输出: Y = Y t + 1 , . . . , Y t + 10 Y^=Y^t+1,...,Y^t+10 Y=Yt+1,...,Yt+10
    其中 Y t ∈ R H × W Y^t ∈RH×W YtRH×W表示时刻t的预测 Z H Z_H ZH
    2.卷积特征提取
    使用卷积层提取输入的局部特征: F = f ( [ X ; Θ f ] F=f([X;Θf ] F=f([X;Θf])
    其中f表示卷积运算, Θ f \Theta_f Θf为卷积层参数。
    3.卷积LSTM建模时空相关性

    4.转置卷积上采样
    Y = f T ( [ H ; Θ T ] ) Y^=fT([H;ΘT ]) Y=fT([H;ΘT])
    其中 f T f^T fT表示转置卷积,H为卷积LSTM输出特征, Θ T \Theta_{T} ΘT为转置卷积参数。
    5.损失函数设计

    代码:

    import tensorflow as tf
    from tensorflow.keras.layers import ConvLSTM2D, Conv2D, Conv2DTranspose
    
    # 输入层
    inputs = tf.keras.Input(shape=(10, 128, 128, 3)) 
    
    # 卷积层提取特征
    x = Conv2D(filters=64, kernel_size=3, activation='relu')(inputs)
    x = MaxPooling2D((2, 2))(x)
    from tensorflow.keras.layers import ConvLSTM2D, Conv2D, Conv2DTranspose, Attention
    from tensorflow.keras import Model
    
    inputs = Input(shape=(10, 128, 128, 3))
    
    # 第一层卷积
    x = Conv2D(64, 3, padding='same', activation='relu')(inputs)  
    
    # 第二层卷积
    x = Conv2D(64, 3, padding='same', activation='relu')(x)
    
    # 第一层卷积LSTM 
    x = ConvLSTM2D(64, 3, padding='same', return_sequences=True)(x)
    
    # 第二层卷积LSTM
    x = ConvLSTM2D(64, 3, padding='same', return_sequences=True)(x)
    
    # 注意力机制
    
    # 利用一个Dense层学习注意力权重
    attn_layer = Dense(units=64, activation='tanh')(x)  
    
    # 计算注意力权重
    attn_weights = Dense(units=10, activation='softmax')(attn_layer)
    
    # 尺度注意力权重
    attn_weights = Reshape((10, 1, 1, 1))(attn_weights) 
    
    # 计算注意力输出
    attn_output = Multiply()([x, attn_weights])
    
    # 转置卷积上采样 
    
    # 第1层转置卷积
    x = Conv2DTranspose(filters=64, kernel_size=3, strides=2, padding='same')(attn_output)
    
    # 第2层转置卷积 
    x = Conv2DTranspose(filters=32, kernel_size=3, strides=2, padding='same')(x)  
    
    # 第3层转置卷积
    x = Conv2DTranspose(filters=1, kernel_size=3, strides=2, padding='same')(x)
    
    # 构建Model
    model = Model(inputs, x)
    
    # 编译与训练
    model.compile(loss='mae', optimizer='adam')
    model.fit(X_train, y_train, epochs=10) 
    
    # 预测
    y_pred = model.predict(X_test)
    
    # 编译与训练
    model.compile(loss='mae', optimizer='adam') 
    model.fit(X_train, y_train, epochs=10)
    
    # 预测
    y_pred = model.predict(X_test)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    在这里插入图片描述

    问题二

    1.构建multi-scale的预报模型
    在卷积LSTM模型中,同时预测不同尺度的Z_H:·低分辨率Z_H:反映大尺度的降水格局
    ·高分辨率Z_H:反映小尺度的降水细节2.加入先验约束
    根据气象知识,加入对强降水的先验约束,例如:·强降水具有聚集性
    ·细胞运动遵循流场
    ·生命期分不同发展阶段
    可以将这些先验知识以约束条件加入模型。
    3.模型集成
    使用多个不同的模型,对其各自的预报结果进行融合。
    4.数据增强
    通过旋转、翻转、添加噪声等来增强训练数据,提高模型的鲁棒性。
    5.模型和训练策略优化
    改进模型结构,调整损失函数,优化训练超参等。

    from tensorflow.keras.layers import Input, ConvLSTM2D, UpSampling2D
    from tensorflow.keras.models import Model
    
    inputs = Input(shape=(10, 128, 128, 1))
    
    # 低分辨率预测分支
    
    x1 = ConvLSTM2D(filters=32, kernel_size=3, padding='same', return_sequences=True)(inputs)
    x1 = BatchNormalization()(x1) # 加入BN层
    x1 = ConvLSTM2D(filters=32, kernel_size=3, padding='same')(x1)  
    x1 = Conv2D(filters=1, kernel_size=1, padding='same')(x1)
    
    # 高分辨率预测分支 
    
    x2 = ConvLSTM2D(filters=64, kernel_size=3, padding='same', return_sequences=True)(inputs)
    x2 = BatchNormalization()(x2) 
    x2 = ConvLSTM2D(filters=64, kernel_size=3, padding='same')(x2)
    x2 = UpSampling2D(size=(2,2))(x2) # 双线性插值上采样 
    x2 = Conv2D(filters=1, kernel_size=1, padding='same')(x2)
    
    # 合并不同尺度
    
    merged = Add()([x1, x2])  
    merged = BatchNormalization()(merged) # BN层融合不同分支
    
    # 编译与训练
    model.compile(loss='mse', optimizer='adam') 
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在这里插入图片描述

    问题三

    思路:
    1.输入输出设计
    输入:雷达反射率 Z H Z_H ZH 和 差分反射率 Z D R Z_DR ZDR输出:预测降水量R
    2.建立Z-R关系
    R = a ∗ Z H b ∗ Z D R c R = a * Z_H^b * Z_DR^c R=aZHbZDRc其中a,b,c为经验参数。
    将问题转换为确定这三个参数。
    3.参数确定
    收集观测数据:从多个地区和多种降水类型收集大量三元组数据(Z_H, Z_DR, R)。
    数据预处理:去除误差较大的样本,检查数据质量。标准化Z_H和Z_DR。
    拟合参数:构建损失函数 L = ∑ i = 1 N ( R ^ i − R i ) 2 L = ∑ i = 1 N ( R i − R i ) 2 \mathcal L=\sum_{i=1}^N(\hat R_i-R_i)^2L=∑i=1N (R^i −Ri )2 L=i=1N(R^iRi)2L=i=1N(RiRi)2,其中 R ^ i = a Z H i b Z D R i c R i = a Z H i b Z D R i c \hat R_i=aZ_{H_i}^bZ_{DR_i}^cR^i =aZHi b ZDRi c R^i=aZHibZDRicRi=aZHibZDRic 。使用梯度下降算法学习参数a,b,c以最小化损失函数。
    4.模型选择:比较不同的幂指数组合,选择拟合效果最佳的一组参数。模型检验
    收集独立测试数据:保证训练数据和测试数据的地区和降水类型有所不同。
    测试集预测:将测试数据Z_H和Z_DR代入学到的Z-R关系,生成降水预测 R ^ \hat R R^
    评估指标:计算RMSE、MAE等检验预测效果。绘制散点图比较 R ^ \hat R R^和R。
    模型改进:比较不同区域和降水类型的预测效果,分析原因,进一步优化模型。
    极端情况验证:使用极端降雨情况下的数据验证模型的适用范围和稳健性。
    在这里插入图片描述

    代码:

    import numpy as np
    from sklearn.metrics import mean_squared_error
    
    # 收集并预处理观测数据
    zh = [12, 15, 13, ...] # 反射率因子Z_H
    zdr = [0.8, 1.2, 0.7, ...] # 差分反射率Z_DR
    r = [10, 25, 12, ...] # 实测降水量R
    
    # 定义Z-R关系,初始化参数  
    def zr_relation(zh, zdr, a, b, c):
        return a * zh**b * zdr**c
    
    
    # 使用最小二乘法拟合参数
    def train(zh, zdr, r, a, b, c):
        preds = [zr_relation(z, zd, a, b, c) for z,zd in zip(zh, zdr)]  
        loss = mean_squared_error(r, preds)
        # 参数初始化
    a, b, c = 0.01, 1.4, 0.9  
    
    # 梯度下降函数
    def grad_descent(zh, zdr, r, a, b, c, lr=0.01, epochs=100):
    
        for i in range(epochs):
            
            # 计算损失函数  
            preds = [zr_relation(z, zd, a, b, c) for z, zd in zip(zh, zdr)]
            loss = np.mean((preds - r)**2)
            
            # 计算梯度
            a_grad = 2 * np.mean((preds - r) * preds * (a ** (b-1)) * (c ** (c-1)))
            b_grad = 2 * np.mean((preds - r) * preds * (np.log(z) * a ** b * (c ** c)))
            c_grad = 2 * np.mean((preds - r) * preds * (np.log(zd) * a ** b * (c ** (c-1))))
            
            # 参数更新  
            a = a - lr * a_grad
            b = b - lr * b_grad 
            c = c - lr * c_grad
            
        return a, b, c
        
    # 拟合参数
    a, b, c = grad_descent(zh, zdr, r, a, b, c)
    
    # 模型评估
    zh_test, zdr_test, r_test = ... # 测试数据
    preds_test = [zr_relation(z, zd, a, b, c) for z, zd in 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    在这里插入图片描述

    梯度下降函数

    问题四

    1. 基准模型

    Y ^ 0 = f ( X 0 ; θ 0 ) \hat{Y}_0 = f(X_0; \theta_0) Y^0=f(X0;θ0)

    其中 X 0 X_0 X0为单偏振Z_H, θ 0 \theta_0 θ0为模型参数, Y ^ 0 \hat{Y}_0 Y^0为预测。

    1. 评估模型

    Y ^ 1 = f ( X 1 ; θ 1 ) \hat{Y}_1 = f(X_1; \theta_1) Y^1=f(X1;θ1)

    其中 X 1 X_1 X1包含Z_H、Z_DR、K_DP, θ 1 \theta_1 θ1为参数, Y ^ 1 \hat{Y}_1 Y^1为预测。

    1. 模型评估

    R M S E 0 = 1 n ∑ i = 1 n ( Y i − Y ^ 0 i ) 2 RMSE_0 = \frac{1}{n}\sum_{i=1}^{n}(Y_i - \hat{Y}_{0i})^2 RMSE0=n1i=1n(YiY^0i)2

    R M S E 1 = 1 n ∑ i = 1 n ( Y i − Y ^ 1 i ) 2 RMSE_1 = \frac{1}{n}\sum_{i=1}^{n}(Y_i - \hat{Y}_{1i})^2 RMSE1=n1i=1n(YiY^1i)2

    比较 R M S E 0 RMSE_0 RMSE0 R M S E 1 RMSE_1 RMSE1

    1. 注意力机制融合

    Y ^ = ∑ i = 1 m α i f i ( X i ; θ i ) \hat{Y} = \sum_{i=1}^{m}\alpha_i f_i(X_i; \theta_i) Y^=i=1mαifi(Xi;θi)

    学习权重 α i \alpha_i αi,自适应地融合不同数据源 X i X_i Xi的预测。

    import tensorflow as tf
    from tensorflow.keras import layers, models
    
    # 1. 构建基准模型 
    inputs_zh = layers.Input(shape=(10, 64, 64, 1))
    conv_zh = layers.Conv2D(32, 3)(inputs_zh)
    lstm_zh = layers.LSTM(32)(conv_zh)
    outputs_zh = layers.Dense(64*64)(lstm_zh)
    base_model = models.Model(inputs_zh, outputs_zh)
    
    # 2. 构建增强模型
    inputs_dual_pol = layers.Input(shape=(10, 64, 64, 3))  
    conv_dual_pol = layers.Conv2D(32, 3)(inputs_dual_pol)
    lstm_dual_pol = layers.LSTM(32)(conv_dual_pol)
    outputs_dual_pol = layers.Dense(64*64)(lstm_dual_pol)
    enhanced_model = models.Model(inputs_dual_pol, outputs_dual_pol)
    
    # 3. 模型训练
    # 载入数据
    X_train, X_test = load_data()  
    
    # 数据预处理
    X_train = normalize(X_train)
    X_test = normalize(X_test)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    更多完整版看这里:
    (5 封私信 / 2 条消息) 如何评价2023数学建模研赛F题? - csdn

  • 相关阅读:
    Patroni源码修改一:使用Python3
    Android Studio实现内容丰富的安卓养老平台
    排序算法-----冒泡排序与选择排序
    【嵌入式面试题】常见面试题梳理三
    m基于自适应遗传优化的IEEE-6建设费用和网络损耗费用最小化电网规划算法matlab仿真
    代码随想录——求根节点到叶节点数字之和
    Leecode刷题 1342. 将数字变成 0 的操作次数
    nn.Sequential与tensorflow的Sequential对比
    解决Spring Cloud Config API 暴露密码的问题
    jsp人事考勤管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 原文地址:https://blog.csdn.net/qq_25834913/article/details/133236337