1. 程式人生 > >matlab建立簡單BP神經網路的資料分類

matlab建立簡單BP神經網路的資料分類

BP神經網路是一種多層前饋神經網路,網路訊號向前傳遞,誤差反向傳播。在已知的神經網路基礎上,通過北航出版社開源MATLAB神經網路開源訓練和程式碼庫來學習在MATLAB上建立和學習BP神經網路。

%% 該程式碼為基於BP網路的語言識別

%% 清空環境變數
%%clc
%%clear

%% 訓練資料預測資料提取及歸一化

%下載四類語音訊號
load data1 c1
load data2 c2
load data3 c3
load data4 c4

%四個特徵訊號矩陣合成一個矩陣
data(1:500,:)=c1(1:500,:);
data(501:1000,:)=c2(1:500,:);
data(1001
:1500,:)=c3(1:500,:); data(1501:2000,:)=c4(1:500,:); %從1到2000間隨機排序 k=rand(1,2000); [m,n]=sort(k); %輸入輸出資料 input=data(:,2:25); output1 =data(:,1); %把輸出從1維變成4維 output=zeros(2000,4); for i=1:2000 switch output1(i) case 1 output(i,:)=[1 0 0 0]; case 2 output(i,:)=[0 1 0 0]; case
3 output(i,:)=[0 0 1 0]; case 4 output(i,:)=[0 0 0 1]; end end %隨機提取1500個樣本為訓練樣本,500個樣本為預測樣本 input_train=input(n(1:1500),:)'; output_train=output(n(1:1500),:)'; input_test=input(n(1501:2000),:)'; output_test=output(n(1501:2000),:)'; %輸入資料歸一化 [inputn,inputps]=mapminmax(input_train); %% 網路結構初始化
innum=24; midnum=25; outnum=4; %權值初始化 w1=rands(midnum,innum); b1=rands(midnum,1); w2=rands(midnum,outnum); b2=rands(outnum,1); w2_1=w2;w2_2=w2_1; w1_1=w1;w1_2=w1_1; b1_1=b1;b1_2=b1_1; b2_1=b2;b2_2=b2_1; %學習率 xite=0.1; alfa=0.01; loopNumber=10; I=zeros(1,midnum); Iout=zeros(1,midnum); FI=zeros(1,midnum); dw1=zeros(innum,midnum); db1=zeros(1,midnum); %% 網路訓練 E=zeros(1,loopNumber); for ii=1:loopNumber E(ii)=0; for i=1:1:1500 %% 網路預測輸出 x=inputn(:,i); % 隱含層輸出 for j=1:1:midnum I(j)=inputn(:,i)'*w1(j,:)'+b1(j); Iout(j)=1/(1+exp(-I(j))); end % 輸出層輸出 yn=w2'*Iout'+b2; %% 權值閥值修正 %計算誤差 e=output_train(:,i)-yn; E(ii)=E(ii)+sum(abs(e)); %計算權值變化率 dw2=e*Iout; db2=e'; for j=1:1:midnum S=1/(1+exp(-I(j))); FI(j)=S*(1-S); end for k=1:1:innum for j=1:1:midnum dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4)); db1(j)=FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4)); end end w1=w1_1+xite*dw1'; b1=b1_1+xite*db1'; w2=w2_1+xite*dw2'; b2=b2_1+xite*db2'; w1_2=w1_1;w1_1=w1; w2_2=w2_1;w2_1=w2; b1_2=b1_1;b1_1=b1; b2_2=b2_1;b2_1=b2; end end %% 語音特徵訊號分類 inputn_test=mapminmax('apply',input_test,inputps); fore=zeros(4,500); for ii=1:1 for i=1:500%1500 %隱含層輸出 for j=1:1:midnum I(j)=inputn_test(:,i)'*w1(j,:)'+b1(j); Iout(j)=1/(1+exp(-I(j))); end fore(:,i)=w2'*Iout'+b2; end end %% 結果分析 %根據網路輸出找出資料屬於哪類 output_fore=zeros(1,500); for i=1:500 output_fore(i)=find(fore(:,i)==max(fore(:,i))); end %BP網路預測誤差 error=output_fore-output1(n(1501:2000))'; %畫出預測語音種類和實際語音種類的分類圖 figure(1) plot(output_fore,'r') hold on plot(output1(n(1501:2000))','b') legend('預測語音類別','實際語音類別') %畫出誤差圖 figure(2) plot(error) title('BP網路分類誤差','fontsize',12) xlabel('語音訊號','fontsize',12) ylabel('分類誤差','fontsize',12) %print -dtiff -r600 1-4 k=zeros(1,4); %找出判斷錯誤的分類屬於哪一類 for i=1:500 if error(i)~=0 [b,c]=max(output_test(:,i)); switch c case 1 k(1)=k(1)+1; case 2 k(2)=k(2)+1; case 3 k(3)=k(3)+1; case 4 k(4)=k(4)+1; end end end %找出每類的個體和 kk=zeros(1,4); for i=1:500 [b,c]=max(output_test(:,i)); switch c case 1 kk(1)=kk(1)+1; case 2 kk(2)=kk(2)+1; case 3 kk(3)=kk(3)+1; case 4 kk(4)=kk(4)+1; end end %正確率 rightridio=(kk-k)./kk; disp('正確率') disp(rightridio);

通過儲存好的4個訓練資料庫對網路進行訓練

對其中一些函式工具庫進行批註解釋:
mapminmax(input_train):輸入資料歸一化函式
將資料矩陣的值進行歸一化處理,按最大最小法Xk=(Xk-Xmin)/(Xmax-Xmin)把各個資料限制在[0,1],不具有量級差別。

mapminmax(‘apply’,input_test,inputps): transforms X consistent with settings returned by a previous transformation.資料轉化賦值,將測試的輸入資料歸一化處理,測試輸入資料賦值到inputps,歸一化處理後賦值給inputun_test