%-----BP神经网络方法—
clear all;
clc;
%% -------数据处理模块------------------
data=load('sysc.txt');
%-----------------数据归一化处理----------
dmax=max(data);
dmin=min(data);
for i=1:length(data)
data1(i)=(data(i)-dmin)/(dmax-dmin);
end
for j=1:(length(data1)-2)
for i=1:2
datax(i,j)=data1(i+j-1); %输入数据
end
datay(j)=data1(j+2); %输出数据
end
trainP=datax(:,1:1200); %训练输入数据
trainT=datay(1:1200); %训练输出数据
preInput=datax(:,1201:1620); %预测输入数据
preOutput=datay(1201:1620); %目标数据
%% ----- 建立网络--------------
net=newff(minmax(trainP),[12 1],{'tansig','purelin'},'traingdx');
net.trainParam.epochs=800; %训练次数
net.trainParam.goal=0.005; %网络性能目标
net.trainParam.show=5; % 两次显示之间的训练次数
net.trainFcn = 'trainlm'; % 动量梯度下降算法
net.trainParam.lr=0.05; %学习训练速度
net=train(net,trainP,trainT); %训练网络
%预测阶段
%% 开始预测数据
preP=sim(net,preInput);
%% 反归一化处理
for i=1:length(preP) %对预测输出的数据进行反归一化
preOut(i)=preP(i)*(dmax-dmin)+dmin;
end
for i=1:length(preOutput) %对实际的数据进行反归一化
TrueData(i)=preOutput(i)*(dmax-dmin)+dmin;
end
%误差处理
errorMes=TrueData-preOut;
%% 作图比较
figure(1)
subplot(2,1,1);
plot(1:420,preOut,'r*',1:420,TrueData,'bo');
legend('predict','real');
title('预测值与真实值');
subplot(2,1,2);
plot(errorMes,'r');
title('预测值与真实值的绝对误差值');