专栏名称: 气象学家
【气象学家】公众号平台为您解读最新气象科研进展、分享气象实用编程技巧、追踪气象即时资讯。欢迎加入气象AI和Python交流群以及气象博士群!与5W+的专业人士一起交流互动!
目录
相关文章推荐
媒哥媒体招聘  ·  顶尖导演团队招新人!剧组资源同步开放 ·  2 天前  
天玑-无极领域  ·  #官方回应有智力缺陷孩子在校被霸凌# ... ·  昨天  
天玑-无极领域  ·  奇怪,连续多人问:怎样用deepseek赚钱 ... ·  3 天前  
51好读  ›  专栏  ›  气象学家

附代码 | 利用LSTM网络进行降水趋势预测

气象学家  · 公众号  ·  · 2024-03-22 15:59

正文

第一时间获取气象科研资讯

气象学家 公众号 交流群

加入


为应对环境管理挑战,本研究利用长短期记忆网络(LSTM)分析合成降水数据,目的是提升长期天气预测的准确度。模型在训练阶段达到0.56的均方根误差(RMSE),在测试阶段为0.59,显示了良好的准确性和泛化能力。
这些结果表明,LSTM模型在降水预测方面展现出潜力,经过进一步优化,有望应用于实际场景中。
关键词:LSTM,天气预报,长期降水预测,神经网络气象学,时间序列分析,预测性天气建模。

一 引言:

在气象领域,准确预测未来事件基于历史数据是极其重要的。无论是预测股市趋势还是天气变化,随时间识别模式都是预测分析的关键。长短期记忆网络(LSTM)凭借其对时间序列数据深刻的理解能力,在预测分析中占据了核心地位。

本文将探讨LSTM网络在气象学等多个领域中识别模式并产生影响的能力,特别是在提高降水预测准确性方面的应用。

图1 采用的神经网络架构

二 LSTM网络的机制:

LSTM网络之所以独特,是因为它专门设计来解决传统循环神经网络(RNNs)在处理长时间序列数据时遇到的挑战。尽管RNNs能有效捕捉时间序列的依赖性,但它们处理长期依赖时往往遭遇梯度消失问题,即随着时间序列的延长,模型对早期数据的学习能力会大大降低。

LSTM网络通过引入一个精巧的内部结构——包括细胞状态和三个控制信息流的门(输入门、遗忘门和输出门)——来巧妙地规避这一问题。这些组件共同工作,保证了LSTM能够在保持数据长期依赖性的同时,有效管理信息流,解决了传统RNNs面临的挑战。

图2 利用一维深度卷积神经网络进行月降雨量预报

在LSTM网络中,细胞状态的作用可以比喻为一条跨越整个网络的传送带,负责在多个时间步骤中传递信息,帮助网络记住或忘记信息。这个过程通过三个主要的门控机制来实现,这些门由sigmoid激活函数构成的神经网络层控制。

具体来说,输入门负责引入新的信息到细胞状态,遗忘门决定哪些旧信息应该被遗忘,而输出门则决定哪些信息应该被传递到网络的下一步。

这种精细的门控策略让LSTM能够精确地控制信息的保存、更新或删除,有效地管理内部记忆,解决长期数据依赖时可能遇到的难题。

三 代码实操:

我们将通过一个完整的Python示例来演示长短期记忆网络(LSTM)在随时间识别模式方面的应用,特别是在降水数据的上下文中。这包括生成一个模拟随时间变化的降水的合成数据集,构建一个LSTM模型来学习这些模式,然后使用适当的指标和图表评估模型的性能。最后,我们将讨论结果及其含义。

3.1 生成合成降水数据

为了简化,我们的合成数据集将模拟几年来的月降水量。我们将使用正弦波来生成周期性模式,代表季节性降水变化,并添加一些噪声来模拟现实世界的不可预测性。

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
# Generate synthetic precipitation datanp.random.seed(42)time = np.arange(0, 120, 0.1) # 120 months with a step of 0.1 for smooth sine waveprecipitation = np.sin(time) + np.random.normal(scale=0.5, size=len(time))
# Plotting the synthetic dataplt.figure(figsize=(10, 6))plt.plot(time, precipitation)plt.title('Synthetic Monthly Precipitation Data')plt.xlabel('Time (months)')plt.ylabel('Precipitation')plt.show()

