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