天天看點

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維
 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;%% 網絡訓練
 for ii=1:10
     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'+alfa*(w1_1-w1_2);
         b1=b1_1+xite*db1'+alfa*(b1_1-b1_2);
         w2=w2_1+xite*dw2'+alfa*(w2_1-w2_2);
         b2=b2_1+xite*db2'+alfa*(b2_1-b2_2);
         
         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);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%% 結果分析
 %根據網絡輸出找出資料屬于哪類
 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