matlab 通用神经网络代码

更新时间:2023-09-23 12:02:01 阅读量: 工程科技 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

matlab 通用神经网络代码

学习了一段时间的神经网络,总结了一些经验,在这愿意和大家分享一下,

希望对大家有帮助,也希望大家可以把其他神经网络的通用代码在这一起分享

感应器神经网络、线性网络、BP神经网络、径向基函数网络

%通用感应器神经网络。

P=[-0.5 -0.5 0.3 -0.1 -40;-0.5 0.5 -0.5 1 50];%输入向量 T=[1 1 0 0 1];%期望输出

plotpv(P,T);%描绘输入点图像

net=newp([-40 1;-1 50],1);%生成网络,其中参数分别为输入向量的范围和神经元感应器数量 hold on

linehandle=plotpc(net.iw{1},net.b{1}); net.adaptparam.passes=3; for a=1:25%训练次数 [net,Y,E]=adapt(net,P,T);

linehandle=plotpc(net.iw{1},net.b{1},linehandle); drawnow; end

%通用newlin程序

%通用线性网络进行预测 time=0:0.025:5; T=sin(time*4*pi); Q=length(T);

P=zeros(5,Q);%P中存储信号T的前5(可变,根据需要而定)次值,作为网络输入。 P(1,2:Q)=T(1,1:(Q-1)); P(2,3:Q)=T(1,1:(Q-2)); P(3,4:Q)=T(1,1:(Q-3)); P(4,5:Q)=T(1,1:(Q-4)); P(5,6:Q)=T(1,1:(Q-5));

plot(time,T)%绘制信号T曲线 xlabel('时间'); ylabel('目标信号'); title('待预测信号');

net=newlind(P,T);%根据输入和期望输出直接生成线性网络 a=sim(net,P);%网络测试

figure(2)

plot(time,a,time,T,'+') xlabel('时间');

ylabel('输出-目标+');

title('输出信号和目标信号'); e=T-a; figure(3) plot(time,e) hold on

plot([min(time) max(time)],[0 0],'r:')%可用plot(x,zeros(size(x)),'r:')代替 hold off

xlabel('时间'); ylabel('误差'); title('误差信号');

%通用BP神经网络 P=[-1 -1 2 2;0 5 0 5]; t=[-1 -1 1 1];

net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingd');

%输入参数依次为:'样本P范围',[各层神经元数目],{各层传递函数},'训练函数' %训练函数traingd--梯度下降法,有7个训练参数.

%训练函数traingdm--有动量的梯度下降法,附加1个训练参数mc(动量因子,缺省为0.9) %训练函数traingda--有自适应lr的梯度下降法,附加3个训练参数:lr_inc(学习率增长比,缺省为1.05;

% lr_dec(学习率下降比,缺省为0.7);max_perf_inc(表现函数增加最大比,缺省为1.04)

%训练函数traingdx--有动量的梯度下降法中赋以自适应lr的方法,附加traingdm和traingda的4个附加参数

%训练函数trainrp--弹性梯度下降法,可以消除输入数值很大或很小时的误差,附加4个训练参数:

% delt_inc(权值变化增加量,缺省为1.2);delt_dec(权值变化减小量,缺省为0.5);

% delta0(初始权值变化,缺省为0.07);deltamax(权值变化最大值,缺省为50.0) % 适合大型网络

%训练函数traincgf--Fletcher-Reeves共轭梯度法;训练函数traincgp--Polak-Ribiere共轭梯度法;

%训练函数traincgb--Powell-Beale共轭梯度法

%共轭梯度法占用存储空间小,附加1训练参数searchFcn(一维线性搜索方法,缺省为srchcha);缺少1个训练参数lr

%训练函数trainscg--量化共轭梯度法,与其他共轭梯度法相比,节约时间.适合大型网络 % 附加2个训练参数:sigma(因为二次求导对权值调整的影响参数,缺省为5.0e-5);

% lambda(Hessian阵不确定性调节参数,缺省为5.0e-7) % 缺少1个训练参数:lr

%训练函数trainbfg--BFGS拟牛顿回退法,收敛速度快,但需要更多内存,与共轭梯度法训练参数相同,适合小网络

%训练函数trainoss--一步正割的BP训练法,解决了BFGS消耗内存的问题,与共轭梯度法训练参数相同

%训练函数trainlm--Levenberg-Marquardt训练法,用于内存充足的中小型网络 net=init(net);

net.trainparam.epochs=300; %最大训练次数(前缺省为10,自trainrp后,缺省为100) net.trainparam.lr=0.05; %学习率(缺省为0.01)

net.trainparam.show=50; %限时训练迭代过程(NaN表示不显示,缺省为25) net.trainparam.goal=1e-5; %训练要求精度(缺省为0) %net.trainparam.max_fail 最大失败次数(缺省为5)

%net.trainparam.min_grad 最小梯度要求(前缺省为1e-10,自trainrp后,缺省为1e-6) %net.trainparam.time 最大训练时间(缺省为inf) [net,tr]=train(net,P,t); %网络训练

a=sim(net,P) %网络仿真

%通用径向基函数网络——

%其在逼近能力,分类能力,学习速度方面均优于BP神经网络 %在径向基网络中,径向基层的散步常数是spread的选取是关键

%spread越大,需要的神经元越少,但精度会相应下降,spread的缺省值为1 %可以通过net=newrbe(P,T,spread)生成网络,且误差为0

%可以通过net=newrb(P,T,goal,spread)生成网络,神经元由1开始增加,直到达到训练精度或神经元数目最多为止

%GRNN网络,迅速生成广义回归神经网络(GRNN) P=[4 5 6];

T=[1.5 3.6 6.7]; net=newgrnn(P,T); %仿真验证 p=4.5;

v=sim(net,p)

%PNN网络,概率神经网络 P=[0 0 ;1 1;0 3;1 4;3 1;4 1;4 3]'; Tc=[1 1 2 2 3 3 3];

%将期望输出通过ind2vec()转换,并设计、验证网络 T=ind2vec(Tc); net=newpnn(P,T); Y=sim(net,P); Yc=vec2ind(Y)

%尝试用其他的输入向量验证网络 P2=[1 4;0 1;5 2]'; Y=sim(net,P2); Yc=vec2ind(Y)

%应用newrb()函数构建径向基网络,对一系列数据点进行函数逼近 P=-1:0.1:1;

T=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609... 0.1336 -0.2013 -0.4344 -0.500 -0.3930 -0.1647 -0.0988... 0.3072 0.3960 0.3449 0.1816 -0.0312 -0.2189 -0.3201]; %绘制训练用样本的数据点 plot(P,T,'r*'); title('训练样本'); xlabel('输入向量P'); ylabel('目标向量T');

