基于Matlab建模代码LSTM时间序列预测,LSTM长短期记忆神经网络
使用该程序可以:(1)使用LSTM神经网络对时间序列数据进行建模(2)以测试集RMSE最小为原则自动调参以防止过拟合为原则自动调参以防止过拟合(3)根据目的不同(拟合模型还是预测未来?),可以选择开环预测或闭环预测(4)分训练集和测试集显示拟合图,显示调参过程中的RMSE热力图(5)建模后进行预测并画图
在这里插入图片描述


以下是一个使用MATLAB进行LSTM时间序列预测的示例代码。该代码包括数据准备、模型构建(包含自动调参)、训练过程、性能评估以及预测和可视化。我们将利用MATLAB的深度学习工具箱来实现这些功能。

示例代码

function lstmTimeSeriesForecastingExample()
    % 加载数据
    data = load('your_time_series_data.mat'); % 替换为你的数据文件名
    X = data.your_time_series_variable; % 替换为你的变量名
    
    % 数据预处理: 归一化处理
    [X_scaled, mu, sigma] = zscore(X);
    
    % 划分训练集和测试集 (70% train, 30% test)
    numTimeStepsTrain = floor(0.7 * numel(X_scaled));
    XTrain = X_scaled(1:numTimeStepsTrain);
    XTest = X_scaled(numTimeStepsTrain+1:end);
    
    % 参数范围设置
    numHiddenUnitsRange = [50, 100, 150]; % 隐藏单元数量范围
    miniBatchSizeRange = [64, 128, 256]; % 小批次大小范围
    bestRMSE = Inf;
    bestParams = struct();
    
    % 网格搜索:自动调参
    for numHiddenUnits = numHiddenUnitsRange
        for miniBatchSize = miniBatchSizeRange
            % 构建并训练LSTM网络
            layers = [ ...
                sequenceInputLayer(1) % 输入层
                lstmLayer(numHiddenUnits, 'OutputMode', 'sequence') % LSTM层
                fullyConnectedLayer(1) % 全连接层
                regressionLayer]; % 回归输出层
            
            options = trainingOptions('adam', ... % 训练选项
                'MaxEpochs', 250, ...
                'MiniBatchSize', miniBatchSize, ...
                'InitialLearnRate', 0.01, ...
                'GradientThreshold', 1, ...
                'Verbose', 0, ...
                'Plots', 'training-progress');
            
            net = trainNetwork(XTrain, XTrain, layers, options); % 训练网络
            
            % 测试集预测及计算RMSE
            XTestPred = predict(net, XTest(1:end-1));
            RMSE = sqrt(mean((XTest(2:end) - XTestPred).^2));
            
            % 更新最佳参数
            if RMSE < bestRMSE
                bestRMSE = RMSE;
                bestParams.numHiddenUnits = numHiddenUnits;
                bestParams.miniBatchSize = miniBatchSize;
            end
        end
    end
    
    % 使用最佳参数重新训练模型
    layers = [ ...
        sequenceInputLayer(1)
        lstmLayer(bestParams.numHiddenUnits, 'OutputMode', 'sequence')
        fullyConnectedLayer(1)
        regressionLayer];
    
    options = trainingOptions('adam', ...
        'MaxEpochs', 250, ...
        'MiniBatchSize', bestParams.miniBatchSize, ...
        'InitialLearnRate', 0.01, ...
        'GradientThreshold', 1, ...
        'Verbose', 0, ...
        'Plots', 'training-progress');
    
    net = trainNetwork(XTrain, XTrain, layers, options);
    
    % 输出最佳参数及对应的RMSE
    fprintf('Best Parameters:\n');
    fprintf('Number of Hidden Units: %d\n', bestParams.numHiddenUnits);
    fprintf('Mini-Batch Size: %d\n', bestParams.miniBatchSize);
    fprintf('Test Set RMSE: %.4f\n', bestRMSE);
    
    % 开环预测: 使用训练好的模型对未来值进行预测
    numTimeStepsPredict = numel(XTest);
    XTestPred = nan(numTimeStepsPredict, 1);
    XTestPred(1) = XTest(1);
    for i = 2:numTimeStepsPredict
        XTestPred(i) = predict(net, XTestPred(i-1), 'SequenceLength', 1);
    end
    
    % 反归一化处理
    XTestUnscaled = XTest .* sigma + mu;
    XTestPredUnscaled = XTestPred .* sigma + mu;
    
    % 绘制拟合图
    figure;
    subplot(2, 1, 1);
    plot(XTrain, '-b');
    hold on;
    plot(numTimeStepsTrain+1:numTimeStepsTrain+numTimeStepsPredict, XTestUnscaled, '-r');
    xlabel('Time Step');
    ylabel('Value');
    title('Training and Test Data');
    legend({'Training Data', 'Test Data'});
    hold off;
    
    subplot(2, 1, 2);
    plot(numTimeStepsTrain+1:numTimeStepsTrain+numTimeStepsPredict, XTestUnscaled, '-r');
    hold on;
    plot(numTimeStepsTrain+1:numTimeStepsTrain+numTimeStepsPredict, XTestPredUnscaled, '--g');
    xlabel('Time Step');
    ylabel('Value');
    title('Test Data and Predictions');
    legend({'Test Data', 'Predictions'});
    hold off;
end

代码解释

主函数 lstmTimeSeriesForecastingExample
  • 加载数据:从MAT文件中读取时间序列数据。
  • 数据预处理:对数据进行z-score标准化,以便于神经网络的训练。
  • 划分训练集和测试集:将数据按比例划分为训练集和测试集。
  • 参数范围设置:定义隐藏单元数量和小批次大小的范围,用于网格搜索自动调参。
  • 网格搜索:自动调参
    • 对不同的隐藏单元数量和小批次大小组合进行循环。
    • 使用trainNetwork函数构建并训练LSTM网络,并开启训练进度显示。
    • 在测试集上计算均方根误差(RMSE),选择具有最小RMSE的参数组合作为最佳参数。
  • 使用最佳参数重新训练模型:根据找到的最佳参数重新训练模型。
  • 输出最佳参数及对应的RMSE:打印出最佳参数及其对应的测试集RMSE。
  • 开环预测:利用训练好的模型对未来值进行预测,并反归一化处理预测结果。
  • 绘制拟合图:分别绘制训练集和测试集的数据图以及测试集与预测值的对比图。

注意事项

  1. 数据预处理:确保输入数据是数值型且无缺失值。可以根据需要对数据进行归一化或标准化处理。
  2. 参数选择:不同的隐藏单元数量和小批次大小会影响模型性能。本示例通过网格搜索自动调参,但你也可以尝试其他更复杂的调参策略,如贝叶斯优化。
  3. 模型评估:除了RMSE之外,还可以考虑其他评估指标,如决定系数(R^2)等。
  4. 预测模式:当前示例展示了开环预测(one-step-ahead prediction)。对于多步预测(multi-step-ahead prediction),可以考虑使用闭环预测的方法。
  5. 可视化:当前代码提供了几种基本的可视化方法,你可以根据需求进一步扩展或修改这些图表。

这个示例代码提供了一个完整的流程,帮助你在MATLAB中实现LSTM时间序列预测。希望这能帮助你理解和应用LSTM模型来进行时间序列分析。注意,实际应用中可能需要根据具体问题调整网络结构和超参数。
在这里插入图片描述
在这里插入图片描述

Logo

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

更多推荐