看到你之前关于matlab神经网络多步滚动预测的提问,你说你解决了。我想问你具体的程序如何,谢谢。

 我来答
LXQsd
2011-03-04 · TA获得超过675个赞
知道小有建树答主
回答量:374
采纳率:0%
帮助的人:202万
展开全部
奇怪,百度还多这样的功能。

其实是一个比较取巧的方法,是从训练数据从新编排入手的,举例来说,你就只有一列数据,例如自然数列,1,2,3,4,5,6,7,你把数列从新编成一个矩阵
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
矩阵前两列做训练的输入矩阵p,第三列做输出那个t,然后训练网络直到满足你的条件
这样训练后的网络就可以用了,当你想预测第八个数的时候,仿真输入6 7,他就预测第八个数,假设输出是8,想继续预测第九个数,把预测的8和之前的7组成新矩阵,也就是输入7 8,他就会出第九个数,9

至于你要的矩阵是2列,3列,4列就随便了,看你的结果和之前的那几个数相关大的,按需要组矩阵吧
上面也可以用
1 2
2 3
3 4
……
这样的矩阵,第一列p,第二列t,来训练,这样就是一输入一输出了

原理都一样,这是多步预测,误差其实越到后面越大
滚动预测就是把新预测的数再放进数列里面,当作这数列是新的,再做新训练和仿真

其实新编矩阵很简单了,for循环就可以,然后归一化,再训练,最后仿真
追问
这些原理我也清楚,就是编程不太会,你能针对你上面举得的例子写一个简单的程序命令吗?用BP神经网络,谢谢。因为写论文需要,比较急
追答
嗯,其实我不是学计算机的,只是有些数据要处理,所以自己找资料,下面是我之前做研究时候用的部分代码,可以运行,但没怎么优化过,一般应用我想应该可以吧,如果有错的请指出
数据重组矩阵的代码如下:
clear all
load data.txt
a=data;
b=a
[q,r]=size(b)
temp=b
jz=1;
for (i=1:jz)
b1=b(i+1:q,:)
b2=zeros(i,r)
b3=[b1;b2]
c=[temp';b3']'
temp=c
end
f=c(1:q-i,:)
说明一下,f就是重组后矩阵,jz的值是控制重组后的列数,注意列数是jz+1,不清楚的用matlab运行一次看结果就可以
p=f(:,1:r*i)';
t=f(:,r*i+1:r*(i+1))';
[pn,ps]=mapminmax(p,0,1);
[tn,ts]=mapminmax(t,0,1);
pr=minmax(pn);
net=newff(pr,[2,1],{'tansig','purelin'},'trainlm');
net.trainparam.goal=1e-15;
net.trainparam.epochs=10000;
net.trainparam.min_grad=1e-10;
net.trainparam.time=15;
[net,tr]=train(net,pn,tn);
上面的代码都很常规,bp网络一般都打这些,我直接复制来了
下面是多步预测:
g=c(q-i+1,1:r*i)'
for (j=1:3)
[gn,gs]=mapminmax('apply',g,ps);
out=sim(net,gn);
out2=mapminmax('reverse',out,ts)
g=mapminmax('reverse',gn,ps);
g(1,:)=[];
g=[g;round(out2)];
end

说明一下,最后用round是因为我明确知道这是自然数列,一般不用round,除非你的结果要整数的。上面是多步预测,循环多少次就预测多少步,不过越到后面误差越大,用其他数列试试就很清楚了

关于滚动预测,就是把g再接到f的后面,形成一个新的矩阵,在执行前面第二块的那堆代码训练,训练完以后再仿真便OK,简单说,把训练那块放到循环里,就是滚动预测了。

一般来说,滚动预测比多步预测准确那么一点点,但耗费的时间多很多,而且我这代码是很简陋的,训练时有机会落入局部最小造成失真,所以要对训练效果做检验的,不过不想写的太复杂了,检验部分省略了,而且针对不同的数据,检验也不一定相同,楼主按自己需要再修改吧

这些代码我试过了,能预测,我的是matlab2010b版本,
来自:求助得到的回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式