BP神经网络是非常经典且好用的一种学习数据内在规律的拟合-预测模型,具有很强的线性和非线性的映射能力.BP神经网络属于人工神经网络(Artificial Neural Network, ANN)的一种,BP是Back Propagation的缩写,意为反向传播.反向传播的本质为误差是向后传播,进而调整神经元的参数. 1943年McCulloch, W.S.和W. Pitts[1]最早提出了神经元的数学模型, 1974年Paul J. Werbos[2]正式提出了BP神经网络训练算法,到目前BP神经网络广泛用于各种预测和控制模型,已经有数十年的历史,取得了很好的效果.
本文的主旨不在于研究BP神经网络的历史和原理,主要着眼于其实际使用方法,下面我们先看调用MATLAB自带的BP神经网络工具箱的代码.
本代码总体流程:
(1)首先随机产生200组维度为2的输入数据X,对X的2维数据求和后加上随机噪声,得到输出数据Y;
(2)然后定义训练集和测试集,就是划分为两个无交集的子集,一个用于训练BP神经网络,一个用于测试BP神经网络;
(3)对数据进行归一化处理,BP神经网络要求对数据进行归一化处理,这样预测效果是最理想的;
(4)设置BP神经网络的参数
(5)训练BP神经网络,并输出训练误差曲线
(6)测试BP神经网络,并输出测试结果
%% 本代码由华量信息技术工作室 代码顾问免费提供 联系方式 QQ1579325979
%% BP神经网络
clc;close all;clear all;warning off;%清除变量
rand('seed', 100);
randn('seed', 100);
format long g;
%%(1)首先随机产生200组维度为2的输入数据X,对X的2维数据求和后加上随机噪声,得到输出数据Y
X1=rand(2,200);
Y1=sum(X1)+5;
Y1=Y1.*(1+(-0.05+0.1*rand(size(Y1))));
%% (2)定义训练集和测试集,就是划分为两个无交集的子集,一个用于训练BP神经网络,一个用于测试BP神经网络;
n1=size(Y1,2);
I1=1:n1;%顺序样本
n2=20;%用于测试的样本个数
indextraindata=I1(1:end-n2);
indextestdata=I1(end-n2+1:end);
% 定义训练集
P1data=X1(:,indextraindata);
T1data=Y1(:,indextraindata);
% 定义测试集
P2data=X1(:,indextestdata);
T2data=Y1(:,indextestdata);
%% (3)对数据进行归一化处理
% 训练数据归一化
[input_traindata,inputps]=mapminmax(P1data);
[output_traindata,outputps]=mapminmax(T1data);
%测试数据归一化
input_testdata=mapminmax('apply',P2data,inputps);
%%(4)设置BP神经网络的参数
hidnumber=10;%设置隐含测节点数
net_new=newff(input_traindata,output_traindata,hidnumber);%新建BP神经网络net
% 设置神经网络的参数
net_new.trainparam.epochs=1000;%设置训练次数
net_new.trainparam.goal=0.000000001;% 设置目标精度
net_new.trainparam.lr=0.1;% 设置学习率
net_new.trainFcn='traingd';%设置训练函数梯度下降
net_new.divideFcn ='';
%% (5)训练BP神经网络,并输出训练误差曲线
[net_new,tr]=train(net_new,input_traindata,output_traindata);% 训练模型
msedata=tr.perf;% 训练误差
epochs201=tr.epoch;% 训练次数
%绘制训练误差曲线
figure;
semilogy(epochs201,msedata);
xlabel('训练次数','fontname','宋体');
ylabel('训练误差','fontname','宋体');
title('训练误差曲线','fontname','宋体');
%% (6)测试BP神经网络,并输出测试结果
input_traindata0=input_traindata(:,1:length(indextraindata));
ybptraindata=sim(net_new,input_traindata0);
ybptraindata=mapminmax('reverse',ybptraindata,outputps);%预测数据反归一化
ybptestdata=sim(net_new,input_testdata);
ybptestdata=mapminmax('reverse',ybptestdata,outputps);%预测数据反归一化
%% 输出结果
msedata=tr.perf;
disp('BP神经网络训练的RMSE');
sqrt(msedata(end))
disp('训练集样本编号');
indextraindata
disp('测试集样本编号');
indextestdata
disp('实际值');
T2data
disp('预测结果');
ybptestdata
figure;
plot(T2data,'bo-');
hold on;
plot(ybptestdata,'r*-');
legend({'实际值','BP预测值'},'fontname','宋体');
xlabel('','fontname','宋体');
ylabel('目标值','fontname','宋体');
title('预测结果','fontname','宋体');
figure;
plot(ybptestdata-T2data,'bo-');
legend({'绝对误差'},'fontname','宋体');
xlabel('','fontname','宋体');
ylabel('绝对误差','fontname','宋体');
title('绝对误差','fontname','宋体');
figure;
plot((ybptestdata-T2data)./T2data*100,'bo-');
legend({'相对误差'},'fontname','宋体');
xlabel('','fontname','宋体');
ylabel('相对误差(%)','fontname','宋体');
title('相对误差','fontname','宋体');
disp('本代码由华量信息技术工作室 代码顾问免费提供 联系方式 QQ1579325979');
%% 本代码由华量信息技术工作室 代码顾问免费提供 联系方式 QQ1579325979
代码运行的结果如下:
有讨论的可以加我q :1579325979
参考文献:
[1]McCulloch, W.S. and W. Pitts,A logical calculus of the ideas immanent in nervous activity.The bulletin of mathematical biophysics, 1943.5(4): p. 115-133.
[2]Werbos, P.,Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Science. Thesis (Ph. D.). Appl. Math. Harvard University. 1974.