感应器神经网络、线性网络、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,:)')
另外找了一个神经网络的实际应用,是关于艾滋病的,将就看看吧!!
附录5:
BP神经网络预测的matlab代码:
P=[ 0
0.1386
0.2197
0.2773
0.3219
0.3584
0.3892
0.4159
0.4394
0.4605
0.4796
0.4970
0.5278
0.5545
0.5991
0.6089
0.6182
0.6271
0.6356
0.6438
0.6516
0.6592
0.6664
0.6735
0.7222
0.7275
0.7327
0.7378
0.7427
0.7475
0.7522
0.7568
0.7613
0.7657
0.7700]
T=[0.4455 0.323
0.4116 0.3255
0.4486 0.2999
0.4926 0.2249
0.4893 0.2357
0.4866 0.2249
0.4819 0.2217
0.4997 0.2269
0.5027 0.217
0.5155 0.1918
0.5058 0.2395
0.4541 0.2408
0.4054 0.2701
0.3942 0.3316
0.2197 0.2963
0.5576 0.1061
0.4956 0.267
0.5126 0.2238
0.5314 0.2083
0.5191 0.208
0.5133 0.1848
0.5089 0.242
0.4812 0.2129
0.4927 0.287
0.4832 0.2742
0.5969 0.2403
0.5056 0.2173
0.5364 0.1994
0.5278 0.2015
0.5164 0.2239
0.4489 0.2404
0.4869 0.2963
0.4898 0.1987
0.5075 0.2917
0.4943 0.2902
]
threshold=[0 1]
net=newff(threshold,[11,2],{'tansig','logsig'},'trainlm');
net.trainParam.epochs=6000
net.trainParam.goal=0.01
LP.lr=0.1;
net=train(net,P',T')
P_test=[ 0.7742
0.7784
0.7824
0.7864
0.7902
0.7941 ]
out=sim(net,P_test')
友情提示:以上面0.7742为例0.7742=ln(47+1)/5
因为网络输入有一个元素,对应的是测试时间,所以P只有一列,Pi=log(t+1)/10,这样做的目的是使得这些数据的范围处在[0 1]区间之内,但是事实上对于logsin命令而言输入参数是正负区间的任意值,而将输出值限定于0到1之间。可能只有当输入值在0到1之间,输出的函数才可以通过返归依化得到正确的对应的答案,因此在后面有threshold来限制输入值的区间
n=-5:0.1:5;
a=logsig(n);
plot(n,logsig(n))
图像如右图所示
T是指CD4Count*0.02,与HIV分别对应的值,是输出值,有两组数据,
T的第一列数据=
表格当中(CD4Count*0.02)÷0.02,再取对数,再÷10
T的第一列数据=
表格当中(HIV)的对数,再÷5
这样就完成了最开始的数据导入工作,即为了训练神经而进行的输入与输出。
threshold=[0 1]---------
变量threshold用于规定输入向量的最大值和最小值,最大值为1,最小值为0
net=newff(threshold,[11,2],{'tansig','logsig'},'trainlm');
网络中间层神经元函数采用S型正切函数tansig,设定网络的训练函数为trainlm,它采用Levenberg-Marquardt算法进行网络学习。
输出层神经元函数采用S型对数函数logsig
net.trainParam.epochs=6000
net.trainParam.goal=0.01
LP.lr=0.1;
经多次尝试,当模型的训练次数取6000,训练目标为0.01,学习速率为0.1,中间神经元个数取11时误差最小(下图为训练误差曲线)
怎样看数据的误差?难道只能通过看图像的方法?.
参考资料