博主是MATLAB和神经网络的初学者,也是首次撰写博客。
刚开始研究神经网络,出现了很多问题,但是查询了很多资料也找不到答案。这里分享我解决问题所学习到的知识。
问题很简单: excel随机生成50组,每组3个-1到1的随机数。(省的考虑归一化的问题)result是3个输入的和。
input1 | input2 | input3 | result |
0.699522 | -0.21806 | -0.11718 | 0.364281 |
0.107202 | 0.391985 | -0.61678 | -0.11759 |
-0.98422 | -0.081 | 0.11573 | -0.94949 |
-0.15667 | 0.118392 | -0.58789 | -0.62617 |
-0.37764 | -0.29995 | -0.62596 | -1.30354 |
0.29992 | -0.68941 | -0.59552 | -0.98501 |
0.900928 | 0.016055 | 0.872796 | 1.789778 |
0.909256 | 0.373775 | -0.83405 | 0.448985 |
lc
clear
close all
num = xlsread('D:\matlab\b.xlsx');
inputtrain = zeros(30,3);
inputtrain(1:30,:) = num(1:30,1:3);
resulttrain(1:30,1) = num(1:30,4);
inputtest = zeros(10,3);
inputtest(1:20,:) = num(31:50,1:3);
inputtest=inputtest';
inputtrain=inputtrain';
resulttrain=resulttrain';
%建立相应的BP网络
net=newff(minmax(inputtrain),[3,1],{'logsig','tansig'},'traingdx');%tansig,purelin
%对没有训练的网络仿真
%y1=sim(net,p);
%训练网络
net.trainParam.epochs=2000;
net.trainParam.lr=0.00001;
net.trainParam.goal=0.00001;
net=train(net,inputtrain,resulttrain);
ty=sim(net,inputtest);
train1=sim(net,inputtrain);
ty=ty';
plot(ty(:,1),'ro')
hold on
plot(num(31:50,4),'k')
hold off
如此简单的程序,训练收敛的非常快,测试结果也不尽如人意。
net=newff(minmax(inputtrain),[3,1],{'logsig','tansig'},'traingdx');%tansig,purelin
是传递函数选择的问题,面对线性问题如果选用purelin作为传递函数效果就好得多
下面列出全部代码
clc
clear
close all
num = xlsread('D:\matlab\b.xlsx');
inputtrain = zeros(30,3);
inputtrain(1:30,:) = num(1:30,1:3);
resulttrain(1:30,1) = num(1:30,4);
inputtest = zeros(10,3);
inputtest(1:20,:) = num(31:50,1:3);
inputtest=inputtest';
inputtrain=inputtrain';
resulttrain=resulttrain';
%建立相应的BP网络
net=newff(minmax(inputtrain),[3,1],{'purelin','purelin'},'traingdx');%tansig,purelin
%对没有训练的网络仿真
%y1=sim(net,p);
%训练网络
net.trainParam.epochs=2000;
net.trainParam.lr=0.00001;
net.trainParam.goal=0.00001;
net=train(net,inputtrain,resulttrain);
ty=sim(net,inputtest);
train1=sim(net,inputtrain);
ty=ty';
plot(ty(:,1),'ro')
hold on
plot(num(31:50,4),'k')
hold off
训练的结果:
效果明显好多了,除此之外第二层隐藏层的神经元数量不能太多,不然会产生过拟合现象。
关于不同传递函数的实质区别还需要深入研究,