NAR神经网络时间序列预测

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';
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
NAR(Nonlinear AutoRegressive)模型是一种用于预测时间序列的非线性自回归模型。它基于过去的观测值来预测未来的值,并且可以捕捉到时间序列中的非线性关系。 以下是一个简单的NAR模型预测时间序列的代码示例: ```python import numpy as np from sklearn.neural_network import MLPRegressor # 生成示例时间序列数据 def generate_data(): x = np.linspace(0, 10, 100) y = np.sin(x) + np.random.normal(0, 0.1, 100) return x, y # 构建NAR模型 def build_nar_model(x, y): # 将时间序列数据转换为自回归形式 lag = 5 # 自回归阶数 X = [] Y = [] for i in range(len(y) - lag): X.append(y[i:i+lag]) Y.append(y[i+lag]) X = np.array(X) Y = np.array(Y) # 构建多层感知机回归模型 model = MLPRegressor(hidden_layer_sizes=(10, 10), activation='relu', solver='adam', max_iter=1000) model.fit(X, Y) return model # 预测未来的时间序列值 def predict_future_values(model, x, y): lag = 5 # 自回归阶数 last_x = y[-lag:] # 最后lag个观测值 future_x = [] for i in range(10): # 预测未来10个时间步长的值 future_y = model.predict([last_x]) future_x.append(x[-1] + (x[1] - x[0])) # 假设时间步长为常数 last_x = np.concatenate((last_x[1:], future_y), axis=0) future_x = np.array(future_x) return future_x # 主函数 def main(): x, y = generate_data() model = build_nar_model(x, y) future_x = predict_future_values(model, x, y) print("预测未来的时间序列值:", future_x) if __name__ == '__main__': main() ``` 这段代码使用了Python的NumPy库和Scikit-learn库中的MLPRegressor类来构建NAR模型,并使用示例数据进行训练和预测。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苗半里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值