您的位置:首页 > 理论基础 > 计算机网络

matlab通用神经网络代码

2011-09-02 14:04 405 查看
转自:http://hi.baidu.com/slloveliyy/blog/item/0eba2b124554a5d8f7039eb0.html



%通用感应器神经网络。

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,:)')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: