Concurso chino de modelado matemático para graduados "Copa Huawei" 2023 (Pregunta F) Análisis en profundidad | Código completo de modelado matemático + Análisis completo del proceso de modelado

Código de pregunta F + ideas

¿Alguna vez se ha sentido perdido al enfrentarse a problemas complejos de modelado matemático? Como ganador del Premio O del Concurso de modelado matemático para estudiantes universitarios estadounidenses de 2021, le proporciono un conjunto de excelentes ideas de resolución de problemas que le permitirán abordar fácilmente diversos problemas.
¡Echemos un vistazo a la pregunta F del concurso de investigación! El texto completo ha sido publicado ~

reformulación del problema

1. ¿Cómo utilizar los datos del radar de doble polarización para mejorar eficazmente el pronóstico a corto plazo de precipitaciones convectivas severas? Es necesario establecer un modelo que pueda extraer información de características microfísicas de los datos del radar de doble polarización para realizar un pronóstico de precipitación de 0 a 1 hora. .
2. Algunos modelos actuales basados ​​en datos tienen el problema de "volver a la media" y los pronósticos de precipitaciones intensas generados suelen ser demasiado vagos. Se requiere diseñar un modelo basado en la pregunta 1 para generar resultados de pronóstico de precipitación más realistas y detallados.
3. Se requiere utilizar la reflectividad del radar Z_H y la reflectividad diferencial Z_DR para establecer un modelo para la estimación cuantitativa de la precipitación, es decir, utilizar estas dos variables para predecir la precipitación.
4. Es necesario diseñar un modelo para evaluar la contribución de los datos del radar de doble polarización al pronóstico de precipitaciones intensas e integrarlo con otras fuentes de datos optimizando la estrategia de fusión de datos para mejorar la precisión de la detección y el pronóstico de precipitaciones intensas.
Insertar descripción de la imagen aquí

Pregunta uno

