1. 程式人生 > >BP神經網路的資料分類--語音特徵訊號分類(MATLAB)

BP神經網路的資料分類--語音特徵訊號分類(MATLAB)

測試樣例的data資料鏈接:https://pan.baidu.com/s/1sVdYE3-KqVccypy0jWfXHA 提取碼:wnwc 

%% 該程式碼為基於BP網路的語言識別的通用版本
 
%% 清空環境變數
clc
clear
 
%% 訓練資料預測資料提取及歸一化
 
%載入語音訊號
load data
% data矩陣的第一列是label列,每一行表示一個樣本,每一列代表資料的屬性
[rowNum, colNum] = size(data);
labelNum = 2;
% labelNum個特徵訊號矩陣合成一個矩陣
 
% 從1到sampleNum間隨機排序
sampleNum = rowNum;
k=rand(1,sampleNum);
[m,n]=sort(k); 
% m是k按照順序排列好的陣列
% n相當於1到simpleNum的隨機排列陣列
 
% 輸入輸出資料
input=data(:,2:colNum);
output1 =data(:,1);
 
%把輸出從1維變成labelNum維
output=zeros(sampleNum,labelNum);
for i=1:sampleNum
    switch output1(i)
        case 1
            output(i,:)=[1 0];
        case 2
            output(i,:)=[0 1];
    end
end
 
%隨機提取trainNum個樣本為訓練樣本,testNum個樣本為預測樣本
trainNum = 1000; % 訓練樣本根據實際資料的多少靈活設定
testNum = sampleNum - trainNum;
input_train=input(n(1:trainNum),:)';
output_train=output(n(1:trainNum),:)';
input_test=input(n(trainNum+1:sampleNum),:)';
output_test=output(n(trainNum+1:sampleNum),:)';
 
%輸入資料歸一化
[inputn,inputps]=mapminmax(input_train);


%% 網路結構初始化
innum=colNum-1;
midnum=colNum;
outnum=labelNum;
 
%權值初始化
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:trainNum
       %% 網路預測輸出 
        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
                tmp = 0;
                for t=1:1:outnum
                    tmp = tmp +e(t)*w2(j,t);
                end
                dw1(k,j)=FI(j)*x(k)*tmp;
                db1(j)=FI(j)*tmp;
                %dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2));
                %db1(j)=FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2));
            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(labelNum,testNum);
for ii=1:1
    for i=1:testNum %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,testNum);
for i=1:testNum
    output_fore(i)=find(fore(:,i)==max(fore(:,i)));
end
 
%BP網路預測誤差
error=output_fore-output1(n(trainNum+1:sampleNum))';
%畫出預測語音種類和實際語音種類的分類圖
figure(1)
plot(output_fore,'r')
hold on
plot(output1(n(trainNum+1:sampleNum))','b')
legend('預測語音類別','實際語音類別')
 
%畫出誤差圖
figure(2)
plot(error)
title('BP網路分類誤差','fontsize',12)
xlabel('語音訊號','fontsize',12)
ylabel('分類誤差','fontsize',12)
 
%print -dtiff -r600 1-4
 
k=zeros(1,labelNum);  
%找出判斷錯誤的分類屬於哪一類
for i=1:testNum
    if error(i)~=0
        [b,c]=max(output_test(:,i));
        switch c
            % 根據label的不同,case的個數相應變化
            case 1
                k(1)=k(1)+1;
            case 2
                k(2)=k(2)+1;
        end
    end
end
 
%找出每類的個體和
kk=zeros(1,labelNum);
for i=1:testNum
    [b,c]=max(output_test(:,i));
    switch c
        % 根據label的不同,case的個數相應變化
        case 1
            kk(1)=kk(1)+1;
        case 2
            kk(2)=kk(2)+1;
    end
end
 
%正確率
rightridio=(kk-k)./kk;
disp('正確率')
disp(rightridio);

 

原文連結為:https://blog.csdn.net/gyt15663668337/article/details/82707711