公司动态
时间序列怎么预测未来值?Matlab一键实现DBN-ELM时间序列递归预测未来数
目录原理简介原理一递归预测原理二DBN-ELM模型数据输入格式结果展示部分代码展示完整代码获取后台有很多小伙伴问我时间序列到底怎么预测未来值大多数论文里大家都只划分训练集测试集然后评估精度就结束了这也无可厚非毕竟论文也不需要落地。但在实际应用上仍然有很多小伙伴需要获取未来值但论文里没有给出具体的实现方式。其实预测未来值的方式有很多种今天给大家带来一期基于DBN-ELM模型的递归预测思想来获取单列时间序列的代码同时也包含训练集与测试集的精度。需要说明的是本期代码质量也非常高而且这个模型非常小众属于组合模型的一种既可以替换成你自己想要的其他模型又可以加入优化算法增加工作量审稿人看了也能眼前一亮。需要完整代码的朋友可直接拉到最后~您只需做的工作替换Excel数据一键运行main文件非常适合新手小白原理简介原理一递归预测首先递归预测的核心思想是利用已建立的模型和历史数据逐步递归地预测未来多个时间点的值也就是首先预测下一时刻的数据然后将这个预测值作为已知信息继续预测再下一个时刻的数据如此循环直到预测出所需的未来时间段的数据。举个简单的例子比如[1, 2, 3, 4, 5]预测下一个值是[6]那下一轮就是变成[2, 3, 4, 5, 6]去预测下一个值。原理二DBN-ELM模型DBN和ELM的原理网上有很多这里就不给大家介绍了。这里给大家介绍下DBN-ELM模型的原理假设一个DBN含有n层隐含层首先通过贪婪训练方式对前n-1层隐含层进行初始化训练而第n-1个隐含层到第n个隐含层及第n个隐含层到输出层的偏置和权重由ELM 确定。设m为第n个隐含层的神经元的数据l为第n-1个隐含层神经元的数据则此网络可表示为预测的最优结果是输出误差最小进一步则有通过上式使下式成立即上式可以转化为式中On表示第n-1层到第n层的输出具体如下式表示此时训练该网络使得下式成立此处将DBN最后一层隐含层视为一个单隐层神经网络采用ELM算法对其进行训练。此时DBN-ELM模型的输出权重根据下式进行求解网络结构图如下参考文献[1]李沂蔓.基于深度信念极限学习机的化工过程软测量方法研究[D].淮阴工学院,2023.数据输入格式本期推文采用的是经典的Excel时间序列数据集非常方便即代码中所用数据为测试数据无实际含义其中第一列为时间可放可不放非必须第二列为数据。替换自己的数据集时只需替换第二列数据即可时间一列无需输入因为代码不会识别时间无需更改代码直接替换数据即可非常方便适合新手小白需要注意的是batchsize必须设置为一个能够被样本数整除的数~比如我的数据样本数为420那设置为20就没问题~又或者你的数据样本数如果是396不能被20整除那肯定会报错此时设置为12即可。结果展示这里设置训练集比例为70%测试集比例为30%延时步长为12预测未来100行数据得到的结果如下所示预测未来效果图训练集预测结果图测试集预测结果图损失函数图3张线性拟合图误差直方图预测结果展示可以看到CNN-LSTM-Attention模型能够较好预测未来趋势当然由于深度学习模型迭代具有随机性因此每次运行结果可能会不同小伙伴们也可以自行设置一个随机数防止此类情况的发生~当然我们的文件夹里面也非常清晰没有乱七八糟的文件您只需运行的文件只有main一个直接点击运行即可出图不信可以看下面截图部分代码展示%% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行 %% 添加路径 addpath(DBN_ToolBox\) %% 导入数据时间序列的单列数据 result xlsread(数据集.xlsx); %% 数据分析 num_samples length(result); % 样本个数 kim 12; % 延时步长kim个历史数据作为自变量 zim 1; % 预测未来多少数据跨zim个时间点进行预测 ST 100; % 递归预测未来多少数据 %% 划分数据集 for i 1: num_samples - kim - zim 1 res(i, :) [reshape(result(i: i kim - 1), 1, kim), result(i kim zim - 1)]; end %% 数据集分析 outdim 1; % 最后一列为输出 num_size 0.7; % 训练集占数据集比例 num_train_s round(num_size * num_samples); % 训练集样本个数 f_ size(res, 2) - outdim; % 输入特征维度 %% 划分训练集和测试集 P_train res(1: num_train_s, 1: f_); T_train res(1: num_train_s, f_ 1: end); M size(P_train, 2); P_test res(num_train_s 1: end, 1: f_); T_test res(num_train_s 1: end, f_ 1: end); N size(P_test, 2); %% 数据归一化 [p_train, ps_input] mapminmax(P_train, 0, 1); p_test mapminmax(apply, P_test, ps_input); [t_train, ps_output] mapminmax(T_train, 0, 1); t_test mapminmax(apply, T_test, ps_output);如果想要更改预测未来数据的数量只需找到上面的ST变量更改对应数字即可非常方便适合新手小白~完整代码获取如果需要以上完整代码只需点击下方小卡片再后台回复关键字不区分大小写CLAWL