查看: 32034|回复: 29|关注: 0

NARX和NAR时间序列神经网络如何预测

[复制链接]

新手

10 麦片

财富积分


050


10

主题

65

帖子

0

最佳答案
  • 关注者: 7
发表于 2015-2-2 23:04:53 | 显示全部楼层 |阅读模式
本帖最后由 花卫国 于 2015-2-4 11:35 编辑

关于NAR时间序列神经网络的预测问题,math之后的帖子还是对问题进行了补充https://www.ilovematlab.cn/forum.php?mod=viewthread&tid=132940
但这个帖子里您提到的一次性预测,不知道是不是指的NAR时间序列神经网络预测呢?因为这里面的代码您一笔带过没有解释,包括我在内很多同学还没有完全里面代码的含义,在论坛内搜索相关帖子也全是以网友的疑惑结尾,
因此斗胆发一个归纳贴,希望math以及其他看到的大神可以给我们这些论坛初学者们一点些指点,先谢了。


math提供的代码
这种预测方式是Matlab所独特的,因为matlab提供了相应的函数,帮你把数据进行了shift,
[p1,Pi1,Ai1,t1] = preparets(narx_net_closed,u1,{},y1);
yp1 = narx_net_closed(p1,Pi1,Ai1);
plot([cell2mat(yp1)' cell2mat(t1)'])

网友1提供的代码
不好意思,我也是新手,我是按照Math老师的第二种方法可以预测。Matlab本身提供了preparets函数用于数据准备,我将Demo中的操作脚本输出后其中的两句应该是做预测吧。
[xs,xis,ais,ts] = preparets(nets,inputSeries,{},targetSeries);  准备预测的数据
ys = nets(xs,xis,ais);   做预测
至于Math老师的第一种方法我也没太看懂,大家共同学习!


网友2提供的代码
只是我自己试出来的,不代表专业的啊……做论文做到头疼……
prepares
使用的数据格式是cell,也就是数列,需要是横向的数列才能进行归一处理。

(P,Ai,Pi,T)=prepares(net,ui,{},yi)中,=号前面的不需要输入,会自动生成,ui是训练输入,yi是训练输出,如果你的需要直接预测,只要有ui,可以将yi设为0,需要注意ui的数量与yi的数量必须一致,否则会报错。之后可以直接使用Math老师的绘图语句。想要看到值可以直接看yp1,也可以用语句输出。

网友3提供的代码
这里我已经明白了,创建神经网络后,inputSeriestargetSeries需要转换下类型,in = tonndata(f_x,false,false);
out = tonndata(f_y,false,false);
>> [x1,xi1,ai1,t1
] = preparets
(nets,in,{},out);
ys = nets(x1,xi1,ai1);
>> plot(cell2mat(ys)',cell2mat(t1)');
这样就可以看到预测了


网友4提供的代码
netc =removedelay(net);
[inputsP,inputStatesP,layerStatesP,targetsP] =preparets(netc,inputSeriesP,{},targetSeriesP);
outputsP = sim(netc, inputsP);
这样子可以,我刚刚试了,运行没问题


几周和论坛的学习后,预测代码如下,希望指正,共同学习:

NARX预测代码:
netc = removedelay(net);
inputSeries1 = tonndata(input_test,true,false);
targetSeries1 = tonndata(output_test,true,false); %假设delay设置的3,最近的输入时Xn,最近的输出是Yn,input_test=[Xn-1,Xn,Xn+1],output_tests=[Yn-1,Yn,0]
[xs,xis,ais,ts] = preparets(netc,inputSeries1,{},targetSeries1);
y1 = netc(xs,xis,ais);

NAR预测代码:
netc=removedelay(net);
targetSeries1=tonndata(output_test ,true,false);%假设delay设置的3,最近的输出是Yn,output_tests=[Yn-1,Yn,0]
[xs1,xis1,ais1,ts1]=preparets(netc,{},{},targetSeries1);
y1 = netc(xs1,xis1,ais1)


