BP神经网络:feedforwardnet版回归预测

程序相关说明:

input:预处理后的训练集数据 (60 by 14731)

output:预处理后的训练集标签(1 by 14731)

input_test:预处理后的测试集数据(60 by 100)

output_test:测试集数据经模型拟合后的结果(1 by 100)

BPoutput:反归一化,得到数据本身数量级的值(1 by 100

net:训练后的网络

注:与newff相比,多出一个output_test量!

feedforwarnet将样本自动分为training、validation、test。

output_net:将input做输入,经过训练后的网络,得到输出结果。(1 by 14731

它与output作比较,可以对训练得到的模型进行初步评估。

%% 模型训练
% Author:Huberry
% Date:2017.11.23
tic
clear;
clc;
format compact;
%% 加载数据集 输入输出均归一化处理
load('train_FD001_trainData.mat','trainData','trainLabel')
load('train_FD001_regressPara.mat','HI_regress');    %线性回归参数
[input,setting1] = mapminmax(trainData');
[output,setting2] = mapminmax(trainLabel');
% 测试单元样本集
load('train_FD001_testData','testData','RUL_FD001');
input_test = mapminmax('apply',testData',setting1);
% newff版本
% %创建BP网络
% net = newff(input,output,15,{'tansig','purelin'},'traingdm');
% net.divideFcn = '';
% net.trainparam.show = 50;
% net.trainparam.epochs = 20000 ;
% net.trainparam.goal = 0.01 ;
% net.trainParam.lr = 0.01 ;
% %训练网络模型
% [net,tr] = train(net,input,output);
% %记录模型权值和阈值
% weigh1=net.iw{1,1};
% bias1=net.b{1,1};
% weigh2=net.lw{2,1};
% bias2=net.b{2,1};
% save('BpPara','net','weigh1','bias1','weigh2','bias2');
% feedforwardnet版本
net = feedforwardnet(12,'traingdm');
% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 0.9;
net.divideParam.valRatio = 0.1;
net.divideParam.testRatio = 0;
net.trainParam.max_fail=100;
net.performFcn = 'mse';
net.plotFcns = {'plotperform','plottrainstate','ploterrhist', ...
  'plotregression', 'plotfit'};
[net,tr] = train(net,input,output);
output_net = net(input);
performance = perform(net,output,output_net);  % 根据设定的net.performFcn 
% Recalculate Training, Validation and Test Performance获得训练验证和测试的结果
trainTargets = output.* tr.trainMask{1};
valTargets = output.* tr.valMask{1};
testTargets = output.* tr.testMask{1};
trainPerformance = perform(net,trainTargets,output_net)
valPerformance = perform(net,valTargets,output_net)
testPerformance = perform(net,testTargets,output_net)
%% 测试
output_test = sim(net,input_test);
BPoutput = mapminmax('reverse',output_test,setting2); 
disp('网络模型与实际RUL之间的MSE:')
mse(RUL_FD001'-BPoutput)
% 绘图
view(net)
figure(1)
plot(BPoutput,':or')
hold on
plot(RUL_FD001,'-*')
legend('预测RUL值','实际RUL值');
title('模型输出','fontsize',12);
toc

注释:

1、关于training、validation、test

参考:http://www.ilovematlab.cn/thread-68797-1-1.html

training set是训练样本数据;validation set是验证样本数据;test set是测试样本数据。在训练时,用training训练,每训练一次,系统自动会将validation set中的样本数据输入神经网络进行验证,在validation set输入后会得出一个误差(不是网络的训练误差,而是验证样本数据输入后得到的输出误差,可能是均方误差),而此前对validation set会设置一个步数,比如默认是6echo,则系统判断这个误差是否在连续6次检验后不下降,如果不下降或者甚至上升,说明training set训练的误差已经不再减小,没有更好的效果了,这时再训练就没必要了,就停止训练,不然可能陷入过学习。所以validation set有个设置步数,作用就在这里。

实际使用中,经常出现Validation checks很快达到6此变停止的情况!

解决方法:

(1)net.divideFcn=' ';  样本只做为训练集使用

(2)net.trainParam.max_fail=100;  改变默认值6

本程序因为有单独的测试集,故将net.divideParam.testRatio设置为0。


2、关于mse

mse大小的判断是相对于输出数据的数量级来共同决定的。

比如数据所在范围是0-1之间,而mse值为0.2,此时mse值可能并不理想。

但是,如果数据均为大于100的数据,mse为0.2时,效果应该是不错的。


3、几个小说明

net.plotFcns 表示程序运行结束后,显示的nntraintool工具箱中Plots部分显示哪些内容;

view(net) 显示你的网络结构;










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章