基于CNN-BiLSTM的时间序列数据预测,15个输入1个输出,可以更改数据集,MATLAB代码
1. 数据收集与预处理
- 数据清洗:处理缺失值、异常值等。
- 特征工程:提取有助于预测的特征。
- 数据标准化:将时间序列数据标准化,使其具有零均值和单位方差,有助于模型训练。
- 滑动窗口划分:将时间序列数据划分为多个滑动窗口,每个窗口包含15个历史时间点的数据值,用于预测下一个时间点的值。
- 数据集中部分数据如下:
0.491920000000000 0.493110000000000 0.493500000000000 0.493130000000000 0.493030000000000 0.493300000000000 0.494200000000000 0.493710000000000 0.496820000000000 0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000
0.493110000000000 0.493500000000000 0.493130000000000 0.493030000000000 0.493300000000000 0.494200000000000 0.493710000000000 0.496820000000000 0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000
0.493500000000000 0.493130000000000 0.493030000000000 0.493300000000000 0.494200000000000 0.493710000000000 0.496820000000000 0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000
0.493130000000000 0.493030000000000 0.493300000000000 0.494200000000000 0.493710000000000 0.496820000000000 0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000
0.493030000000000 0.493300000000000 0.494200000000000 0.493710000000000 0.496820000000000 0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000
0.493300000000000 0.494200000000000 0.493710000000000 0.496820000000000 0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000
0.494200000000000 0.493710000000000 0.496820000000000 0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000 0.579750000000000
0.493710000000000 0.496820000000000 0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000 0.579750000000000 0.565900000000000
0.496820000000000 0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000 0.579750000000000 0.565900000000000 0.563570000000000
0.517990000000000 0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000 0.579750000000000 0.565900000000000 0.563570000000000 0.564210000000000
0.520820000000000 0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000 0.579750000000000 0.565900000000000 0.563570000000000 0.564210000000000 0.560570000000000
0.519940000000000 0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000 0.579750000000000 0.565900000000000 0.563570000000000 0.564210000000000 0.560570000000000 0.558160000000000
0.526180000000000 0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000 0.579750000000000 0.565900000000000 0.563570000000000 0.564210000000000 0.560570000000000 0.558160000000000 0.561030000000000
0.539890000000000 0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000 0.579750000000000 0.565900000000000 0.563570000000000 0.564210000000000 0.560570000000000 0.558160000000000 0.561030000000000 0.561560000000000
0.539940000000000 0.544180000000000 0.546260000000000 0.548060000000000 0.546630000000000 0.555100000000000 0.563040000000000 0.579750000000000 0.565900000000000 0.563570000000000 0.564210000000000 0.560570000000000 0.558160000000000 0.561030000000000 0.561560000000000 0.560440000000000
2. 设计CNN-BiLSTM模型
3. 编译模型
- 选择损失函数:对于回归问题,通常使用均方误差(MSE)作为损失函数。
- 选择优化器:常用的优化器包括Adam、SGD等。
- 选择评估指标:常用的评估指标包括均方根误差(RMSE)。
4. 训练模型
- 划分数据集:将数据集划分为训练集、验证集和测试集。
- 模型训练:使用训练集数据训练模型,并在验证集上进行模型评估,以防止过拟合。
- 超参数调优:调整模型的超参数,如卷积核大小、卷积层数量、学习率等,以获得更好的性能。
5. 模型评估与测试
- 评估模型:在测试集上评估模型的性能,使用RMSE等指标。
- 结果分析:分析模型预测结果与实际值之间的差异,评估模型的准确性和泛化能力。
6.基于CNN-BiLSTM的时间序列预测模型结合了卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM)具有如下优势:
-
强大的特征提取能力:CNN能够有效地提取时间序列数据的局部特征,而BiLSTM能够捕捉长期的依赖关系。这种结合使得模型能够同时处理空间和时间特征,提高了模型的表达能力。
-
较高的预测精度:结合CNN和BiLSTM的优势,能够提高时间序列预测的精度。CNN-BiLSTM模型通过CNN和LSTM分别提取空间和时间特征,从而能够较好地适应不断波动的时间序列数据,提高早高峰和晚高峰预测的稳定性和精度。
-
鲁棒性强:CNN-BiLSTM模型对噪声数据具有较强的鲁棒性,能够较好地处理实际应用中的不完美数据。
-
双向信息捕捉:BiLSTM能够同时从过去和未来的数据中学习,因为它有两个方向的LSTM单元,一个用于正向序列,另一个用于反向序列,这样,模型可以更全面地捕捉到时间序列中的关联信息。
-
更丰富的上下文理解:由于BiLSTM可以在两个方向上捕捉信息,它能够更好地理解当前时刻的输入与其前后上下文之间的关系,这对于许多序列任务(如自然语言处理、时间序列预测等)都非常有用。
-
降低网络入侵检测误报率:在网络入侵检测中,CNN-BiLSTM模型通过考虑序列数据中每个属性点的前后属性对特征提取的影响,从而达到降低误报率的目的。
7. 部分MATLAB示例
%% 绘图
figure
plot(1: M, T_train, 'r-', 1: M, T_sim1, 'b-', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid
figure
plot(1: N, T_test, 'r-', 1: N, T_sim2, 'b-', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比'; ['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid
figure
scatter(T_train, T_sim1, sz, c)
hold on
plot(xlim, ylim, '--k')
xlabel('训练集真实值');
ylabel('训练集预测值');
xlim([min(T_train) max(T_train)])
ylim([min(T_sim1) max(T_sim1)])
title('训练集预测值 vs. 训练集真实值')
figure
scatter(T_test, T_sim2, sz, c)
hold on
plot(xlim, ylim, '--k')
xlabel('测试集真实值');
ylabel('测试集预测值');
xlim([min(T_test) max(T_test)])
ylim([min(T_sim2) max(T_sim2)])
title('测试集预测值 vs. 测试集真实值')