給你一個實例,希望通過該例子對實現神經網路應用有一定的了解。
%x,y分別為輸入和目標向量
x=1:5;
y=[639 646 642 624 652];
%創建一個前饋網路
net=newff(minmax(x),[20,1],{'tansig','purelin'});
%模擬未經訓練的網路net並畫圖
y1=sim(net,x);plot(x,y1,':');
%採用L-M優化演算法
net.trainFcn='trainlm';
%設置訓練演算法
net.trainParam.epochs=500;net.trainParam.goal=10^(-6);
%調用相應演算法訓練BP網路
[net,tr,yy]=train(net,x,y);
%對BP網路進行模擬
y1=sim(net,x);
%計算模擬誤差
E=y-y1;MSE=mse(E)
hold on
%繪制匹配結果曲線
figure;
plot(x,y1,'r*',x,y,'b--')
執行結果
㈡ 人工神經網路單輸入單輸出系統怎麼實現(matlab)
MATLAB寫的:
(輸入輸出隱層節點數都可以改的)
clear all
inputnums=3;%輸入層節點
outputnums=1;%輸出層節點
hidenums=7;%隱層節點
maxcount=50000;%最大迭代次數
samplenum=19;%一個計數器,無意義
precision=0.00001;%預設精度
yyy=1.3;%yyy是幫助網路加速走出平坦區
alpha=0.02;%學習率設定值
a=0.9;%BP優化演算法的一個設定值,對上組訓練的調整值按比例修改
error=zeros(1,maxcount+1);%error數組初始化;目的是預分配內存空間
errorp=zeros(1,samplenum);%同上
v=rand(inputnums,hidenums);%1*10;v初始化為一個1*10的隨機歸一矩陣;v表輸入層到隱層的權值
deltv=zeros(inputnums,hidenums);%1*10;內存空間預分配
dv=zeros(inputnums,hidenums);%1*10;
w=rand(hidenums,outputnums);%10*1
deltw=zeros(hidenums,outputnums);%10*1
dw=zeros(hidenums,outputnums);%10*1
samplelist=1:0.5:10;%樣本輸入值
expectlist=samplelist.^(-1);%期望輸出值
%expectlist=exp(-samplelist);
[samplelist,minp,maxp]=premnmx(samplelist);
%[expectlist,mint,maxt]=premnmx(expectlist);
count=1;
while(count<=maxcount)%結束條件1迭代20000次
c=1;
while(c<=samplenum)
for k=1:outputnums
d(k)=expectlist(c);%獲得期望輸出的向量
end
for i=1:inputnums
x(i)=samplelist(c);%獲得輸入的向量數據
end
%forward();
for j=1:hidenums
net=0.0;
for i=1:inputnums
net=net+x(i)*v(i,j);%輸入層到隱層的加權和
end
y(j)=1/(1+exp(-net));%輸出層處理f(x)=1/(1+exp(-x)),單極性sigmiod函數
%y(j)=1/net;%輸出層處理f(x)=1/(1+exp(-x)),單極性sigmiod函數
end
for k=1:outputnums
net=0.0;
for j=1:hidenums
net=net+y(j)*w(j,k);
end
if count>=2&&error(count)-error(count-1)<=0.0001
o(k)=1/(1+exp(-net)/yyy);%平坦區加大學習率
%o(k)=1/(net/yyy);%平坦區加大學習率
else o(k)=1/(1+exp(-net));%同上
%else o(k)=1/net;%同上
end
end
%BpError(c)反饋/修改
errortmp=0.0;
for k=1:outputnums
errortmp=errortmp+(d(k)-o(k))^2;%第一組訓練後的誤差計算
end
errorp(c)=0.5*errortmp;%誤差E=∑(d(k)-o(k))^2 * 1/2
%end
%backward();
for k=1:outputnums
yitao(k)=(d(k)-o(k))*o(k)*(1-o(k));%輸出層誤差偏導
end
for j=1:hidenums
tem=0.0;
for k=1:outputnums
tem=tem+yitao(k)*w(j,k);%為了求隱層偏導,而計算的求和
end
yitay(j)=tem*y(j)*(1-y(j));%隱層偏導
end
%調整各層權值
for j=1:hidenums
for k=1:outputnums
deltw(j,k)=alpha*yitao(k)*y(j);%權值w的調整量deltw(已乘學習率)
w(j,k)=w(j,k)+deltw(j,k)+a*dw(j,k);%權值調整,這里的dw=deltw(t-1),實際是對BP演算法的一個改進措施--增加動量項目的是提高訓練速度
dw(j,k)=deltw(j,k);
end
end
for i=1:inputnums
for j=1:hidenums
deltv(i,j)=alpha*yitay(j)*x(i);%同上deltw
v(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j);
dv(i,j)=deltv(i,j);
end
end
c=c+1;
end%第二個while結束;表示一次BP訓練結束
double tmp;
tmp=0.0;
for i=1:samplenum
tmp=tmp+errorp(i)*errorp(i);%誤差求和
end
tmp=tmp/c;
error(count)=sqrt(tmp);%誤差求均方根,即精度
if(error(count)<precision)%求另一個結束條件
break;
end
count=count+1;%訓練次數加1
end%第一個while結束
error(maxcount+1)=error(maxcount);
p=1:count-1;
plot(p,error(p),'-');%顯示誤差
p=1:1:10;
t=p.^(-1);
%t=exp(-p);
[pn,minpn,maxpn]=premnmx(p);
simt=zeros(1,10);
%while(a<=9)
for i=1:10
x=pn(i);%獲得輸入的向量數據
for j=1:hidenums
net=0.0;
net=net+x*v(1,j);%輸入層到隱層的加權和
y(j)=1/(1+exp(-net));%輸出層處理f(x)=1/(1+exp(-x)),單極性sigmiod函數
%y(j)=1/net;%輸出層處理f(x)=1/(1+exp(-x)),單極性sigmiod函數
end
net=0.0;
for k=1:hidenums
net=net+y(k)*w(k,1);
end
o=1/(1+exp(-net));
simt(i)=o;
end
% simt=postmnmx(simt,mint,maxt);
figure;
plot(p,t,'*',p,simt,'-');
請參考