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

news2024/11/24 9:51:39

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.构建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.输入输出设计
输入:雷达反射率 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. 基准模型

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)

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

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

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

相关文章

【OpenSSL】OpenSSL实现Base64

Base 64概述和应用场景 概述 Base64就是将二进制数据转换为字符串的一种算法。 应用场景 邮件编码xml或则json存储二进制内容网页传递数据URL数据库中以文本形式存放二进制数据可打印的比特币钱包地址base58Check(hash校验)网页上可以将图片直接使用Base64表达公私密钥的文…

Python 用列表实现模拟手机通讯录(简易版)

"""列表实现好友管理系统知识点:1、列表存储信息2、列表增删改查3、嵌套循环4、字符串分割和拼接(重点)5、列表索引"""# 暂存好友信息(程序结束数据删除) friend_info list()input_buf…

opencv形态学-膨胀

opencv形态学-膨胀 膨胀就是取每一个位置结构元领域内最大值作为该位置的输出灰度值; 膨胀是取邻域内最大值,那么显然膨胀后图像整体亮度会比原先要高,图像中亮的物体尺寸会变大,相反暗的尺寸会减小,甚至是消失 结构元…

流程图在线制作:5款专业流程图制作网站,无需下载,高效立现!

流程图,是特定的图形符号加上说明,表示算法的图,是一种可视化工具。近年来流程图逐渐在工作、教育、项目管理等诸多领域大放异彩,市面上也流行着许多流程图制作软件,考虑到许多软件下载流程繁琐、并且还有下载盗版的风…

pytorch学习笔记——BCE与CE

BCELoss的话只需要网络输出一个通道,CE Loss(Cross Entropy Loss)需要输出n_class个通道。 对于二分类任务可以使用CE Loss输出两个通道,也可以使用BCE Loss输出一个通道。 https://www.jianshu.com/p/5b01705368bb https://zhuanlan.zhihu.com/p/372628…

客户端负载均衡_负载均衡策略

以前的Ribbon有多种负载均衡策略 RandomRule - 随性而为 解释: 随机 RoundRobinRule - 按部就班 解释: 轮询 RetryRule - 卷土重来 解释: 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试。 Weigh…

Learn Prompt- Midjourney案例:网页设计

快速开始​ 用 “ web design for...” 或 “ modern web design for..” 来快速开始你的提示。 web design for a generic SaaS startup --ar 3:2否定提示-no​ 使用--no告诉 Midjourney 你不想要什么。Midjourney 的默认风格倾向于现实和详细。但这可能不适用于所有品牌。…

HEC-RAS 1D/2D水动力与水环境模拟从小白到精通

专题一 水动力模型基础 1.水动力模型的本质 2.水动力模型的基本方程与适用范围 3.模型建模要点 4.注意事项与建模经验 专题二 恒定流模型(1D/2D) 1.恒定流及其适用范围 2.水面线分析及其数据要求 3.曼宁公式与恒定流,后处理 4.HEC-RA的水工建筑物&#xff…

ADC数模转化器

简介 • ADC ( Analog-Digital Converter )模拟 - 数字转换器 • ADC 可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 • 12 位逐次逼近型 ADC , 1us 转换时间 (12位:分辨率…

vue里使用elementui的级联选择器el-cascader进行懒加载的怎么实现数据回显?

需要实现的懒加载回显效果 比如:后端返回数据 广东省/广州市/天河区 :440000000000/440100000000/440106000000,需要我们自动展开到天河区的下一级,效果如下 代码实现 我的实现思路就是拿到 440000000000/440100000000/44010600…

YOLOv5如何训练自己的数据集(生活垃圾数据集为例)

文章目录 前言1、数据标注说明2、定义自己模型文件3、训练模型参考文献 前言 本文主要介绍如何利用YOLOv5训练自己的数据集 1、数据标注说明 以生活垃圾数据集为例子 生活垃圾数据集(YOLO版)点击这里直接下载本文生活垃圾数据集 生活垃圾数据集组成&…

软件测试/测试开发丨利用人工智能ChatGPT自动生成PPT

点此获取更多相关资料 简介 PPT 已经渗透到我们的日常工作中,无论是工作汇报、商务报告、学术演讲、培训材料都常常要求编写一个正式的 PPT,协助完成一次汇报或一次演讲。PPT相比于传统文本的就是有布局、图片、动画效果等,可以给到观众更好…

VSCode 和 CLion

文章目录 一、VSCode1、文档2、插件3、智能编写4、VSCode 与 C(1)安装(2)调试(a)使用 CMake 进行跨平台编译与调试(b)launch.json(c)传参 (3&…

mac有必要用清理软件吗

随着科技的不断进步,我们的计算机硬盘容量也在不断增长。即使是ARM架构的处理器,也可以通过高效的文件系统和技术来充分利用磁盘空间。然而,对于使用Mac OS系统的用户来说,仅仅使用一个盘来存储所有文件可能会导致一些残留文件的问…

深入了解 Docker 容器操作命令:掌握容器化管理的关键

Docker 已经成为现代应用程序开发和部署的行业标准。它借助容器化技术,提供了一种轻量、可移植和可扩展的方式来构建、发布和运行应用程序。然而,最近我在工作中发现,一些家人们对 Docker 容器的操作命令还不太熟悉。因此,本文旨在…

C++之std::function类模板定义函数对象应用总结(二百三十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

PWN基础:从源文件到可执行文件

目录 编译原理 GCC编译过程 Preprocess阶段 File命令 Compile阶段 Assemble阶段 Link阶段 高级语言编写的程序想在操作系统运行,需要被翻译为机器指令,在按照可执行目标文件格式打包并以二进制形式存储在文件中 编译原理 编译器作用:…

php实现分页功能跳转和ajax方式实现

实现效果 准备工作 创建数据表和导入测试数据 CREATE TABLE users ( id int(10) unsigned NOT NULL AUTO_INCREMENT, username varchar(30) DEFAULT NULL COMMENT 账号, email varchar(30) DEFAULT NULL COMMENT 密码, PRIMARY KEY (id) ) ENGINEMyISAM AUTO_INCREM…

Docker 容器编排

是什么 Docker-Compose是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。 Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个…

基于微信小程序的医院门诊体检预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…