另外,注意由于preparets的关系,input_test、output_test必须是横向的











NAR网络结构图

NAR网络结构图
回复主题 已获打赏: 0 积分

举报

新手

12 麦片

财富积分


050


1

主题

15

帖子

0

最佳答案
  • 关注者: 1
发表于 2015-2-3 09:30:25 | 显示全部楼层
我和楼主遇到一样的问题,也在自己琢磨中,探讨下
第一步:netc=closeloop(net);我理解为训练时用的闭环网络。netc =removedelay(net);为预测时用的。
便于区分可以写成nets =removedelay(net);预测时调用nets网络
第二步:netc.name=[net.name'-Closed Loop'];各人理解就是将前面建立的net网络闭合,并命名为netc用于网络训练。
第三步:NAR时间序列的预测用两行就OK了。
[xs,xis,ais,ts] = preparets(nets,inputSeries,{},targetSeries);  准备预测的数据
ys = nets(xs,xis,ais);   做预测

targetSeries该录入什么数据呢?这点在预测时,有人说建立inputSeries相同的数量的数列并设置为0。有人成功了,我没有,运行报错,原因还没有研究。

目前个人理解是,时间序列网络用narxnet网络建立,预测时有点麻烦,需要把数字转换为数列。nets为预测网络
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


10

主题

65

帖子

0

最佳答案
  • 关注者: 7
 楼主| 发表于 2015-2-3 10:31:37 | 显示全部楼层
hefeiwx 发表于 2015-2-3 09:30
我和楼主遇到一样的问题,也在自己琢磨中,探讨下
第一步:netc=closeloop(net);我理解为训练时用的闭环网 ...

关于targetSeries的录入跟你分享点收集的资料:
其實是有 target 的,target 就是 input 扣掉 delay數
如輸入1~10,delay=3,目標就是4~10
因為結構的關係,結構圖看底下的連結。-来自15楼,https://www.ilovematlab.cn/thread-259530-2-1.html
另外问下你,闭环网络和网络闭合类似这个概念是什么意思,参考我这个帖子https://www.ilovematlab.cn/thread-318688-1-1.html,是不是net结构图隐含层里的(1:7)闭合后就变成(0
:6)了?这个0:6你知道什么意思吗。
回复此楼 已获打赏: 0 积分

举报

新手

12 麦片

财富积分


050


1

主题

15

帖子

0

最佳答案
  • 关注者: 1
发表于 2015-2-3 11:11:44 | 显示全部楼层
本帖最后由 hefeiwx 于 2015-2-3 11:15 编辑
花卫国 发表于 2015-2-3 10:31
关于targetSeries的录入跟你分享点收集的资料:
其實是有 target 的,target 就是 input 扣掉 delay數
  ...

谢谢提供的资料,看了又明白了点。

1:7估计你设计网络时设定是输出Y与前面Y(t-1)和Y(t-2)到Y(t-6)相关,换句话说就是你预测今天的到Y值是与前面6天的Y值相关的,总共是7个Y值。

这个和闭合不闭合没有关系,就是说你要预测今天的Y值,你的输入值X为7个输入值,Y值等于你的输入X值的个数减去相关天数,就是7-6=1。所以当你的targetSeries小于7就回运行报错
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


10

主题

65

帖子

0

最佳答案
  • 关注者: 7
 楼主| 发表于 2015-2-4 10:55:20 | 显示全部楼层
本帖最后由 花卫国 于 2015-2-5 20:11 编辑

几天学习后,自己答复一下:
代码如下
netc=removedelay(net);%预测必须的步骤
targetSeries1=tonndata(output_test ,true,false);%假设你的delay设置为3,output_test=[Yn-2,Yn-1,Yn,0]
[xs1,xis1,ais1,ts1]=preparets(netc,{},{},targetSeries1);
y1 = netc(xs1,xis1,ais1)
另外,注意由于preparets的关系,targetSeries1、以及其(tonndata)转换前的output_test必须是横向的
但是我计算出来预测值y1是两个数组,且第一个值比较像预测值,后一个值就不明白了,还在继续学习中 ……qq:250947504,欢迎交流
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


