LSTM与BP算法结合的Matlab多输入单输出组合预测建模程序
LSTM结合BP做多输入单输出的组合预测建模。 程序内注释详细直接替换数据就可以使用。 程序语言为matlab。 程序直接运行可以出拟合预测图线性拟合预测图多个预测评价指标。 PS:以下效果图为测试数据的效果图主要目的是为了显示程序运行可以出的结果图具体预测效果以个人的具体数据为准。 2.由于每个人的数据都是独一无二的因此无法做到可以任何人的数据直接替换就可以得到自己满意的效果。 3.程序后可以无偿帮忙替换数据无原理。最近在折腾时间序列预测的项目偶然发现将LSTM和BP神经网络组合使用效果意外不错。这种混搭思路特别适合处理既有时间依赖又存在复杂非线性关系的多维数据今天就把自己调试通过的MATLAB代码和实现要点分享给大家。先看核心代码结构整个工程分为数据预处理、模型训练、预测分析三大模块。最带劲的是这个脚本从数据加载到结果可视化全自动完成咱们只需要把自家数据整理成n行m列的Excel表格最后一列是输出变量扔进工程目录就行。%% 数据读取与标准化 data xlsread(你的数据集.xlsx); % 替换这里 input data(:,1:end-1); output data(:,end); [input_normalized, input_ps] mapminmax(input); [output_normalized, output_ps] mapminmax(output); %% 数据集划分 train_ratio 0.8; n_samples size(input,2); train_num round(n_samples*train_ratio); XTrain input_normalized(:,1:train_num); YTrain output_normalized(:,1:train_num); XTest input_normalized(:,train_num1:end); YTest output_normalized(:,train_num1:end);这段预处理代码暗藏玄机mapminmax函数做的是归一化处理把不同量纲的特征压缩到[-1,1]区间。注意输入输出要分开标准化避免信息泄露。有个新人常踩的坑是直接在原始数据上做标准化结果测试集准确率虚高——切记要分别保存训练集的标准化参数LSTM结合BP做多输入单输出的组合预测建模。 程序内注释详细直接替换数据就可以使用。 程序语言为matlab。 程序直接运行可以出拟合预测图线性拟合预测图多个预测评价指标。 PS:以下效果图为测试数据的效果图主要目的是为了显示程序运行可以出的结果图具体预测效果以个人的具体数据为准。 2.由于每个人的数据都是独一无二的因此无法做到可以任何人的数据直接替换就可以得到自己满意的效果。 3.程序后可以无偿帮忙替换数据无原理。模型搭建部分采用LSTM打头阵BP收尾的串行结构相当于先用LSTM捕捉时间特征再用BP挖掘深层非线性关系%% 混合网络结构 layers [ ... sequenceInputLayer(size(XTrain,1)) lstmLayer(128,OutputMode,last) fullyConnectedLayer(64) reluLayer fullyConnectedLayer(1) regressionLayer]; options trainingOptions(adam, ... MaxEpochs,200, ... MiniBatchSize,32, ... ValidationData,{XTest,YTest}, ... Plots,training-progress); net trainNetwork(XTrain,YTrain,layers,options);这里LSTM层的128个隐藏单元是经过多次调参试出来的平衡点——单元太少捕捉不到长期依赖太多又容易过拟合。训练过程可视化功能特别实用能实时观察验证集损失变化遇到震荡发散的情况赶紧点停止按钮。预测结果反标准化后咱们用双坐标轴展示真实值和预测值的走势%% 结果反归一化 YPred predict(net,XTest); YPred_inv mapminmax(reverse,YPred,output_ps); YTest_inv mapminmax(reverse,YTest,output_ps); figure yyaxis left plot(YTest_inv,b-o,LineWidth,1.5) yyaxis right plot(YPred_inv,r--s,LineWidth,1.5) legend(真实值,预测值) title(LSTM-BP混合模型预测效果)输出指标部分直接调用现成函数计算建议重点关注R²和RMSE这两个指标%% 评估指标计算 mse mean((YPred_inv - YTest_inv).^2); rmse sqrt(mse); mae mean(abs(YPred_inv - YTest_inv)); r2 1 - sum((YTest_inv - YPred_inv).^2)/sum((YTest_inv - mean(YTest_inv)).^2); disp([RMSE: ,num2str(rmse)]) disp([MAE: ,num2str(mae)]) disp([R²: ,num2str(r2)])实际跑起来的效果嘛拿某化工过程数据测试R²能到0.93左右。不过要提醒各位遇到预测曲线出现系统性偏移时大概率是数据存在滞后效应建议在输入特征中加入历史统计量比如前3天的移动平均。最后说几个实战技巧数据量少于500条时把LSTM单元数降到64以下训练loss震荡剧烈的话试试把学习率从0.001调到0.0005输出结果做反归一化时注意保持和训练数据相同的参数需要帮忙适配数据的朋友直接私信扔数据过来记得标注输入输出列。不过别拿股票数据来为难我哈那玩意儿LSTM也搞不定手动狗头~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2413852.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!