📄 bp.m
字号:
%输入向量
fid=fopen('train_input.m','r');
X=fscanf(fid,'%f',[786,1])';
fclose(fid); %训练输入
fid2=fopen('test_input.m','r');
Xtest=fscanf(fid2,'%f',[30,1])';
fclose(fid2); %测试输入
%目标向量
fid1=fopen('train_flowoutput.m','r');
Y=fscanf(fid1,'%f',[786,1])';
fclose(fid1); %训练输出
fid3=fopen('test_flowoutput.m','r');
Ytest=fscanf(fid3,'%f',[30,1])';
fclose(fid3); %测试输出
%归一化
%归一到 0 和1 之间
[x,minp,maxp,y,mint,maxt] = prestd(X,Y);
[xt,minpt,maxpt,yt,mintt,maxtt] = prestd(Xtest,Ytest);
%训练
net=newff(minmax(x),[1,30,1],{'tansig','tansig','tansig'},'traingdx','learngdm','sse');
%minmax的作用是限定输入的范围,因为已经做过归一化,所以输入的范围在0和 1之间。
%这个范围比输入的范围大是可以的,举个例子,比方说归一化的数据是在[0.1, 0.9]之间,范围用[0,1]是可以的,比归一化后的范围如果小的话,就会出问题;
%24为隐层数节点数,可采用经验公式或试算法确定隐层数节点数;
net.trainParam.epochs=1000;
%训练次数
net.trainParam.goal=0.1;
%训练结束的目标,目标误差
net.trainParam.lr=0.1;
%这个是学习率
net.trainParam.show=50;
%结果训练50次显示一次
net=train(net,x,y);
%训练网络
youtput=sim(net,xt);
%仿真预测
ytrue=poststd(youtput,mintt,maxtt);
%反归一化
(Ytest-ytrue)./Ytest
%预测误差
plot((Ytest-ytrue)./Ytest)
error=mean(mean(abs((Ytest-ytrue)./Ytest)))
%(Ytest-ytrue)./Ytest是相对预测误差
%error是平均相对预测误差
pause
plot(Ytest,'go-');
hold on;
%plot(ytrue,'b*:');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -