日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单易学的机器学习算法——神经网络之BP神经网络

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单易学的机器学习算法——神经网络之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神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。