手把手玩转MATLAB时间序列预测:NAR神经网络实战
今天给大家分享一套开箱即用的代码,数据格式就用最常见的Excel表格,复制粘贴就能跑通。隐藏层用了10个神经元,这个数不是固定的,数据量大的话可以适当增加,但别贪多否则容易过拟合。实际跑出来的效果,如果数据周期性明显(比如用电负荷的日周期、周周期),预测曲线会和真实值贴合得比较紧。遇到过的一个坑是:当数据有突变点时,预测结果可能会"惯性滞后"。比如原始数据是[1,2,3,4,5],设置滞后阶数为2
时间序列nar自回归神经网络预测matlab程序代码 。 代 码直接运行即可,数据excel格式。
最近在研究电力负荷预测的时候,发现MATLAB的NAR神经网络用起来真香。直接把时间序列数据喂进去,不用做复杂的特征工程就能出效果。今天给大家分享一套开箱即用的代码,数据格式就用最常见的Excel表格,复制粘贴就能跑通。

先看数据准备部分。假设我们有一列名为"负荷"的历史数据(保存为data.xlsx),读取后先做个归一化处理:
% 读取Excel数据(第一列)
rawData = xlsread('data.xlsx');
data = rawData(:,1);
% 数据归一化到[-1,1]
[normalizedData, ps] = mapminmax(data', -1, 1);
normalizedData = normalizedData';
归一化这步挺关键,特别是当数据量级差异大时,能避免神经网络训练时梯度爆炸。这里用mapminmax函数把数据压缩到[-1,1]区间,ps对象留着后面反归一化用。
接下来是构建NAR网络的核心代码:
% 设置时间滞后阶数(看前5个时间点预测下一个)
inputDelay = 1:5;
hiddenLayerSize = 10; % 隐藏层神经元数
% 创建NAR网络
net = narnet(inputDelay, hiddenLayerSize);
% 数据集划分比例
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% 训练参数设置
net.trainParam.showWindow = true; % 不显示训练窗口
net.trainParam.showCommandLine = true; % 显示训练进度
net.trainParam.epochs = 1000; % 最大训练次数
这里有几个有意思的点:inputDelay控制着模型回溯的时间步长,类似于ARIMA模型里的p参数。设置成1:5表示用前5个时间点的值预测下一个值。隐藏层用了10个神经元,这个数不是固定的,数据量大的话可以适当增加,但别贪多否则容易过拟合。

训练过程我们用了早停法(通过验证集监控),避免训练次数太多导致过拟合。来看训练代码:
% 准备训练数据
[Xs, Xi, Ai, Ts] = preparets(net, {}, {}, normalizedData);
% 开始训练!
[net, tr] = train(net, Xs, Ts, Xi, Ai);
% 预测未来10个时间点
predictionSteps = 10;
[netc, Xic, Aic] = preparets(net, {}, {}, normalizedData(1:end-predictionSteps));
ypred = netc(normalizedData(end-predictionSteps+1:end), Xic, Aic);
preparets这个函数特别重要,它把原始数据转换成神经网络需要的滞后格式。比如原始数据是[1,2,3,4,5],设置滞后阶数为2时,会生成输入样本:[[1,2]→3, [2,3]→4]这样的结构。
最后做个结果可视化和误差计算:
% 反归一化恢复原始量纲
predictedData = mapminmax('reverse', cell2mat(ypred), ps);
% 画对比曲线
figure
plot(data, 'b-', 'LineWidth', 2)
hold on
plot(length(data)-predictionSteps+1:length(data), predictedData, 'r--o')
legend('实际值', '预测值')
% 计算RMSE
rmse = sqrt(mean((data(end-predictionSteps+1:end) - predictedData').^2));
fprintf('RMSE: %.2f\n', rmse);
实际跑出来的效果,如果数据周期性明显(比如用电负荷的日周期、周周期),预测曲线会和真实值贴合得比较紧。遇到过的一个坑是:当数据有突变点时,预测结果可能会"惯性滞后"。这时候可以尝试增大inputDelay的阶数,或者加入外部影响因素(不过那就是NARX模型的范围了)。

这套代码最爽的地方在于改改Excel文件就能适配各种时间序列场景——股票价格预测、天气预测、设备振动监测都试过,改几个参数就能跑起来。想要更骚的操作,还可以试试把LSTM层替换进去,不过那就是另一个故事了。
更多推荐
所有评论(0)