%% 清理
clear,clc
%% 读入数据
file='BP预测偏差.xlsx';                  %命名
%Pass=xlsread(file,1,'A2:A1039');            %Pass前加%表示不启用该条语句，括号中的1代表sheet 1,引号中的内容表示2-1039行
V=xlsread(file,1,'B2:B1039');
T=xlsread(file,1,'C2:C1039');
H0=xlsread(file,1,'D2:D1039');
%H1=xlsread(file,1,'E2:E1039');  %因为有压下量，所以该条语句不启用，注释掉
r=xlsread(file,1,'E2:E1039');
B=xlsread(file,1,'F2:F1039');
C=xlsread(file,1,'G2:G1039');
Force=xlsread(file,1,'AA2:AA1039');
%Torque=xlsread(file,1,'I2:I1039');
data=[V,T,H0,r,B,C];                %把以上输入参数放在同一个矩阵,data包含6列，在TR命名中用：来调用
output=[Force];   %这是实测的，不是预测的，包含1列，后面在FR命名中用：来调用 
%% 划分数据（等号左边的是命名定义，右边是调用相应的函数赋值）
t=randperm(848);                            %是对848个行矢量顺序随机打乱
TR(1:848,:)=data(t,:);                 %TR是命名的矩阵，t是打乱后的所有行，：后是所有列，调用data去建矩阵，可以双击工作区的data看
FR(1:848,:)=output(t,:);                    %参与训练的输出，调用了output函数，代表列必须是force和torque,可以右击工作区查看
Te(1:190,:)=data(849:1038,:);                 %测试时要用到的输入参数
Fe(1:190,:)=output(849:1038,:);                %用于验证测试效果的实际输出
N = size(Fe,2);       
M = size(FR,2);  
%size函数，用于返回矩阵Fe的列数
%% 数据归一化
[tr,TS]=mapminmax(TR',0,1);         %创建归一化矩阵，TS是归一化时用到的参数，范围0-1。注意矩阵需要进行转置使数据对应
%%[te,ES]=mapminmax(Te',0,1);  
[fr,FS]=mapminmax(FR',0,1);         %创建归一化输出矩阵
te=mapminmax('apply',Te',TS);      %利用TS中的信息将Te归一化
%% 创建网络（两层，各层节点为7）
A=[7 7];                            
net=feedforwardnet(A);                    %自定义函数feedforwardnet创建一个前馈神经网络
net.trainFcn='trainbfg';                  %训练方法采用拟牛顿法
%% 设置训练参数
net.trainParam.epochs=1000;     %迭代次数
net.trainParam.goal=1e-3;       %目标
net.trainParam.lr=0.01;         %学习率
%%net.divideParam.trainRatio = 80/100;
%%net.divideParam.valRatio = 20/100;
%%net.divideParam.testRatio = 0/100;
%% 训练网络
net=train(net,tr,fr);                    %训练样本的输入、输出  
%% 测试 
t_sim1=sim(net,tr);                       %用形成的网络net对测试样本输入进行预测，t_sim是理论输出
t_sim2=sim(net,te);
%% 数据反归一化
T_sim1=mapminmax('reverse',t_sim1,FS);     %是反归一化的理论输出     
T_sim2=mapminmax('reverse',t_sim2,FS);     %是反归一化的理论输出     
%% 性能评价
errors1=abs(T_sim1-FR')./FR'; 
errors2=abs(T_sim2-Fe')./Fe'; 
rate1=1-errors1;  %正确率
rate2=1-errors2;  %正确率
fprintf('  正确率\n   %f %%\n', rate1*100);
fprintf('  正确率\n   %f %%\n', rate2*100);

%% 绘图 (一般用不到)
%%figure
%%plot(1:N,Fe','b:*',1:N,T_sim,'r-o')
%%legend('真实值','预测值')
%%xlabel('预测样本')
%%ylabel('轧制力')
%%string = {'测试集轧制力 预测结果对比';['R^2=' num2str(R2)]};
%%title(string)
