NAR(Neural Autoregressive) 神经网络是一种用于序列建模的神经网络模型。它通过对序列数据中的每个元素进行条件概率建模,来预测下一个元素。
NAR神经网络通常由两个主要组件构成:编码器和解码器。
-
编码器将输入序列映射到一个低维空间的表示。这个表示可以捕捉到序列中的关键特征。常用的编码器包括循环神经网络(如LSTM和GRU)、卷积神经网络(CNN)或自注意力机制(如Transformer)。
-
解码器根据前面的元素和编码器生成的表示来预测下一个元素。它通常是一个条件生成模型,使用先前的元素作为上下文来生成后续元素。解码器的输出可以是离散值(如词语、类别)或连续值(如时间序列的预测)。
NAR神经网络的训练过程通常使用最大似然估计方法,即最大化预测序列中每个元素的条件概率。在训练期间,通过将模型的预测与真实序列进行比较,并使用一种适当的损失函数来衡量它们之间的差异,来更新模型参数。
NAR神经网络在各种序列建模任务中都有广泛的应用,包括语言建模、机器翻译、语音识别、音乐生成等。它能够捕捉到序列中的长期依赖关系和上下文信息,从而提高序列预测和生成的能力。
以NAR预测单维度时间序列为例:
%% 用NAR神经网络求解自回归时间序列问题
clc;clear
%导入数据
xls=xlsread("氧气含量.xlsx");
X=xls(:,2); % 列向量,横坐标为指标,纵坐标为时间步
% 矩阵X转换为tonndata格式的时间序列数据
T = tonndata(X,false,false);
% 第一个参数X是输入的矩阵,是一个一维的数据。
% 第二个参数false表示不将输入数据作为预测值处理,即不将最后一列作为目标值。
% 第三个参数false表示不进行时间步长转换,即每个样本的所有时间步长都保持原样。
%% 选择训练函数
% For a list of all training functions type: help nntrain
% 'trainlm' is usually fastest. LM法训练
% 'trainbr' takes longer but may be better for challenging problems.
% 'trainscg' uses less memory. Suitable in low memory situations.
trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation.
% 创建一个非线性自回归网络
feedbackDelays = 1:21; % 时滞
hiddenLayerSize = 40; % 隐含层神经元个数
net = narnet(feedbackDelays,hiddenLayerSize,'open',trainFcn);
% 第一个参数feedbackDelays是一个向量,表示反馈延迟的步数。它指定了RNN中每个输入要回馈的时间步数。
% 第二个参数hiddenLayerSize是一个整数,表示隐藏层的大小。它指定了RNN模型中隐藏层的神经元数量。
% 第三个参数'open'指定了RNN的网络类型。在这里,'open'表示该RNN是一个开放型的网络,即没有输出限制。
% 第四个参数trainFcn表示训练函数,指定了用于训练RNN模型的算法。
%% 准备训练数据
[x,xi,ai,t] = preparets(net,{},{},T);
% 第一个参数net是之前创建的RNN模型。
% 第二个参数{}表示不使用先前时间步的输入序列(因为没有提供先前时间步的输入)。
% 第三个参数{}表示不使用先前时间步的目标序列(因为没有提供先前时间步的目标)。
% 第四个参数T是之前转换为tonndata格式的时间序列数据。
% 建立训练、验证、测试 数据占比
net.divideParam.trainRatio = 80/100;
net.divideParam.valRatio = 10/100;
net.divideParam.testRatio = 10/100;
%% 训练网络
[net,tr] = train(net,x,t,xi,ai);
% 测试网络
y = net(x,xi,ai);
e = gsubtract(t,y);
performance = perform(net,t,y)
% View the Network
% view(net)
% Plots
% Uncomment these lines to enable various plots.
%figure, plotperform(tr)
%figure, plottrainstate(tr)
%figure, ploterrhist(e)
%figure, plotregression(t,y)
%figure, plotresponse(t,y)
%figure, ploterrcorr(e)
%figure, plotinerrcorr(x,e)
%% 闭环网络
% % 使用该网络进行多步预测
% netc = closeloop(net);
% netc.name = [net.name ' - Closed Loop'];
% view(netc)
% [xc,xic,aic,tc] = preparets(netc,{},{},T);
% % xc=cell(0,17915);
% yc = netc(xc,xic,aic); % 预测
% closedLoopPerformance = perform(net,tc,yc) %性能
%
% result=cell2mat(yc);result=result';
%% 步进预测网络
nets = removedelay(net);
nets.name = [net.name ' - Predict One Step Ahead'];
% view(nets)
[xs,xis,ais,ts] = preparets(nets,{},{},T);
% stepAheadPerformance = perform(nets,ts,ys) % 性能
% 设置多步预测的步数
numSteps = 100; %设置为1,就是单步预测
% 进行多步预测迭代
futurePredictions = cell(1, numSteps);
prevX = xs;
for i = 1:numSteps
% 使用步进预测网络进行一步预测
ys = nets(prevX, xis, ais);
% 取得预测结果的最后一个值
futurePrediction = ys{end};
% 存储预测结果
futurePredictions{i} = futurePrediction;
% 更新输入序列,将预测结果添加到末尾,并删除最早的输入值
prevX = [prevX(2:end), futurePrediction];
end
RESULT=cell2mat(futurePredictions);
RESULT=RESULT';