引言

在气象领域,准确预测未来事件基于历史数据是极其重要的。无论是预测股市趋势还是天气变化,随时间识别模式都是预测分析的关键。长短期记忆网络(LSTM)凭借其对时间序列数据深刻的理解能力,在预测分析中占据了核心地位。
本文将探讨LSTM网络在气象学等多个领域中识别模式并产生影响的能力,特别是在提高降水预测准确性方面的应用。
2024年3月20日一篇Nature正刊采用的就是LSTM模型:
在这里插入图片描述
这篇文章展示了基于人工智能的预测在预测未测量流域的极端河流事件方面达到了高达5天提前期的可靠性,这与当前最先进的全球建模系统(哥白尼应急管理服务全球洪水预警系统)的临近预报(零日提前期)的可靠性相似或更好。实现的五年回归期事件的准确性与当前一年回归期事件的准确性相似或更好。这意味着人工智能可以在未测量的流域更早、更大、更有影响的事件中提供洪水预警。在这里开发的模型被纳入一个可操作的预警系统,该系统在80多个国家提供公开(免费和开放)的实时预报。这项工作强调需要增加水文数据的可用性,以继续改善全球获得可靠的洪水预警的机会。

一、LSTM网络的机制

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

LSTM网络通过引入一个精巧的内部结构——包括细胞状态和三个控制信息流的门(输入门、遗忘门和输出门)——来巧妙地规避这一问题。这些组件共同工作,保证了LSTM能够在保持数据长期依赖性的同时,有效管理信息流,解决了传统RNNs面临的挑战。
在LSTM网络中,细胞状态的作用可以比喻为一条跨越整个网络的传送带,负责在多个时间步骤中传递信息,帮助网络记住或忘记信息。这个过程通过三个主要的门控机制来实现,这些门由sigmoid激活函数构成的神经网络层控制。

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

这种精细的门控策略让LSTM能够精确地控制信息的保存、更新或删除,有效地管理内部记忆,解决长期数据依赖时可能遇到的难题。
当然格外需要注意的是LSTM需要很多个参数,那么参数的最优选择需要进一步考虑,因此采用粒子群算法优化参数提高精度。

二、代码实操

1.LSTM准备数据集

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

from sklearn.preprocessing import MinMaxScaler
from 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}")

2.构建和训练 LSTM 模型

代码如下(示例):

%% PSO优化LSTM时间序列预测
clc; clear; close all; format compact
%% 加载数据
% 从 Excel 文件中读取数据,其中第 1 列到第 8 列是输入特征,第 9 列是输出目标值
input = xlsread('G:\2024codes\PSO-LSTM\经过粒子群算法优化的LSTM\data.xlsx', 'Sheet1', 'A2:I1000');
% 检查是否含有空值的行,并删除这些行
nanRows = any(isnan(input), 2);
data = input(~nanRows, :);
% 分别提取输入特征和输出目标值
x = data(:, 1:8); % 输入特征
y = data(:, 9);   % 输出目标值
% 数据归一化或标准化处理
method = @mapminmax; % 可以选择 mapstd 用于标准化
[xs, mappingx] = method(x');
x = xs';
[ys, mappingy] = method(y');
y = ys';
% 划分训练集和测试集
n = size(x, 1);
n1 = randperm(n);
m = round(n * 0.6); % 训练集占总样本数的比例
XTrain = x(n1(1:m), :)';  % 训练集输入特征
XTest = x(n1(m+1:end), :)'; % 测试集输入特征
YTrain = y(n1(1:m), :)';    % 训练集输出目标值
YTest = y(n1(m+1:end), :)';  % 测试集输出目标值
%% 采用PSO优化
optimization = 1; % 1表示重新优化,2表示直接加载已有优化结果
if optimization == 1
    % 使用 PSO 寻优获取最优参数,并保存结果
    [x, fit_gen, process] = psoforlstm(XTrain, YTrain, XTest, YTest);
    save result/pso_para_result x fit_gen process
else
    % 直接加载已有的 PSO 优化结果
    load result/pso_para_result
end
%% 画适应度曲线与4个参数的变化曲线
fig(fit_gen, process, 'PSO')  % 绘制适应度曲线和参数变化曲线
disp('优化的超参数为:')
disp('numHiddenUnits1:'), x(1)
disp('numHiddenUnits2:'), x(2)
disp('maxEpochs:'), x(3)
disp('learning_rate:'), x(4)
%% 利用优化得到的参数重新训练
train = 1; % 1表示重新训练模型,2表示直接加载已有模型
if train == 1
    rng(0)
    numFeatures = size(XTrain, 1);  % 输入节点数
    numResponses = size(YTrain, 1); % 输出节点数
    miniBatchSize = 16; % batchsize
    numHiddenUnits1 = x(1);
    numHiddenUnits2 = x(2);
    maxEpochs = x(3);
    learning_rate = x(4);
    % 设置 LSTM 网络的层结构和训练参数
    layers = [ ...
        sequenceInputLayer(numFeatures)
        lstmLayer(numHiddenUnits1)
        lstmLayer(numHiddenUnits2)
        fullyConnectedLayer(numResponses)
        regressionLayer];
    options = trainingOptions('adam', ...
        'MaxEpochs', maxEpochs, ...
        'MiniBatchSize', miniBatchSize, ...
        'InitialLearnRate', learning_rate, ...
        'GradientThreshold', 1, ...
        'Shuffle', 'every-epoch', ...
        'Verbose', true, ...
        'Plots', 'training-progress');
    % 训练 LSTM 模型
    net = trainNetwork(XTrain, YTrain, layers, options);
    save model/psolstm net
else
    % 直接加载已有的 LSTM 模型
    load model/psolstm
end
%% 预测
YPred = predict(net, XTest, 'MiniBatchSize', 1); % 使用测试集进行预测
YPred = double(YPred); % 将预测结果转换为双精度类型
% 反归一化
predict_value = method('reverse', YPred, mappingy);
true_value = method('reverse', YTest, mappingy);
% 保存预测结果和真实值
predict_value = YPred;
true_value = YTest;
save result/pso_lstm predict_value true_value
%% 模型评估
load result/pso_lstm % 加载预测结果和真实值
disp('模型评估')
result(true_value, predict_value, 'PSO-LSTM') % 计算并展示模型评估指标
fprintf('\n')
%% 绘图
figure
plot(true_value(end, :)) % 绘制真实值曲线
hold on
plot(predict_value(end, :)) % 绘制预测值曲线
grid on
title('PSO-LSTM')

3.出图效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

欢迎关注gongzhonghao趣品科研,获取更多代码和前沿论文资讯等相关内容

总结

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

参考链接:

https://www.nature.com/articles/s41586-024-07145-1
https://blog.google/technology/ai/google-ai-global-flood-forecasting/
https://mp.weixin.qq.com/s/ykLRb4P045hQNFt1XdLSJA
He, K., Chen, X., Liu, J., & Zhao, D. (2023). A multiple-step scheme for the improvement of satellite precipitation products over the Tibetan Plateau from multisource information. Science of The Total Environment, 873, 162378, https://doi.org/10.1016/j.scitotenv.2023.162378.
He, K., Chen, X., Xuan, Y., Chunyu, D., & Dongmei, Z. (2024). Evaluation and prediction of compound geohazards in highly urbanized regions across China’s Greater Bay Area. Journal of Cleaner Production, 141641, https://doi.org/10.1016/j.jclepro.2024.141641

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