%设计一个径向基函数网络,网络有两层,隐层为径向基神经元,输出层为线性神经元 %绘制隐层神经元径向基传递函数的曲线 p=-3:.1:3; a=radbas(p); plot(p,a)

title('径向基传递函数') xlabel('输入向量p')

%隐层神经元的权值、阈值与径向基函数的位置和宽度有关,只要隐层神经元数目、权值、阈值正确,可逼近任意函数 %例如

a2=radbas(p-1.5); a3=radbas(p+2);

a4=a+a2*1.5+a3*0.5;

plot(p,a,'b',p,a2,'g',p,a3,'r',p,a4,'m--') title('径向基传递函数权值之和') xlabel('输入p'); ylabel('输出a');

%应用newrb()函数构建径向基网络的时候,可以预先设定均方差精度eg以及散布常数sc eg=0.02;

sc=1; %其值的选取与最终网络的效果有很大关系,过小造成过适性,过大造成重叠性 net=newrb(P,T,eg,sc); %网络测试 plot(P,T,'*') xlabel('输入'); X=-1:.01:1; Y=sim(net,X); hold on plot(X,Y); hold off

legend('目标','输出')

%应用grnn进行函数逼近 P=[1 2 3 4 5 6 7 8]; T=[0 1 2 3 2 1 2 1];

plot(P,T,'.','markersize',30) axis([0 9 -1 4]) title('待逼近函数') xlabel('P') ylabel('T') %网络设计

%对于离散数据点,散布常数spread选取比输入向量之间的距离稍小一些 spread=0.7;

net=newgrnn(P,T,spread); %网络测试 A=sim(net,P); hold on

outputline=plot(P,A,'o','markersize',10,'color',[1 0 0]); title('检测网络') xlabel('P')

ylabel('T和A')

%应用pnn进行变量的分类 P=[1 2;2 2;1 1]; %输入向量

Tc=[1 2 3]; %P对应的三个期望输出 %绘制出输入向量及其相对应的类别 plot(P(1,:),P(2,:),'.','markersize',30) for i=1:3

text(P(1,i)+0.1,P(2,i),sprintf('class %g',Tc(i))) end

axis([0 3 0 3]);

title('三向量及其类别') xlabel('P(1,:)') ylabel('P(2,:)') %网络设计 T=ind2vec(Tc); spread=1;

net=newgrnn(P,T,speard); %网络测试 A=sim(net,P); Ac=vec2ind(A);

%绘制输入向量及其相应的网络输出 plot(P(1,:),P(2,:),'.','markersize',30) for i=1:3

text(P(1,i)+0.1,P(2,i),sprintf('class %g',Ac(i))) end

axis([0 3 0 3]);

title('网络测试结果') xlabel('P(1,:)') ylabel('P(2,:)')

本文来源:https://www.bwwdw.com/article/xw9d.html

Top