Matlab搭建bp神经网络实现数据预测
- BP神经网络介绍
- matlab程序实现
- 运行结果
- 总结
BP神经网络介绍
BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络,由于BP神经网络已经面世很久了,具体原理在这里就不做赘述了,网上也有很多资源讲解相关原理的。本篇博客主要针对于如何用matalb 实现BP神经网络的搭建以及进行数据预测。
matlab程序实现
%下面的程序共训练了三个BP神经网络,分别用不同的数据进行训练
%load Third_Q_2;//数据集
CT = dt';%训练数据,将数据变成6*n 的格式(6维的数据)
CTL = dtl';%label ,1*n,一维的输出
[n,m] = size(dt);%n = 总共元素的个数
CT_1 = CT(1:6,fix(1:0.6*n));%60%,20%,20% for 第一个神经网络,第二个神经网络,第三个神经网络
CT_2 = CT(1:6,fix(0.6*n+1):fix(0.8*n));
CT_3 = CT(1:6,fix(0.8*n+1):end);
CL_1 = CTL(1,1:fix(0.6*n));
CL_2 = CTL(1,fix(0.6*n+1):fix(0.8*n));
CL_3 = CTL(1,fix(0.8*n+1):end);
n1 = 1:fix(0.6*n);% number of 0.6
for i = 1:5:fix(0.6*n*0.8-5)%筛选百分之80的数据作为训练集
n1(:,i) = [] ;
end
[T1,mint1,maxt1,L1,minl1,maxl1]= premnmx(CT_1,CL_1);%归一化
CT_1_train = T1(1:6,n1);%训练集
CL_1_train = L1(1,n1);%训练集的标签
net1_1 = newff(minmax(T1),[6,8,4,1],{'tansig','tansig','tansig','purelin'},'trainlm');%新建一个神经网络,输入6维数据,输出一维,共有三个隐藏层,每层分别有6,8,4个神经元,隐藏层的激活函数为‘tansig’,也可以选择‘logsig’,输出层的激活函数为线性激活函数‘purelin’
%设置训练次数
net1_1.trainParam.epochs = 500;
%设置收敛误差
net1_1.trainParam.goal=0.001;
%训练网络
[net1_1,tr]=train(net1_1,CT_1_train,CL_1_train);
CT_1_test = T1(:,1:5:0.6*n);%测试集
CL_1_test = L1(:,1:5:0.6*n);%测试集label
b = sim(net1_1,CT_1_test);%将测试集代入训练好的神经网路,然后得到的结果储存进b
error1 = b - CL_1_test;%计算测试集预测的数据和本来数据的归一化误差
c = postmnmx(b,minl1,maxl1);%反归一化
figure; %作图
plot(error1);
title('测试集归一化误差(第一次)');
%% 第二个神经网络
n2 = 1:0.2*n;% number of 0.2
for i = 1:5:fix(0.2*n*0.8-5)
n2(:,i) = [] ;
end
[T2,mint2,maxt2,L2,minl2,maxl2]= premnmx(CT_2,CL_2);
CT_2_train = T2(1:6,n2);
CL_2_train = L2(1,n2);
net2_1 = newff(minmax(T2),[6,8,4,1],{'tansig','tansig','tansig','purelin'},'trainlm');%
%设置训练次数
net2_1.trainParam.epochs = 500;
%设置收敛误差
net2_1.trainParam.goal=0.00001;
%训练网络
%[net2_1,tr]=train(net2_1,CT_2_train,CL_2_train);
load net2_1
CT_2_test = T2(:,1:5:fix(0.2*n));
CL_2_test = L2(:,1:5:fix(0.2*n));
b2 = sim(net2_1,CT_2_test);
error2 = b2 - CL_2_test;
c2 = postmnmx(b2,minl2,maxl2);
figure(2);
plot(error2);
title('测试集归一化误差(第二次)');
%% %% 第三个神经网络
n3 = 1:0.2*n;% number of 0.2
for i = 1:5:fix(0.2*n*0.8-5)
n3(:,i) = [] ;
end
[T3,mint3,maxt3,L3,minl3,maxl3]= premnmx(CT_3,CL_3);
CT_3_train = T3(1:6,n3);
CL_3_train = L3(1,n3);
net3_1 = newff(minmax(T3),[6,8,4,1],{'tansig','tansig','tansig','purelin'},'trainlm');%
%设置训练次数
net3_1.trainParam.epochs = 500;
%设置收敛误差
net3_1.trainParam.goal=0.0001;
%训练网络
%[net3_1,tr]=train(net3_1,CT_3_train,CL_3_train);
load net3_1
CT_3_test = T3(:,1:5:fix(0.2*n));
CL_3_test = L3(:,1:5:fix(0.2*n));
b3 = sim(net3_1,CT_3_test);
error3 = b3 - CL_3_test;
c3 = postmnmx(b3,minl3,maxl3);
figure(3);
plot(error3);
title('测试集归一化误差(第三次)');
%% 预测数据
CT_p = dtpredict';%导入所要预测数据的数据集
CT_p1 = tramnmx(CT_p,mint1,maxt1);%归一化
c1 = sim(net1_1,CT_p1);%代入训练好的神经网络得到结果
result1 = postmnmx(c1,minl1,maxl1);%反归一化
CT_p2 = tramnmx(CT_p,mint2,maxt2);
c2 = sim(net2_1,CT_p2);
result2 = postmnmx(c2,minl2,maxl2);
CT_p3 = tramnmx(CT_p,mint3,maxt3);
c3 = sim(net3_1,CT_p3);
result3 = postmnmx(c3,minl3,maxl3);
r1 = result1';%第一次结果
r2 = result2';%第二次结果
r3 = result3';%第三次结果
运行结果
这里只放第一次的误差图,可以发现由于事先没有对数据集中异常的数据进行处理,导致大部分数据预测的误差很小,但是有少数的点误差很大,这些都是由于异常数据导致的,
总结
本文简述了如何使用matlab搭建bp神经网络进行数据预测,而文中的数据集大家可以根据自己的需要进行修改,只需改动很少一部分即可。