发布网友 发布时间:2022-05-01 09:56
共1个回答
热心网友 时间:2023-10-05 12:28
奇怪,百度还多这样的功能。追答嗯,其实我不是学计算机的,只是有些数据要处理,所以自己找资料,下面是我之前做研究时候用的部分代码,可以运行,但没怎么优化过,一般应用我想应该可以吧,如果有错的请指出
数据重组矩阵的代码如下:
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版本,
来自:求助得到的回答