1. Diseño de entradas y salidas
Entrada: X = X t − 9 , . . . , X t X=Xt−9 ,...,XtX=xt9 ,... ,Xt
dondeX t ∈ RH × W × CxtRH _×W.×C representa la imagen del radar en el momento t, H y W son la altura y el ancho, y C es el número de canales.
Salida:Y = Y t + 1 , . . . , Y t + 10 Y^=Y^t+1,...,Y^t+10Y=t+1 ,... ,Yt+10
de los cualesY t ∈ RH × WY^t ∈RH×WYtRH _×W representa la predicciónZH Z_Hzh.
2. Extracción de características de convolución
Utilice la capa de convolución para extraer características locales de la entrada: F = f ( [ X ; Θ f ] F=f([X; Θf ]F=f ([ X ;Θ f ] )
donde f representa la operación de convolución,Θ f \Theta_fThfson los parámetros de la capa convolucional.
3. Correlación espaciotemporal del modelado convolucional LSTM

4. Transponer muestreo ascendente de convolución
Y = f T ( [ H ; Θ T ] ) Y^=fT ([H; ΘT ])Y= fT([H;Θ T ])
dondef T f^TFT representa la convolución transpuesta, H es la característica de salida de la convolución LSTM,Θ T \Theta_{T}Thtes el parámetro de convolución transpuesto.
5.Diseño de función de pérdida

Código:

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)

Insertar descripción de la imagen aquí

Pregunta 2

1. Construya un modelo de pronóstico de múltiples escalas.
En el modelo LSTM convolucional, prediga Z_H en diferentes escalas al mismo tiempo: · Z_H de baja resolución: refleja el patrón de precipitación a gran escala · Z_H de alta resolución: refleja la precipitación a pequeña
escala detalles 2. Agregar restricciones a priori:
según el conocimiento meteorológico, agregue restricciones previas a las precipitaciones intensas, por ejemplo: Las precipitaciones intensas tienen características de agregación El
movimiento celular sigue el campo de flujo
El ciclo de vida se divide en diferentes etapas de desarrollo
Estos conocimientos previos se pueden agregar al modelo como restricciones.
3. Integración de modelos:
utilice varios modelos diferentes para fusionar sus respectivos resultados de pronóstico.
4. Mejora de datos:
mejore los datos de entrenamiento rotando, volteando, agregando ruido, etc. para mejorar la solidez del modelo.
5. Optimización del modelo y la estrategia de entrenamiento:
mejorar la estructura del modelo, ajustar la función de pérdida, optimizar los hiperparámetros de entrenamiento, etc.

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') 


Insertar descripción de la imagen aquí

Pregunta tres

Idea:
1. Diseño de entradas y salidas
Entrada: reflectividad del radar ZH Z_Hzhy reflectividad diferencial ZDR Z_DRzreSalida de R : Precipitación prevista R
2. Establecer la relación ZR
R = a ∗ ZH b ∗ ZDR c R = a * Z_H^b * Z_DR^cR=azhsegundozreRcdonde a, b, c son parámetros empíricos.
Transforme el problema para determinar estos tres parámetros.
3. Determinación de parámetros
Recopile datos de observación: recopile una gran cantidad de datos tripletes (Z_H, Z_DR, R) de múltiples regiones y múltiples tipos de precipitación.
Preprocesamiento de datos: elimine muestras con grandes errores y verifique la calidad de los datos. Normalice Z_H y Z_DR.
Parámetros de ajuste: Construya la función de pérdidaL = ∑ 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 )2l=yo = 1norte(R^yoRyo)2 litros=i=1 norte ( riR i ) 2 ,其中R ^ i = a ZH ib ZDR ic R i = a ZH ib ZDR ic \hat R_i=aZ_{H_i}^bZ_{DR_i}^cR^i =aZHi b ZDRi cR^yo=la ZhyosegundozDR _yocRi=a Z H ib Z D R i c . Utilice el algoritmo de descenso de gradiente para aprender los parámetros a, b, c para minimizar la función de pérdida.
4. Selección de modelo: compare diferentes combinaciones de índices de potencia y seleccione un conjunto de parámetros con el mejor efecto de ajuste. Pruebas de modelos
Recopile datos de pruebas independientes: asegúrese de que los datos de entrenamiento y de prueba estén en diferentes regiones y tipos de precipitación.
Predicción del conjunto de prueba: sustituya los datos de prueba Z_H y Z_DR en la relación ZR obtenida para generar la predicción de precipitaciónR ^ \hat RR^ .
Indicadores de evaluación: Calcule RMSE, MAE, etc. para probar el efecto de predicción. Traza un diagrama de dispersión para compararR ^ \hat RR^ y r.
Mejora del modelo: compare los efectos de predicción de diferentes regiones y tipos de precipitación, analice los motivos y optimice aún más el modelo.
Validación de casos extremos: utilice datos en casos de lluvia extrema para verificar la aplicabilidad y solidez del modelo.
Insertar descripción de la imagen aquí

Código:

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 

Insertar descripción de la imagen aquí

función de descenso de gradiente

Pregunta 4

  1. Modelo de referencia

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

donde X 0 X_0X0es polarización simple Z_H, θ 0 \theta_0i0es el parámetro del modelo, Y ^ 0 \hat{Y}_0Y^0para la predicción.

  1. Modelo de evaluación

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

donde X 1 X_1X1Inclusión Z_H, Z_DR, K_DP, θ 1 \theta_1i1es el parámetro, Y ^ 1 \hat{Y}_1Y^1para la predicción.

  1. Evaluación del modelo

RMSE 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})^2RMS -E0=norte1yo = 1norte( YyoY^0 yo)2

RMSE 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})^2RMS -E1=norte1yo = 1norte( YyoY^1 yo)2

Comparar RMSE 0 RMSE_0RMS -E0y RMSE 1 RMSE_1RMS -E1

  1. Fusión del mecanismo de atención

Y ^ = ∑ i = 1 m α ifi ( X i ; θ i ) \hat{Y} = \sum_{i=1}^{m}\alpha_i f_i(X_i; \theta_i)Y^=yo = 1mayoFyo( Xyo;iyo)

Peso de aprendizaje α i \alpha_iayo, fusiona de forma adaptativa diferentes fuentes de datos X i X_iXyoPredicción.

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)

Para obtener versiones más completas, consulte aquí:
(5 mensajes privados/2 mensajes) ¿Cómo evaluar la pregunta F del Concurso de Modelado Matemático 2023? -csdn

Supongo que te gusta

Origin blog.csdn.net/qq_25834913/article/details/133236337
Recomendado
Clasificación