10

主题

65

帖子

0

最佳答案
  • 关注者: 7
 楼主| 发表于 2015-2-4 11:13:54 | 显示全部楼层
本帖最后由 花卫国 于 2015-2-5 20:11 编辑

算出了预测值,但不知道是否正确,把预测的代码贴出来,欢迎指正共同学习:
NARX预测代码:
netc = removedelay(net);
inputSeries1 = tonndata(input_test,true,false);
targetSeries1 = tonndata(output_test,true,false); %假设delay设置的3,最近的输入时Xn,最近的输出是Yn,input_test=[Xn-2,Xn-1,Xn,Xn+1],output_tests=[Yn-2,Yn-1,Yn,0]
[xs,xis,ais,ts] = preparets(netc,inputSeries1,{},targetSeries1);
y1 = netc(xs,xis,ais);

NAR预测代码:
netc=removedelay(net);
targetSeries1=tonndata(output_test ,true,false);%假设delay设置的3,最近的输出是Yn,output_tests=[Yn-2,Yn-1,Yn,0]
[xs1,xis1,ais1,ts1]=preparets(netc,{},{},targetSeries1);
y1 = netc(xs1,xis1,ais1)

另外,注意由于preparets的关系,targetSeries1、以及其(tonndata)转换前的output_test必须是横向的
同样,两个NARX、NAR
网络我计算出来预测值y1也都是两个数组,还在继续学习中 ……qq:250947504,欢迎交流



补充内容 (2015-5-29 10:06):
纠正一下上面两种预测代码中,假设delay设置的3,最近的输出是Yn,output_tests应该是=[Yn-1,Yn,0],不是[Yn-2,Yn-1,Yn,0],希望没有给大家带来不便
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


10

主题

65

帖子

0

最佳答案
  • 关注者: 7
 楼主| 发表于 2015-2-4 11:20:03 | 显示全部楼层
hefeiwx 发表于 2015-2-3 11:11
谢谢提供的资料,看了又明白了点。

1:7估计你设计网络时设定是输出Y与前面Y(t-1)和Y(t-2)到Y(t-6) ...

解释第一个问题,后来看了下math的视频,1:7 应该是代表,当前输出由Y(n-1),Y(n-2), ……,Y(n-7),其中的":",表示:从1到7
回复此楼 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


0

主题

8

帖子

0

最佳答案
发表于 2015-4-27 09:48:07 | 显示全部楼层
看了楼主的帖子和各位的回复以后,自己又明了了一些。不过大家有没有发现如果用preparets函数与数据进行预处理时,inputdata只能是一组数据?我要利用多组数据来预测一组数据,卡在这边(preparets函数不停报错)不知道如何继续……
回复此楼 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


8

主题

20

帖子

0

最佳答案
发表于 2015-7-1 10:43:43 | 显示全部楼层
本帖最后由 pseudoscie 于 2015-7-1 10:48 编辑

你好,我是个新手,请帮我,遇到下面问题,怎么激活,多谢!!

matlab2013a 的ntstool工具箱界面next按钮点不了。我在GUI Wizard 的三个选项里已经选择了一个,之后提示点‘next’按钮,但却没有反应;之前已经在preference的界面里'enable toolbox path cache'三项全选了,并且重启机了,还不行!!!谁能帮我?H:\noactive.bmp

noactive.rar

50.36 KB, 下载次数: 20

对应截图

回复此楼 已获打赏: 0 积分

举报

新手

7 麦片

财富积分


050


7

主题

94

帖子

0

最佳答案
发表于 2015-8-22 13:28:47 | 显示全部楼层
花卫国 发表于 2015-2-4 10:55
几天学习后,自己答复一下:
代码如下
netc=removedelay(net);%预测必须的步骤

楼主,请问是有几个预测值Yn最后就有几个0吗?
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /5 下一条

快速回复 返回顶部 返回列表