广义回归神经网络MATLAB源程序.docx
《广义回归神经网络MATLAB源程序.docx》由会员分享,可在线阅读,更多相关《广义回归神经网络MATLAB源程序.docx(12页珍藏版)》请在冰点文库上搜索。
广义回归神经网络MATLAB源程序
广义回归神经网络MATLAB源程序(总22页)
GRNN神经网络---广义回归神经网络,主要用于函数逼近。
x=-2:
:
1
y=2*x.^6+3*x.^5-3*x.^3+x.^2+1
P=x(1:
15:
end)
T=y(1:
15:
end)
spread=[];
l_style={'','bo--','ko-.','k*--','r^-'};
fori=1:
length(spread)
net=newgrnn(P,T,spread(i));
a=sim(net,P);
plot(P,a,l_style{i})
holdon
end
plot(P,T,'o');
legend('spread=','spread=','spread=','spread=','spread=','traindata');
title('GRNN神经网络spread探讨')
loaddata;
%载入数据并将数据分成训练和预测两类
p_train=p(1:
10,:
);
p_test=p(11:
13,:
);
t_train=t(1:
10,:
);
t_test=t(11:
13,:
);
%将各个矩阵转置以便适应网络结构
p_train=p_train';
t_train=t_train';
p_test=p_test';
t_test=t_test';
%将数据归一化
[pn,minp,maxp,tn,mint,maxt]=premnmx(p_train,t_train);
p2n=tramnmx(p_test,minp,maxp);
forsc=:
:
1;
tic,
net=newgrnn(pn,tn,sc);
sc
toc
Out=sim(net,p2n);
a2=postmnmx(Out,mint,maxt);
e=t_test-a2';
perf=mse(e);
Y=sim(net,pn);
a3=postmnmx(Y,mint,maxt);
ep=a3-t_train;
perfp=mse(ep);
holdon;
figure
(1);
title('网络的预测误差')
plot(sc,perf,'g:
*');
holdon;
figure
(2);
title('网络的逼近误差')
plot(sc,perfp,'r:
*');
end
%通用感应器神经网络。
P=[-40;150];%输入向量
T=[11001];%期望输出
plotpv(P,T);%描绘输入点图像
net=newp([-401;-150],1);%生成网络,其中参数分别为输入向量的范围和神经元感应器数量
holdon
linehandle=plotpc{1},{1});
for
a=1:
25%训练次数
[net,Y,E]=adapt(net,P,T);
linehandle=plotpc{1},{1},linehandle);
drawnow;
end
%通用newlin程序
%通用线性网络进行预测
time=0:
:
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)
holdon
plot([min(time)max(time)],[00],'r:
')%可用plot(x,zeros(size(x)),'r:
')代替
holdoff
xlabel('时间');
ylabel('误差');
title('误差信号');
%通用BP神经网络
P=[-1-122;0505];
t=[-1-111];
net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingd');
%输入参数依次为:
'样本P范围',[各层神经元数目],{各层传递函数
},'训练函数'
%训练函数traingd--梯度下降法,有7个训练参数.
%训练函数traingdm--有动量的梯度下降法,附加1个训练参数mc(动量因子,缺省为
%训练函数traingda--有自适应lr的梯度下降法,附加3个训练参数:
lr_inc(学习率增长比,缺省为;
% lr_dec(学习率下降比,缺省为;max_perf_inc(表现函数增加最大比,缺省为
%训练函数traingdx--有动量的梯度下降法中赋以自适应lr的方法,附加traingdm和traingda的4个附加参数
%训练函数trainrp--弹性梯度下降法,可以消除输入数值很大或很小时的误差,附加4个训练参数:
% delt_inc(权值变化增加量,缺省为;delt_dec(权值变化减小量,缺省为;
% delta0(初始权值变化,缺省为;deltamax(权值变化最大值,缺省为
% 适合大型网络
%训练函数traincgf--Fletcher-Reeves共轭梯度法;训练函数traincgp--Polak-Ribiere共轭梯度法;
%训练函数traincgb--Powell-Beale共轭梯度法
%共轭梯度法占用存储空间小,附加1训练参数searchFcn(一维线性搜索方法,缺省为srchcha);缺少1个训练参数lr
%训练函数trainscg--量化共轭梯度法,与其他共轭梯度法相比,节约时间.适合大型网络
% 附加2个训练参数:
sigma(因为二次求导对权值调整的影响参数,缺省为;
% lambda(Hessian阵不确定性调节参数,缺省为
%
缺少1个训练参数:
lr
%训练函数trainbfg--BFGS拟牛顿回退法,收敛速度快,但需要更多内存,与共轭梯度法训练参数相同,适合小网络
%训练函数trainoss--一步正割的BP训练法,解决了BFGS消耗内存的问题,与共轭梯度法训练参数相同
%训练函数trainlm--Levenberg-Marquardt训练法,用于内存充足的中小型网络
net=init(net);
%最大训练次数(前缺省为10,自trainrp后,缺省为100)
%学习率(缺省为
%限时训练迭代过程(NaN表示不显示,缺省为25)
%训练要求精度(缺省为0)
% 最大失败次数(缺省为5)
% 最小梯度要求(前缺省为1e-10,自trainrp后,缺省为1e-6)
% 最大训练时间(缺省为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=[456];
T=[];
net=newgrnn(P,T);
%仿真验证
p=;
v=sim(net,p)
%PNN网络,概率神经网络
P=[00;11;03;14;31;41;43]';
Tc=[1122333];
%将期望输出通过ind2vec()转换,并设计
、验证网络
T=ind2vec(Tc);
net=newpnn(P,T);
Y=sim(net,P);
Yc=vec2ind(Y)
%尝试用其他的输入向量验证网络
P2=[14;01;52]';
Y=sim(net,P2);
Yc=vec2ind(Y)
%应用newrb()函数构建径向基网络,对一系列数据点进行函数逼近
P=-1:
:
1;
T=[...
...
];
%绘制训练用样本的数据点
plot(P,T,'r*');
title('训练样本');
xlabel('输入向量P');
ylabel('目标向量T');
%设计一个径向基函数网络,网络有两层,隐层为径向基神经元,输出层为线性神经元
%绘制隐层神经元径向基传递函数的曲线
p=-3:
.1:
3;
a=radbas(p);
plot(p,a)
title('径向基传递函数')
xlabel('输入向量p')
%隐层神经元的权值、阈值与径向基函数的位置和宽度有关,只要隐层神经元数目、权值、阈值正确,可逼近任意函数
%例如
a2=radbas;
a3=radbas(p+2);
a4=a+a2*+a3*;
plot(p,a,'b',p,a2,'g',p,a3,'r',p,a4,'m--')
title('径向基传递函数权值之和')
xlabel('输入p');
ylabel('输出a');
%应用newrb()函数构建径向基网络的时候,可以预先设定均方差精度eg以及散布常数sc
eg=;
sc=1;
%其值的选取与最终网络的效果有很大关系,过小造成过适性,过大造成重叠性
net=newrb(P,T,eg,sc);
%网络测试
plot(P,T,'*')
xlabel('输入');
X=-1:
.01:
1;
Y=sim(net,X);
holdon
plot(X,Y);
holdoff
legend('目标','输出')
%应用grnn进行函数逼近
P=[12345678];
T=[01232121];
plot(P,T,'.','markersize',30)
axis([09-1
4])
title('待逼近函数')
xlabel('P')
ylabel('T')
%网络设计
%对于离散数据点,散布常数spread选取比输入向量之间的距离稍小一些
spread=;
net=newgrnn(P,T,spread);
%网络测试
A=sim(net,P);
holdon
outputline=plot(P,A,'o','markersize',10,'color',[100]);
title('检测网络')
xlabel('P')
ylabel('T和A')
%应用pnn进行变量的分类
P=[12;22;11];%输入向量
Tc=[123]; %P对应的三个期望输出
%绘制出输入向量及其相对应的类别
plot(P(1,:
),P(2,:
),'.','markersize',30)
fori=1:
3
text(P(1,i)+,P(2,i),sprintf('class%g',Tc(i)))
end
axis([030
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)
fori=1:
3
text(P(1,i)+,P(2,i),sprintf('class%g',Ac(i)))
end
axis([0303]);
title('网络测试结果')
xlabel('P(1,:
)')
ylabel('P(2,:
)')