www.pudn.com > EPO-BP.rar > myBP.m, change:2015-06-19,size:2412b


close all 
clear all 
clc 
%导入原始测量数据 
p=xlsread('salinity various.xlsx','汇总',['B2: DQ2023']);  
t=xlsread('salinity various.xlsx','汇总',['B2024: DQ2024']); 
%p=xlsread('EPOresult.xlsx','10',['A2: BYS13']);  
%t=xlsread('EPOresult.xlsx','10',['BYT2: BYT13']); 
%p=p'; 
%t=t'; 
 %对原始数据进行规范化处理,prestd是对输入数据和输出数据进行规范化处理, 
 %prepca可以删除一些数据,适当地保留了变化不小于0.01的数据 
 [pn,meanp,stdp,tn,meant,stdt]=prestd(p,t); 
 %[ptrans,transMat]=prepca(pn,0.001); 
 fprintf('标准化结果如下:\n') 
v1=cwstd(p') 
result=cwcoe(v1); 
ptrans=p'*result; 
% ptrans=xlsread('salinity various pcaresult.xlsx','Sheet1',['A1: D120']); 
 ptrans=ptrans'; 
 [R,Q]=size(ptrans)  
 %将原始数据分成几个部分作为不同用途四分已用于确证,四分一用于测试,二分一用于训练网络 
 iitst=2:4:Q; 
 iival=4:4:Q; 
 iitr=[1:4:Q 3:4:Q]; 
 %vv是确证向量,.P是输入,.T是输出,vt是测试向量 
 vv.P=ptrans(:,iival);  
 vv.T=tn(:,iival); 
 vt.P=ptrans(:,iitst);  
 vt.T=tn(:,iitst); 
 ptr=ptrans(:,iitr);  
 ttr=tn(:,iitr); 
 %建立网络,隐层中设计5个神经元,由于需要得到的是1个目标,所以网络需要有1个输出 
 net=newff(minmax(ptr),[16 1],{'tansig' 'purelin'},'trainlm'); 
 %训练网络 
 net.trainParam.show=5; 
 [net,tr]=train(net,ptr,ttr,[],[],vv,vt); 
 %绘出训练过程中各误差的变化曲线 
 plot(tr.epoch,tr.perf,'r',tr.epoch,tr.vperf,':g',tr.epoch,tr.tperf,'-.b'); 
 legend('训练','确证','测试',-1); 
 ylabel('平方误差'); 
 xlabel('时间'); 
 pause; 
 %将所有数据通过网络(包括训练,确证,测试),然后得到网络输出和相应目标进行线性回归, 
 %对网络输出进行反规范化变换,并绘出个各级别的线性回归结果曲线 
 an=sim(net,ptrans); 
 a=poststd(an,meant,stdt); 
 a=a'; 
 t=t'; 
 y1max=max(a); %求预测值的最大值 
y2max=max(t); %求观测值的最大值 
ymax=max([y1max;y2max]) %求预测值和观测值的最大值 
 result=cat(2,t(:,1),a(:,1)); 
 cancha=a-t; %计算残差 
R2=corrcoef(t,a); 
R2=R2(2,1) 
RMSE=sqrt(mean(cancha.*cancha)); 
RPD=std(t,0,1)/RMSE; 
MRE=mean(abs(cancha)./t); 
assessment=[R2,RMSE,MRE,RPD]; 
%画直线y=x,并画预测图 
plot(0:ymax,0:ymax,a(:,1),t(:,1),'*') 
xlabel('Measured soil salt content(%)') 
ylabel('Predicted soil salt content(%)') 
%title('盐分EPO-PLS结果') %添加图像标题 
xlswrite('D:\Matlab\ANN\myBP\EPO-ANNresult.xlsx',result,11); 
xlswrite('D:\Matlab\ANN\myBP\EPO-ANNresult.xlsx',assessment,1,'D13'); 
  
 %得到3组输出,所以进行3次线性回归 
 for i=1:1 
 figure(i) 
 [m(i),b(i),r(i)] = postreg(a(i,:),t(i,:)); 
 end