目录
原理简介
原理一:递归预测
原理二: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