matlab实现BP神经网络

BP神经网络就是多层感知器,可以作为分类器等等。

今天稍微看了一下matlab实现BP神经网络的代码,还是比较简单的。

firstp=[915  1584 1212 1332 21;
        1257.1  2177.04 1859 1415 35;
        1275.7  2873.81 1868 1378 43;
        1179.88 2932.12 2567 1278 49;
        2108.3  3930.47 2840 1358 46;
        4037.26 5551.34 2930 1384 32;
        6061.18 7201.51 3660 1387 32;
        7087.38 11706.1 3810 1390 45;
        7692.53 12978.63 3718 1373 75;
        8511.29 17564.16 3383 1414 151];
		
p=firstp';
t=[12 23 76 86 137 184 297 411 370 713];
[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %训练样本p和期望输出t的归一化处理
net=newff(minmax(pn),[46,1],{'tansig','purelin'}); %创建BP神经网络

%load  net;
%设置训练参数
net.trainParam.show=50;% 每50次显示一次
net.trainParam.lr=0.05;%学习速率或步长
net.trainParam.mc=0.9;%动量项系数
%%%%%%%%%%一般迭代次数不超过300所以从10000就改成了500%%%%%%%%%%%
net.trainParam.epochs=500;%最大训练次数
%%%%%%%%%%%%%迭代精度改小了,但是精度基本上影响不大,可以仍然使用0.01%%%%%%%%%%%%%%%%%
net.trainParam.goal=1e-3;%最小均方误差或精度

%%%%%%%%这里是增加的两句,其中init可以省略,对结果没有影响%%%%%%%%%%
net.trainFcn='trainbr';%经 trainbr 函数训练的神经网络对噪声不敏感,具有较好的推广能力
net=init(net);

net=train(net,pn,tn);%网络训练

%训练网络
yn=sim(net,pn);%归一化的训练样本pn的仿真输出yn
y1=postmnmx(yn,mint,maxt);%将仿真输出yn反归一化为y1
error=t-y1;%计算期望输出t与仿真输出y1的误差

%good=(abs(t2(1)-y2(1))+abs(t2(2)-y2(2)));
%训练时输出的预测值、实际值及它们之间误差的绘图
time=linspace(2001,2010,10);%取得图形横座标
figure(1);%打开新的图形窗口,绘制BP网络仿真曲线
H1=gcf;%取得BP网络图形窗口句柄
plot(time,t,'-bo');%用蓝色的实线和o号绘制实际值
hold on;%保持图形窗口原内容
plot(time,y1,':m.');%用墨绿色的点线和点号绘制预测值
%plot(time,e,'--r*');%用红色的虚线和*号绘制实际值与预测值的误差曲线

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%训练好的BP神经网络对未来3年(2011-2013)年的数据进行预测
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
firstp2=[13562.33  25729.8 3909 1424 94;
         17970.07  25095.33 4023 1452 195
         18080.71  23766.09 4210 1584 120]; %构建测试样本p2
     
p2=firstp2';
p2n=tramnmx(p2,minp,maxp);%用tramnmx()函数将p2归一化为p2n
y2n=sim(net,p2n);%基于训练的BP网络和测试样本,仿真输出最后三年PCT专利申请量的预测值
y2=postmnmx(y2n,mint,maxt);%预测值的反归一化
t2=[1037;1409;1392]';%期望输出即PCT专利申请量的实际值
e2=t2-y2;%实际值预测量值的误差

time2=linspace(20011,2013,3);%取得图形横座标
figure(2);%打开新的图形窗口,绘制BP网络仿真曲线
H2=gcf;%取得BP网络图形窗口句柄
plot(time2,t2,'-bo');%用蓝色的实线和o号绘制实际值
hold on;%保持图形窗口原内容
plot(time2,y2,':m.');%用墨绿色的点线和点号绘制预测值
plot(time2,e2,'--r*');%用红色的虚线和*号绘制实际值与预测值的误差曲线

下面是另外一道题目

f(x)=2sin(x)-0.7(1<=x<=pi/2)

训练数据

P=[1.0000    1.0500    1.1000    1.1500    1.2000    1.2500    1.3000    1.3500    1.4000    1.4500    1.5000    1.5500]

T=[0.9829    1.0348    1.0824    1.1255    1.1641    1.1980    1.2271    1.2514    1.2709    1.2854    1.2950    1.2996]

测试数据

P=[1.5000    1.5050    1.5100    1.5150    1.5200    1.5250    1.5300    1.5350    1.5400    1.5450    1.5500    1.5550]

close all
clear
echo on
% NEWFF——生成一个新的前向神经网络
% TRAIN——对 BP 神经网络进行训练
% SIM——对 BP 神经网络进行仿真
pause       
%  敲任意键开始
clc
%  定义训练样本
% P 为输入矢量
file=fopen('x.txt','r');%得到文件号
[P,count]=fscanf(file,'%f %f %f %f %f %f %f %f %f %f %f %f',[12]);
P=P';
fclose(file);
% T 为目标矢量
file=fopen('fx.txt','r');
[T,count]=fscanf(file,'%f %f %f %f %f %f %f %f %f %f %f %f',[12]);
T=T';
fclose(file);
pause;
clc

%  创建一个新的前向神经网络
%[P,minp,maxp,T,mint,maxt]=premnmx(P,T);
net=newff(minmax(P),[5,1],{'tansig','purelin'});
%  当前输入层权值和阈值
inputWeights=net.IW{1,1}
inputbias=net.b{1}
%  当前网络层权值和阈值
layerWeights=net.LW{1,1}
layerbias=net.b{2}
pause
clc
%  设置训练参数
net.trainParam.show = 50;
net.trainParam.lr = 0.05;
net.trainParam.mc = 0.9;
net.trainParam.epochs = 10000;
net.trainParam.goal = 1e-6;
pause
clc
%  调用 TRAINGDM 算法训练 BP 网络
[net,tr]=train(net,P,T)
pause
clc

file=fopen('test.txt','r');%得到文件号
[A,count]=fscanf(file,'%f %f %f %f %f %f %f %f %f %f %f %f',[12]);
A=A';
T=2*sin(A)-0.7;
fclose(file);
%  对 BP 网络进行仿真
A = sim(net,A);
%  计算仿真误差
E = T - A
MSE=mse(E)
figure();
hold on;
time=linspace(1,pi/2,12);
plot(time,T,'-bo');
plot(time,A,'-g.');
plot(time,E,'-r*');
hold off;
pause
clc
echo off
点赞