%通用感應器神經網絡。
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,:)')