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