基於BP神經元網絡算法的模式識別

這是以前自己讀研時的一個比較簡單的項目,分享出來,希望能幫到一些對神經網絡和模式識別感興趣的人。

基於BP神經元網絡算法的模式識別

BP神經元網絡算法

  • 神經網絡是對人腦或自然神經網絡的若干基本特性的抽象,是一種基於連接假說構造的智能仿生模型,人們試圖通過對它的研究最終揭開人腦的奧祕,建立起能模擬人腦功能和結構的智能系統,使計算機能夠像人腦那樣進行信息處理。本文主要用基於BP神經元網絡算法進行模式識別[11]。
  • 我們以三層BP網絡爲例,介紹該算法。它的結構如圖 所示,包含一個輸入層、一個隱含層和一個輸出層,分別由個n,p,q神經元組成。BP神經網絡結構如圖8所示。
    這裏寫圖片描述
    這裏寫圖片描述
    這裏寫圖片描述
    這裏寫圖片描述

GitHub項目源碼

function  Bpmodeldistinguish( X,Y )

%*****************************************************
%利用matalb實現基於BP神經網絡模式識別實現代碼
%*****************************************************

% X是三個場景的平均特徵向量所組成的矩陣(就是fea_average)
% Y是待匹配的特徵向量(就是b1或b2)
%**************************************************************************
%**************** 先對X和Y進行標準化處理 *******************
%**************************************************************************
X=[1e9*X(1,:);1e3*X(2,:);X(3,:)/100];
X=X';
X0=ones(3,16);
X0(:,[1:3])=X;
X=X0;
Y=[1e9*Y(1);1e3*Y(2);Y(3)/100];
Y=Y';
Y0=ones(1,16);
Y0(1:3)=Y;
Y=Y0;


%**************************************************************************
%*******************主函數main*********************************************
%*************************START********************************************
%**************************************************************************
Y1=[1 0 0];      %輸出模式           
Y2=[0 1 0];
Y3=[0 0 1];
Yo=[Y1;Y2;Y3]; %輸出的三種模式
n=16; %輸入層神經元個數
p=8;  %中間層神經元個數
q=3;  %輸出神經元個數
k=3 ;%訓練模式個數
a1=0.2; b1=0.2; %學習係數,
%rou=0.5;%動量係數,
emax=0.01; cntmax=100;%最大誤差,訓練次數
[w,v,theta,r,t,mse]=bptrain(n,p,q,X,Yo,k,emax,cntmax,a1,b1);%調用函數bptrain訓練網絡
c=bptest(p,q,n,w,v,theta,r,Y);
c(c>0.5)=1;
c(c<0.2)=0;
disp('測試數據的識別結果:')
c
if (min(c==Y1)==1)
    fprintf('該數據和場景1匹配\n');
elseif (min(c==Y2)==1)
        fprintf('該數據和場景2匹配\n');
else
        fprintf('該數據和場景3匹配\n');
end

%**************************************************************************
%**************************END*********************************************
%**************************************************************************

    function [w,v,theta,r,t,mse]=bptrain(n,p,q,X,Yo,k,emax,cntmax,a1,b1)
%n表示輸入神經元個數,p表示中間層神經元個數,q表示輸出神經元個數,
%X表示輸入訓練模式,Yo表示標準輸出,k表示訓練模式的個數
%emax表示最大誤差,cntmax表示最大訓練次數,a1,b1表示學習係數,rou表示動量係數
%w、theta表示訓練結束後輸入層與中間層連接權係數和閾值,
%v、r表示訓練結束後中間層與輸出層連接權和閾值
%t表示訓練時間
tic
w=rands(n,p);%輸入層與隱含層連接權
v=rands(p,q); %隱含層與輸出層連接權
theta=rands(1,p);%中間層的閾值
r=rands(1,q);%輸出層的閾值
cnt=1;
mse=zeros(1,cntmax);%全局誤差爲零
er=0;
while ((er>emax)|(cnt<=cntmax))
 E=zeros(1,q);
 %循環識別模式  
 for cp=1:k
     X0=X(cp,:);             
     Y0=Yo(cp,:);

     %計算中間層的輸入Y(j) 
     Y=X0*w; 
     %計算中間層的輸出b
     Y=Y-theta;    %中間層閾值
     for j=1:p
         b(j)=1/(1+exp(-Y(j)));%中間層輸出f(sj)
     end      
    %計算輸出層輸出c
             Y=b*v;
             Y=Y-r;  % 輸出層閾值
        for t=1:q
           c(t)=1/(1+exp(-Y(t))); %輸出層輸出
        end 
    %計算輸出層校正誤差d
        for t=1:q 
          d(t)=(Y0(t)-c(t))*c(t)*(1-c(t));
        end
   %計算中間層校正誤差e
         xy=d*v';
         for t=1:p
           e(t)=xy(t)*b(t)*(1-b(t));
         end
   %計算下一次的中間層和輸出層之間新的連接權v(i,j),閾值t2(j)
          for t=1:q
              for j=1:p
                  v(j,t)=v(j,t)+a1*d(t)*b(j);
              end
              r(t)=r(t)+a1*d(t);
          end
      %計算下一次的輸入層和中間層之間新的連接權w(i,j),閾值t1(j)
           for j=1:p
              for i=1:n
                  w(i,j)=w(i,j)+b1*e(j)*X0(i);
              end
              theta(j)=theta(j)+b1*e(j);
           end
           for t=1:q
               E(cp)=(Y0(t)-c(t))*(Y0(t)-c(t))+E(cp);%求當前學習模式的全局誤差
           end
           E(cp)=E(cp)*0.5;
    %輸入下一模式    
  end
  er=sum(E);%計算全局誤差
  mse(cnt)=er;
  cnt=cnt+1;%更新學習次數
 end
t=toc;


function c=bptest(p,q,n,w,v,theta,r,X)
%p,q,n表示輸入層、中間層和輸出層神經元個數
%w,v表示訓練好的神經網絡輸入層到中間層、中間層到輸出層權值。
%X爲輸入測試的模式
%c表示模式X送入神經網絡的識別結果。
%計算中間層的輸入Y(j) 
Y=X*w; 
%計算中間層的輸出b
Y=Y-theta;    %中間層閾值
for j=1:p
    b(j)=1/(1+exp(-Y(j)));%中間層輸出f(sj)
end      
%計算輸出層輸出c
Y=b*v;
Y=Y-r;  % 輸出層閾值
thr1=0.01;thr2=0.5;
for t=1:q
   c(t)=1/(1+exp(-Y(t))); %輸出層輸出
end 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章