3.2 为LSTM准备数据集

LSTM网络需要以特定格式的输入数据,通常是形状为(样本数,时间步长,特征数)的3D数组。我们将相应地转换我们的数据,并将其分为训练集和测试集。

from sklearn.preprocessing import MinMaxScalerfrom sklearn.model_selection import train_test_split
# 将数据重塑并归一化data = precipitation.reshape(-1, 1) # 重塑为2D数组以进行归一化scaler = MinMaxScaler(feature_range=(0, 1))data_normalized = scaler.fit_transform(data)
# 将时间序列数据转换为监督学习问题def create_dataset(dataset, look_back=1): """ 根据look_back创建输入输出数据对。 look_back定义了用于预测下一时间点值的时间步数。 """ X, Y = [], [] for i in range(len(dataset)-look_back-1): a = dataset[i:(i+look_back), 0] X.append(a) Y.append(dataset[i + look_back, 0]) return np.array(X), np.array(Y)
look_back = 10 # 使用过去10个时间点的数据作为输入X, Y = create_dataset(data_normalized, look_back)X = np.reshape(X, (X.shape[0], X.shape[1], 1)) # 重塑为3D数组
# 划分训练集和测试集X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
# 打印形状以便验证print(f"X_train shape: {X_train.shape}")print(f"Y_train shape: {Y_train.shape}")

3.3 构建和训练 LSTM 模型

现在,我们将使用 Keras 定义和训练 LSTM 模型。

from keras.models import Sequentialfrom keras.layers import LSTM, Densefrom keras.callbacks import EarlyStopping, ModelCheckpoint
# 构建LSTM模型model = Sequential()model.add(LSTM(50, input_shape=(look_back, 1), return_sequences=False))model.add(Dense(1))model.compile(optimizer='adam', loss='mean_squared_error')
# 添加模型训练的回调函数callbacks = [ EarlyStopping(monitor='val_loss', patience=10), # 当val_loss不再改善时停止训练 ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True) # 保存在验证集上表现最佳的模型]
# 训练模型,同时监控验证集的损失model.fit(X_train, Y_train, epochs=100, batch_size=32, verbose=2, validation_split=0.2, callbacks=callbacks)

3.4 评估模型

训练结束后,我们将评估模型在测试数据集上的性能,并绘制预测值与实际值的对比图。

# Making predictionstrain_predict = model.predict(X_train)test_predict = model.predict(X_test)
# Invert predictionstrain_predict = scaler.inverse_transform(train_predict)Y_train_inv = scaler.inverse_transform([Y_train])test_predict = scaler.inverse_transform(test_predict)Y_test_inv = scaler.inverse_transform([Y_test])
# Calculate RMSEfrom sklearn.metrics import mean_squared_errortrainScore = np.sqrt(mean_squared_error(Y_train_inv[0], train_predict[:,0]))print(f'Train Score: {trainScore:.2f} RMSE')testScore = np.sqrt(mean_squared_error(Y_test_inv[0], test_predict[:,0]))print(f'Test Score: {testScore:.2f} RMSE')
# Plottingplt.figure(figsize=(10, 6))plt.plot(Y_test_inv[0], label='True Value')plt.plot(test_predict[:,0], label='Predicted')plt.title('Precipitation Prediction')plt.xlabel('Time')plt.ylabel('Precipitation')plt.legend()plt.show()

Train Score: 0.56 RMSE

Test Score: 0.59 RMSE

四:结

长短期记忆网络(LSTM)凭借其在时间序列分析中的强大能力,尤其在天气预测等领域显示出其重要性。通过模型展示的训练和测试RMSE值(分别为0.56和0.59),我们可以看出LSTM在捕捉降水模式方面的有效性和良好的泛化能力。
虽然存在挑战,比如模型的进一步优化和参数调整,但LSTM网络已证明是理解和预测时间依赖数据的有力工具。随着技术的发展,LSTM的应用前景将更加广泛,为未来的创新应用开辟道路。






声明: 欢迎转载、转发。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及内容、版权和其他问题,请联系小编 (微信:qxxjgzh) 处理。


往期推荐
获取 ERA5/ERA5-Land再分析数据(36TB/32TB)






请到「今天看啥」查看全文