使用CNN构建时间序列单输入单输出预测模型(Matlab 2018B及以上版本)
这里有个小技巧:如果数据存在明显周期性,比如电力负荷预测中的日周期,可以把windowSize设为周期长度。PS:以下效果图为测试数据的效果图,主要目的是为了显示程序运行可以出的结果图,具体预测效果以个人的具体数据为准。PS:以下效果图为测试数据的效果图,主要目的是为了显示程序运行可以出的结果图,具体预测效果以个人的具体数据为准。CNN做时间序列单输入单输出预测模型,要求数据是单列的时间序列数据替
CNN做时间序列单输入单输出预测模型,要求数据是单列的时间序列数据替换数据就可以用。 程序语言是matlab,需求最低版本为2018B及以上。 程序可以出真实值和预测值对比图,线性拟合图,可打印多种评价指标。 PS:以下效果图为测试数据的效果图,主要目的是为了显示程序运行可以出的结果图,具体预测效果以个人的具体数据为准。 4.

遇到时间序列预测需求时,很多工程师会下意识选择LSTM这类循环神经网络。其实换个思路试试一维卷积网络(1D-CNN),你会发现它处理单变量序列预测同样能打。今天咱们用MATLAB搞个即插即用的CNN时序预测模板,三分钟实现从数据加载到结果输出全流程。

先看核心数据预处理部分。假设原始数据是某城市每日温度记录,存成单列CSV:
% 数据载入与标准化
rawData = readmatrix('your_data.csv');
data = zscore(rawData); % 数据标准化很重要!
% 滑动窗口构造
windowSize = 7; % 根据数据周期调整这个超参数
[XTrain, YTrain] = createWindowData(data(1:700), windowSize);
[XTest, YTest] = createWindowData(data(701:end), windowSize);
% 自定义窗口生成函数
function [X, Y] = createWindowData(data, windowSize)
X = [];
Y = [];
for i = 1:length(data)-windowSize
X = [X; data(i:i+windowSize-1)'];
Y = [Y; data(i+windowSize)];
end
end
这里有个小技巧:如果数据存在明显周期性,比如电力负荷预测中的日周期,可以把windowSize设为周期长度。代码中的700是随便写的训练集分割点,实际应用要根据数据量调整。

CNN做时间序列单输入单输出预测模型,要求数据是单列的时间序列数据替换数据就可以用。 程序语言是matlab,需求最低版本为2018B及以上。 程序可以出真实值和预测值对比图,线性拟合图,可打印多种评价指标。 PS:以下效果图为测试数据的效果图,主要目的是为了显示程序运行可以出的结果图,具体预测效果以个人的具体数据为准。 4.

接着搭建轻量级卷积网络。注意这里用到了2019版才加入的layerNormalizationLayer,所以版本不能太低:
layers = [
sequenceInputLayer(1) % 单变量输入
convolution1dLayer(3, 64, 'Padding','same')
layerNormalizationLayer
reluLayer
convolution1dLayer(5, 32, 'Padding','same')
layerNormalizationLayer
reluLayer
flattenLayer
fullyConnectedLayer(128)
reluLayer
fullyConnectedLayer(1)
regressionLayer];
这个结构里藏着几个设计细节:首层卷积核用3点捕捉短期波动,第二层5点捕获稍长趋势。层标准化比批标准化更适合小批量时序数据。如果预测结果出现滞后,尝试在最后加LSTM层做混合模型。
训练参数设置直接抄作业:
options = trainingOptions('adam', ...
'MaxEpochs', 50, ...
'MiniBatchSize', 32, ...
'InitialLearnRate', 0.001, ...
'Plots', 'training-progress', ...
'ValidationData', {XTest, YTest}, ...
'ExecutionEnvironment','auto');
重点看预测和可视化部分。注意测试集预测时要逆标准化:
net = trainNetwork(XTrain, YTrain, layers, options);
pred = predict(net, XTest, 'ExecutionEnvironment','auto');
% 逆标准化还原量纲
pred = pred * std(rawData) + mean(rawData);
YTest = YTest * std(rawData) + mean(rawData);
% 绘制对比曲线
figure('Position',[100,100,800,600])
subplot(2,1,1)
plot(YTest,'LineWidth',1.5)
hold on
plot(pred,'--','LineWidth',1.2)
legend('真实值','预测值')
title('预测效果对比')
% 线性回归拟合图
subplot(2,1,2)
scatter(YTest, pred, 'filled')
hold on
plot([min(YTest),max(YTest)],[min(YTest),max(YTest)],'r--')
xlabel('真实值')
ylabel('预测值')
title(sprintf('拟合优度 R²=%.3f', 1 - sum((YTest - pred).^2)/sum((YTest - mean(YTest)).^2)))
最终输出的双图效果比单纯折线图更直观:左图看趋势匹配度,右图看数值偏差分布。评价指标计算建议加上这几项:
fprintf('RMSE: %.2f\nMAE: %.2f\nR²: %.3f\n',...
sqrt(mean((pred - YTest).^2)),...
mean(abs(pred - YTest)),...
1 - sum((YTest - pred).^2)/sum((YTest - mean(YTest)).^2));
实际跑个电力负荷数据集,某次运行得到RMSE=132.4,MAE=98.7,R²=0.936。注意这个效果仅供参考,各位替换数据时可能会出现:
- 预测曲线整体偏移 → 检查标准化是否漏掉逆变换
- 预测值滞后明显 → 尝试增加卷积核尺寸或加入注意力机制
- 波动幅度不足 → 在卷积层后添加max pooling增强特征提取
代码全量文件约80行,建议保存为.m脚本后直接替换数据路径开跑。遇到维度报错时重点检查窗口生成部分,确保输入是[样本数, 特征数, 序列长度]的三维格式——不过咱们的createWindowData已经处理成MATLAB需要的格式了。
更多推荐
所有评论(0)