【神經網絡】BP算法解決XOR異或問題MATLAB版


 第一種

%%
%用神經網絡解決異或問題

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函數仿真驗證

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM