BP神經網路,BP推導過程,反向傳播演算法,誤差反向傳播,梯度下降,權值閾值更新推導,隱含層權重更新公式
阿新 • • 發佈:2019-02-20
- %% BP的主函式
- % 清空
- clear all;
- clc;
- % 匯入資料
- load data;
- %從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個樣本為預測樣本
- trainCharacter=input(n(1:1600),:);
- trainOutput=output(n(1:1600),:);
- testCharacter=input(n(1601:2000),:);
- testOutput=output(n(1601:2000),:);
- % 對訓練的特徵進行歸一化
- [trainInput,inputps]=mapminmax(trainCharacter‘);
- %% 引數的初始化
- % 引數的初始化
- inputNum = 24;%輸入層的節點數
- hiddenNum = 50;%隱含層的節點數
- outputNum = 4;%輸出層的節點數
- % 權重和偏置的初始化
- w1 = rands(inputNum,hiddenNum);
- b1 = rands(hiddenNum,1);
- w2 = rands(hiddenNum,outputNum);
- b2 = rands(outputNum,1);
- % 學習率
- yita = 0.1;
- %% 網路的訓練
- for r = 1:30
- E(r) = 0;% 統計誤差
- for m = 1:1600
- % 資訊的正向流動
- x = trainInput(:,m);
- % 隱含層的輸出
- for j = 1:hiddenNum
- hidden(j,:) = w1(:,j)‘*x+b1(j,:);
- hiddenOutput(j,:) = g(hidden(j,:));
- end
- % 輸出層的輸出
- outputOutput = w2‘*hiddenOutput+b2;
- % 計算誤差
- e = trainOutput(m,:)‘-outputOutput;
- E(r) = E(r) + sum(abs(e));
- % 修改權重和偏置
- % 隱含層到輸出層的權重和偏置調整
- dw2 = hiddenOutput*e‘;
- db2 = e;
- % 輸入層到隱含層的權重和偏置調整
- for j = 1:hiddenNum
- partOne(j) = hiddenOutput(j)*(1-hiddenOutput(j));
- partTwo(j) = w2(j,:)*e;
- end
- for i = 1:inputNum
- for j = 1:hiddenNum
- dw1(i,j) = partOne(j)*x(i,:)*partTwo(j);
- db1(j,:) = partOne(j)*partTwo(j);
- end
- end
- w1 = w1 + yita*dw1;
- w2 = w2 + yita*dw2;
- b1 = b1 + yita*db1;
- b2 = b2 + yita*db2;
- end
- end
- %% 語音特徵訊號分類
- testInput=mapminmax(‘apply‘,testCharacter‘,inputps);
- for m = 1:400
- for j = 1:hiddenNum
- hiddenTest(j,:) = w1(:,j)‘*testInput(:,m)+b1(j,:);
- hiddenTestOutput(j,:) = g(hiddenTest(j,:));
- end
- outputOfTest(:,m) = w2‘*hiddenTestOutput+b2;
- end
- %% 結果分析
- %根據網路輸出找出資料屬於哪類
- for m=1:400
- output_fore(m)=find(outputOfTest(:,m)==max(outputOfTest(:,m)));
- end
- %BP網路預測誤差
- error=output_fore-output1(n(1601:2000))‘;
- k=zeros(1,4);
- %找出判斷錯誤的分類屬於哪一類
- for i=1:400
- if error(i)~=0
- [b,c]=max(testOutput(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:400
- [b,c]=max(testOutput(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