matlab滚动预测,MATLAB:一步到位的神经网络时间序列预测

简介:我正在使用MATLAB的神经网络工具箱,试图将时间序列预测到未来的一步.目前我只是想预测一个简单的正弦函数,但希望在得到满意的结果后我能够继续进行更复杂的事情.

问题:一切似乎都运行良好,但预测的预测往往滞后一个时期.如果它只是输出一个时间单位延迟的系列,那么神经网络预测没有太大用处,对吗?

码:

t = -50:0.2:100;

noise = rand(1,length(t));

y = sin(t)+1/2*sin(t+pi/3);

split = floor(0.9*length(t));

forperiod = length(t)-split;

numinputs = 5;

forecasted = [];

msg = '';

for j = 1:forperiod

fprintf(repmat('\b',1,numel(msg)));

msg = sprintf('forecasting iteration %g/%g...\n',j,forperiod);

fprintf('%s',msg);

estdata = y(1:split+j-1);

estdatalen = size(estdata,2);

signal = estdata;

last = signal(end);

[signal,low,high] = preprocess(signal'); % pre-process

signal = signal';

inputs = signal(rowshiftmat(length(signal),numinputs));

targets = signal(numinputs+1:end);

%% NARNET METHOD

feedbackDelays = 1:4;

hiddenLayerSize = 10;

net = narnet(feedbackDelays,[hiddenLayerSize hiddenLayerSize]);

net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};

signalcells = mat2cell(signal,[1],ones(1,length(signal)));

[inputs,inputStates,layerStates,targets] = preparets(net,{},{},signalcells);

net.trainParam.showWindow = false;

net.trainparam.showCommandLine = false;

net.trainFcn = 'trainlm'; % Levenberg-Marquardt

net.performFcn = 'mse'; % Mean squared error

[net,tr] = train(net,inputs,targets,inputStates,layerStates);

next = net(inputs(end),inputStates,layerStates);

next = postprocess(next{1}, low, high); % post-process

next = (next+1)*last;

forecasted = [forecasted next];

end

figure(1);

plot(1:forperiod, forecasted, 'b', 1:forperiod, y(end-forperiod+1:end), 'r');

grid on;

注意:

函数’preprocess’只是将数据转换为记录的%差异,’postprocess’将记录的%差异转换回绘图. (检查编辑预处理和后处理代码)

结果:

蓝色:预测值

红色:实际值

谁能告诉我这里我做错了什么?或者可能会推荐另一种方法来实现预期的结果(正弦函数的无滞后预测,以及最终更混乱的时间序列)?非常感激您的帮忙.

编辑:

已经有几天了,我希望每个人都享受他们的周末.由于没有出现解决方案,我决定发布辅助函数’postprocess.m’,’preprocess.m’及其辅助函数’normalize.m’的代码.也许这将有助于让球滚动.

postprocess.m:

function data = postprocess(x, low, high)

% denormalize

logdata = (x+1)/2*(high-low)+low;

% inverse log data

sign = logdata./abs(logdata);

data = sign.*(exp(abs(logdata))-1);

end

preprocess.m:

function [y, low, high] = preprocess(x)

% differencing

diffs = diff(x);

% calc % changes

chngs = diffs./x(1:end-1,:);

% log data

sign = chngs./abs(chngs);

logdata = sign.*log(abs(chngs)+1);

% normalize logrets

high = max(max(logdata));

low = min(min(logdata));

y=[];

for i = 1:size(logdata,2)

y = [y normalize(logdata(:,i), -1, 1)];

end

end

normalize.m:

function Y = normalize(X,low,high)

%NORMALIZE Linear normalization of X between low and high values.

if length(X) <= 1

error('Length of X input vector must be greater than 1.');

end

mi = min(X);

ma = max(X);

Y = (X-mi)/(ma-mi)*(high-low)+low;

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于BP神经网络时间序列预测是一种常用的预测方法,它可以通过训练神经网络模型来学习时间序列数据的内在模式和趋势,并用于未来的预测。基本步骤如下: 1. 数据准备:将时间序列数据按照一定的时间窗口进行切分,形成输入和输出的训练样本。例如,将前n个时间步的数据作为输入,第n+1个时间步的数据作为输出。 2. 网络设计:选择BP神经网络的结构,包括输入层、隐藏层和输出层的节点数。隐藏层的节点数和层数可以根据问题的复杂性进行调整。 3. 初始化权重和偏置:随机初始化神经网络中的权重和偏置参数。 4. 前向传播:将输入样本输入到神经网络中,通过前向传播计算每个节点的输出值。 5. 计算误差:将神经网络的输出值与实际输出值进行比较,计算误差值。 6. 反向传播:根据误差值,使用反向传播算法调整神经网络中的权重和偏置,以减小误差。 7. 更新参数:通过梯度下降等优化算法,更新神经网络中的权重和偏置参数。 8. 重复训练:重复进行步骤4-7,直到达到预设的训练次数或达到某个停止准则(如误差小于某个阈值)。 9. 预测未来值:使用训练好的神经网络模型,输入未来的时间步,通过前向传播计算得到预测值。 在MATLAB中,可以使用相关的函数和工具箱来实现基于BP神经网络时间序列预测。例如,可以使用MATLAB中的neural network toolbox来搭建和训练BP神经网络模型,并使用该模型进行时间序列的预测。通过编写相应的代码,可以按照上述步骤进行数据准备、网络设计、参数初始化、前向传播、误差计算、反向传播、参数更新等操作,最终得到时间序列的预测结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【BP时序预测】基于BP神经网络时间序列预测matlab完整代码](https://blog.csdn.net/Matlab_dashi/article/details/131624158)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值