第一種
%%
%用神經網絡解決異或問題
clear
clc
close
ms=4;%設置4個樣本
a=[0 0;0 1;1 0;1 1];%設置輸入向量
y=[0,1,1,0];%設置輸出向量
n=2;%輸入量的個數
m=3;%隱層量的個數
k=1;%輸出層的個數
w=rand(n,m);%為輸入層到隱層的權值賦初值
v=rand(m,k);%為隱層到輸出層的權值賦權值
yyuzhi=rand(1,m);%為輸入層到隱層的閾值賦初值
scyuzhi=rand(1,1);%為隱層到輸出層的閾值賦權值
maxcount=10000;%設置最大的計數
precision=0.0001;%設置精度
speed=0.2;%設置訓練率
count=1;%設置計數器的初始值
while(count<=maxcount)
cc=1;%cc為第幾個樣本
%樣本數少於ms=4時執行
while(cc<=ms)
%計算第cc個樣本的輸出層的期望輸出
for l=1:k
o(l)=y(cc);
end
%獲得第cc個樣本的輸入的向量
for i=1:n
x(i)=a(cc,i);
end
%%
%計算隱層的輸入輸出
%b(j)為隱層的輸出,轉移函數為logsig函數
for j=1:m
s=0;
for i=1:n
s=s+w(i,j)*x(i);
end
s=s-yyuzhi(j);
b(j)=1/(1+(exp(-s)));
end
%%
%計算輸出層的輸入輸出
%b(j)為輸出層的輸入,c為輸出層的輸出,轉移函數為logsig函數
%for t=1:k 此處k為1,所以循環不寫
for t=1:k
ll=0;
for j=1:m
ll=ll+v(j,t)*b(j);
end
ll=ll-scyuzhi(t);
end
%c(t)=l/(1+exp(-l))引文k為1,所以直接用下式
% c=l/(1+exp(-ll));
if ll<0
c=0;
else
c=1;
end
%%
%計算誤差
errort=(1/2)*((o(l)-c)^2);
errortt(cc)=errort;
%計算輸出層各單元的一般化誤差
scyiban=(o(l)-c)*c*(1-c);
%計算隱層的一般化誤差
for j=1:m
e(j)=scyiban*v(j)*b(j)*(1-b(j));
end
%修正隱層到輸出層連接權值和輸出層各閾值
for j=1:m
v(j)=v(j)+speed*scyiban*b(j);
end
scyuzhi=scyuzhi-speed*scyiban;
%修正輸入層到中間層的權值和閾值
for i=1:n
for j=1:m
w(i,j)=w(i,j)+speed*e(j)*x(i);
end
end
for j=1:m
yyuzhi(j)=yyuzhi(j)-speed*e(j);
end
cc=cc+1;
end
%%
%計算count一次后的誤差
tmp=0;
for i=1:ms
tmp=tmp+errortt(i)*errortt(i);
end
tmp=tmp/ms;
error(count)=sqrt(tmp);
%判斷是否小於誤差精度
if(error(count)<precision)
break;
end
count=count+1;
end
errortt
count
p=1:count-1;
plot(p,error(p))
第二種
%%用matlab工具箱實現異或
p=[0 0 1 1;0 1 0 1];%p為輸入
t=[0 1 1 0];%t為理想輸出
%隱含層有2個神經元,輸出層有1個神經元,隱含層的傳輸函數為logsig函數
%輸出層的傳輸函數為purelin函數
net=newff(minmax(p),[2,1],{'logsig','purelin'},'trainlm');
net.trainParam.epochs=1000;%訓練的最大次數為1000
net.trainParam.goal=0.0001;%訓練的精度為0.0001
LP.lr=0.1;%訓練的學習率為0.1
net.trainParam.show=20;%顯示訓練的迭代過程
net=train(net,p,t);%開始訓練
out=sim(net,p);%用sim函數仿真驗證