生活随笔
收集整理的這篇文章主要介紹了
简单易学的机器学习算法——神经网络之BP神经网络
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、BP神經網絡的概念
? ? BP神經網絡是一種多層的前饋神經網絡,其主要的特點是:信號是前向傳播的,而誤差是反向傳播的。具體來說,對于如下的只含一個隱層的神經網絡模型:
(三層BP神經網絡模型)
BP神經網絡的過程主要分為兩個階段,第一階段是信號的前向傳播,從輸入層經過隱含層,最后到達輸出層;第二階段是誤差的反向傳播,從輸出層到隱含層,最后到輸入層,依次調節隱含層到輸出層的權重和偏置,輸入層到隱含層的權重和偏置。
二、BP神經網絡的流程
? ? 在知道了BP神經網絡的特點后,我們需要依據信號的前向傳播和誤差的反向傳播來構建整個網絡。
1、網絡的初始化
? ? 假設輸入層的節點個數為,隱含層的節點個數為,輸出層的節點個數為。輸入層到隱含層的權重,隱含層到輸出層的權重為,輸入層到隱含層的偏置為,隱含層到輸出層的偏置為。學習速率為,激勵函數為。其中激勵函數為取Sigmoid函數。形式為:
2、隱含層的輸出
? ? 如上面的三層BP網絡所示,隱含層的輸出為
3、輸出層的輸出
4、誤差的計算
? ? 我們取誤差公式為:
其中為期望輸出。我們記,則可以表示為
以上公式中,,,。
5、權值的更新
? ? 權值的更新公式為:
這里需要解釋一下公式的由來:
這是誤差反向傳播的過程,我們的目標是使得誤差函數達到最小值,即,我們使用梯度下降法:
則權重的更新公式為:
其中
則權重的更新公式為:
6、偏置的更新
? ? 偏置的更新公式為:
則偏置的更新公式為:
其中
則偏置的更新公式為:
7、判斷算法迭代是否結束
? ? 有很多的方法可以判斷算法是否已經收斂,常見的有指定迭代的代數,判斷相鄰的兩次誤差之間的差別是否小于指定的值等等。
三、實驗的仿真
? ? 在本試驗中,我們利用BP神經網絡處理一個四分類問題,最終的分類結果為:
MATLAB代碼
主程序
[plain] view plaincopy
%%?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??激活函數
[plain] view plaincopy
%%?激活函數??function?[?y?]?=?g(?x?)??????y?=?1./(1+exp(-x));??end??
總結
以上是生活随笔為你收集整理的简单易学的机器学习算法——神经网络之BP神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。