1. 程式人生 > >Matlab實現BP神經網路和RBF神經網路(二)

Matlab實現BP神經網路和RBF神經網路(二)

在上一篇博文中:Matlab實現BP神經網路和RBF神經網路(一) 中,我們討論了BP網路設計部分,下面我們將設計RBF網路並將它們結果與SVM對比。

資料格式不變,詳情請看上一篇博文。

RBF神經網路:

RBF網路和BP網路都是非線性多層前向網路,它們都是通用逼近器。對於任一個BP神經網路,總存在一個RBF神經網路可以代替它,反之亦然。但是這兩個網路也存在著很多不同點,他們在網路結構、訓練演算法、網路資源的利用及逼近效能方面均有差異。RBF網路輸入層與隱含層直接連線,相當於直接將輸入向量輸入到隱含層,隱含層的啟用函式有幾種,最常用的是高斯函式:

引用塊內容

σ稱為徑向基函式的擴充套件常數

,它反應了函式影象的寬度,σ越小,寬度越窄,函式越具有選擇性。RBF網路傳遞函式是以輸入向量與中心向量之間的距離|| X-Cj ||作為自變數的,把高斯函式中的r替換為|| X-Cj ||即可。RBF網路需要確定的引數是資料中心C,擴充套件常數σ和隱含層到輸出層的權值。從網上查閱資料說,RBF網路可以根據具體問題確定相應的網路拓撲結構,具有自學習、自組織、自適應功能,它對非線性連續函式具有一致逼近性,學習速度快,可以進行大範圍的資料融合,可以並行高速地處理資料。RBF神經網路的優良特性使得其顯示出比BP神經網路更強的生命力,正在越來越多的領域內替代BP神經網路。下圖是一個輸出神經元RBF網路的示意圖:

這裡寫圖片描述

初始化引數:

同BP網路,RBF訓練前同樣需要初始化各類引數,RBF網路初始化引數有兩種方法,一種是監督學習,一種是非監督學習。

(1)非監督方法:

資料中心的選取可以採用非監督的聚類演算法,例如kmeans演算法,直接求出k個數據中心不再變化,而擴充套件常數可根據各中心間距離來確定:

引用塊內容
這裡寫圖片描述

其中這裡寫圖片描述 為重疊係數。確定資料中心和擴充套件常數後,權值可以通過求線性方程組求出。

(2)監督方法:

最一般的情況,RBF函式中心、擴充套件常數、輸出權值都應該採用監督學習演算法進行訓練,經歷一個誤差修正學習的過程,與BP網路的學習原理一樣。同樣採用梯度下降法,定義目標函式:

引用塊內容

其中,c表示輸出層神經元的個數,tk表示第k個輸出神經元期望輸出,zk表示實際輸出。在本實驗資料中,k取1。Zk由下式計算:

這裡寫圖片描述

其中,M表示隱含層神經元的個數,Wkj表示隱含層到輸出層的權值,X表示輸入樣本,Cj表示第j個隱含層神經元的資料中心。
分別計算目標函式E對權值Wkj、Cj和擴充套件常數σ的偏導,得到以下的更新公式

引用塊內容

做好以上準備工作後,就可以開始實驗了。本實驗採用監督學習的方式來求取各引數,訓練協議同樣是成批訓練,當然也可以隨機訓練,結果都差不多。演算法開始前,需要初始化各引數。隱含層神經元初始化為10,對於Wkj,可以隨機在範圍這裡寫圖片描述 內選取;對於資料中心C,可以從訓練資料中隨機選出10個樣本作為資料中心;而對於σ,由於它決定了徑向基函式的寬度,觀察實驗資料的範圍,使徑向基函式能夠覆蓋整個範圍即可,本實驗中,在2-4之間隨機取10個值來初始化σ。學習率取0.01,目標函式的變化閾值取0.01,這些引數都需要根據實驗結果調整。

實驗程式碼:

初始化工作後,編寫程式碼測試。資料分成10份,每份300樣本,同樣採用10-fold交叉驗證的方法,最後求準確率的平均值。
(1)函式 Batch_RBF_neutral_network.m

function correct_rate=Batch_RBF_Neural_Network(train_data,test_data,hidden_layers,Wkj,c,sigma,theta,eta)
%-------------------------------------------------------------------
%Batch RBF neural network function with only one output neutron
%Inputs:
%train_data     -train data(including samples and its target output)
%test_data      -test data(including samples and its target output)
%hidden_layers  -numbers of hidden layers
%Wkj            -weights between hidden layer and putput layer
%c              -array of center points
%sigma          -standard deviation of Gaussian function
%theta          -threhold of delta target function
%eta            -learnning rate
%Output:
%correct_rate:  -classification correct rate of the test data
%-------------------------------------------------------------------
[rows,cols]=size(train_data);
train_input=train_data(1:rows-1,:);
train_target=train_data(rows,:);
test_input=test_data(1:rows-1,:);
test_target=test_data(rows,:);
%batch rbf algorithm
r=0;   %initialize the episode
J=zeros(1,1000); %initialize the error function
while(1)     %outer loop
    r=r+1;m=0;DELTA_Wkj=zeros(1,hidden_layers);DELTA_c=zeros(hidden_layers,size(train_input,1));  
    DELTA_sigma=zeros(1,hidden_layers);%initialization
    while(1)    %inner loop
        m=m+1; 
        yj=zeros(1,hidden_layers);
        for j=1:hidden_layers
            %calculate the output of the hidden layer
            yj(1,j)=exp(-sum((train_input(:,m)'-c(j,:)).*(train_input(:,m)'-c(j,:)))/(2*sigma(1,j)^2));  
        end
        zk=sum(yj(1,:).*Wkj(1,:));  %output of the output layer
        error=train_target(1,m)-zk;
        J(1,r)=J(1,r)+error^2/2;   %accumulate every error
        for j=1:hidden_layers
            %update the DELTA_Wkj,DELTA_c and DELTA_sigma
            DELTA_Wkj(1,j)=DELTA_Wkj(1,j)+eta*error*yj(1,j);  
            DELTA_c(j,:)=DELTA_c(j,:)+eta*error*Wkj(1,j)*yj(1,j)*(train_input(:,m)'-c(j,:))/sigma(1,j)^2;
            DELTA_sigma(1,j)=DELTA_sigma(1,j)+eta*error*Wkj(1,j)*yj(1,j)* ...
            sum((train_input(:,m)'-c(j,:)).*(train_input(:,m)'-c(j,:)))/sigma(1,j)^3;
        end
        if(m==cols)  %all samples has been trained(one episode)
            break;   %back to outer loop
        end
    end    %end inner loop
    for j=1:hidden_layers
        Wkj(1,j)=Wkj(1,j)+DELTA_Wkj(1,j);   %update Wkj
        c(j,:)=c(j,:)+DELTA_c(j,:);   %update c
        sigma(1,j)=sigma(1,j)+DELTA_sigma(1,j);  %update sigma
    end
    J(1,r)=J(1,r)/cols;
    if((r>=2)&&abs(J(1,r)-J(1,r-1))<theta)  %determine when to stop
        %disp('ok!');disp(r);
        %plot(0:r-1,J(1,1:r));hold on;

        %start to test the model 
        correct=0;
        for i=1:size(test_input,2)
            test_yj=zeros(1,hidden_layers);
            for j=1:hidden_layers
                test_yj(1,j)=exp(-sum((test_input(:,i)'-c(j,:)).*(test_input(:,i)'-c(j,:)))/(2*sigma(1,j)^2));
            end
            test_zk=sum(test_yj(1,:).*Wkj(1,:));  
            if((test_zk>0&&test_target(1,i)==1)||(test_zk<0&&test_target(1,i)==-1))
                correct=correct+1;
            end
        end
        correct_rate=correct/size(test_data,2);
        break;
    end
end

(2)主函式:

clear;
load sample_ex6.mat;
[M,N]=size(data);
hidden_layers=10;
theta=0.01;
eta=0.01;
wkj=-1/(hidden_layers^0.5)+2/(hidden_layers^0.5)*rand(1,hidden_layers);
sigma=zeros(1,hidden_layers);
for i=1:hidden_layers
    sigma(1,i)=2+2*rand();   %initialize sigma to 2.0-4.0
end
%input data normalization
% [norm_data,norm_dataps]=mapminmax(data);

%10-fold crossing validation
sub_N=N/10;
rates=zeros(1,10);
for i=1:10
    testdata=data(:,1:sub_N);  %set the first part as testdata 
    traindata=data(:,sub_N+1:N);   %set the next nine part as traindata
    center_points=zeros(hidden_layers,M-1);
    for j=1:10
        %random initialize center points in train data
        center_points(j,:)=traindata(1:2,ceil(rand()*size(traindata,2)))';
    end
    rates(1,i)=Batch_RBF_Neural_Network(traindata,testdata,hidden_layers,wkj,center_points,sigma,theta,eta);
    data=[traindata,testdata];
end
disp('the accuracy of ten validation:')
disp(rates);disp('the average accuracy is:')
ave_rate=sum(rates)/10;
disp(ave_rate);

實驗結果:

幾次實驗結果如下:

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

由以上結果可以看到,RBF神經網路能得到較高的分類準確率,在96%左右波動,並且觀察10次的準確率,發現有的準確率能到100%,而有的還不到90%,浮動較大,但平均能到96%。

10次驗證總的執行時間比BP網路短:

這裡寫圖片描述

討論完BP神經網路和RBF神經網路,他們的分類準確率到底如何,接下來我們用SVM來對比一下。

可以在matlab安裝LIBSVM,也可以使用matlab自帶的分類學習工具箱(Classification Learner),為了方便,直接使用matlab工具箱中的SVM。

Classification Learner的使用方法參考博文:Matlab自帶的分類學習工具箱

進入Classification Learner,顯示原始資料:

這裡寫圖片描述

點選classifier中的下拉箭頭,選擇svm分類器,點選train,開始訓練,結果如下:

這裡寫圖片描述

圖中顯示了6個SVM分類器的分類結果,準確率最低為Coarse Gaussian SVM的90.9%,而Cubic Gaussian SVM、Fine Gaussian SVM和Medium Gaussian SVM的準確率均為100%,能將測試樣本完全分開。並且,Linear SVM的準確率達到91.1%,也就是說畫條線作為分界的準確率都跟BP網路差不多,所以說本次實驗得到的BP網路的準確率並不高。

下表列出了本實驗三種模型準確率:

這裡寫圖片描述

總結:

  神經網路的訓練前,需要初始化各類引數,這些引數的初始值對網路的效能、收斂速度等都有影響,初始化應該有明確的方向而不是盲目初始化。當然,最佳的引數值需要根據實驗結果進行調整。
  BP神經網路和RBF網路都能用來訓練分類資料,但它們的網路結構、訓練演算法、網路資源的利用及逼近效能等方面均有差異,RBF神經網路可以根據具體問題確定相應的網路拓撲結構,具有自學習、自組織、自適應功能,它對非線性連續函式具有一致逼近性,學習速度快,比BP網路有更強的生命力。
  SVM考慮尋找一個滿足分類要求的超平面,並且使訓練集中的點距離分類面儘可能的遠。在本實驗中,使用高斯函式為核函式的SVM取得的效果最好。

相關推薦

Matlab實現BP神經網路RBF神經網路

本實驗依託於教材《模式分類》第二版第六章(公式符號與書中一致) 實驗內容: 設計編寫BP神經網路和RBF神經網路,對給定資料集進行分類測試,並將分類準確率與SVM進行對比。 實驗環境: matlab2016a 資料集: 資料集大小3*30

Matlab實現BP神經網路RBF神經網路

在上一篇博文中:Matlab實現BP神經網路和RBF神經網路(一) 中,我們討論了BP網路設計部分,下面我們將設計RBF網路並將它們結果與SVM對比。 資料格式不變,詳情請看上一篇博文。 RBF神經網路: RBF網路和BP網路都是非線性多層前向網路,它們都

卷積神經網路CNN的前向後向傳播

卷積神經網路CNN的前向和後向傳播(二) padding=1,stride=1的情形 輸入為8x8和卷積核3x3 對輸入的求導 對卷積核的求導 本文在卷積神經網路CNN的前向和後向傳播(一)的基礎上做一些擴充套件

神經網路深度學習簡史

        “深度學習這一朵浪花在計算機語言學的海上已經被研究了多年,但2015年似乎有一股海嘯般的力量把自然語言處理(NLP)推到了世人面前”-----------Dr. Christopher D. Manning, Dec 2015 [1] 科研某一個領域的所有

cs231n斯坦福基於卷積神經網路的CV學習筆記神經網路訓練細節

五,神經網路 注意點part1 例項:邏輯迴歸二層神經網路訓練函式 使用權重w和偏差值biase計算出第一個隱含層h,然後計算損失,評分,進行反向傳播回去 多種常用啟用函式(一般預設max(0,x)),如sigmoid函式具有飽和區梯度0,非零點中心,計算x複

神經網路之文字情感分析

Projet 2 在Project 1 中,我們學習瞭如何處理和統計reviews 基於上一個Project”一個蘿蔔一個坑”的思想,我們將文字進行了數字化,使得文字可以作為輸入進行訓練 在Project 2中我們將構建一個兩層的神經網路,並進行訓練

利用EasySQLMAIL實現自動資料提取郵件傳送功能 1

轉自:http://blog.sina.com.cn/s/blog_1549483b70102wioy.html 最近幾個月每天都在發通報。過程很繁瑣,動作很機械,整個人就是一部機器,執行SQL,填Excel,發郵件。所以想把日報自動化了。最後找到一個叫EasySQLMAIL的軟體,試了一下,很簡單也很方便

程式設計練習題:實現最大公約數最小公倍數Java

使用輾轉相除法可以快速的實現求最大公約數,而最小公倍數可以通過最大公約數求出。那麼輾轉相除法的原理是什麼呢? 輾轉相除法,又名歐幾里德演算法,是已知最古老的演算法,其可追溯至公元前300年前。

muduo網路庫學習之EventLoop:程序執行緒wait/notify EventLoop::runInLoop

// 事件迴圈,該函式不能跨執行緒呼叫 // 只能在建立該物件的執行緒中呼叫void EventLoop::loop() {// 斷言當前處於建立該物件的執行緒中  assertInLoopThread();     while (!quit_)     {         pollReturnTime_ =

《Docker網路服務發現》

該小節介紹了各種技術和它們的優缺點,並提供了網上的更多資源(如果你想獲得這些技術的實踐經驗,你可以看看Adrian Mouat的書Using Docker)。ZooKeeper Apache ZooKeeper是ASF的頂級專案,基於JVM的集中式配置管理工具,提供了與G

田螺便利店—filezilla實現Linuxwindows通信

rmi 更改 管理 ssh配置 客戶 linu 說明 正常 root filezilla,FileZilla是一個免費開源的FTP軟件,分為客戶端版本和服務器版本,具備所有的FTP軟件功能。可控性、有條理的界面和管理多站點的簡化方式使得Filezilla客戶端版成為一個方便

solr搜索之demo集成IKAnalyzer

solr solr搜索 ikanalyzer分詞器 ikanalyzer 1 新建demo-solr關閉運行的solr應用。進入solr目錄:D:\solr-4.10.2\example1、在example目錄下創建demo-solr文件夾;2、將./solr下的solr.xml拷貝

grunt 合並壓縮jscss文件

1.0 ajax depend cnp com .html post tle runt 具體node及文件配置請看: grunt 安裝使用(一) 要壓縮的文件 --src/ ajax.js assets.js touch.js zepto.js

SpringCloud之實現服務器端的負載均衡Ribbon

del 服務端 gem ring rest span 17. dex eight 一 Ribbon簡介 Ribbon是Netflix發布的負載均衡器,它有助於控制HTTP和TCP的客戶端的行為。為Ribbon配置服務提供者地址後,Ribbon就可基於某種負載均衡算法,自

基於公有雲平臺實現直播、點播及小視頻功能

騰訊 去除 使用 商業 png wowza 技術分享 傳感器 都是 呵呵,上一節不知道怎麽的就開始扯起了電視的發展,不過確實是勾起了我童年的回憶,這節我們正式進入正題,先說說直播。直播這個詞看到以後,讓我們想到的是什麽?其實感覺也沒什麽,因為已經很普及,是否更多的是想到了直

python多線程多進程

模型 pre 否則 sel main 競爭 並發執行 turn 定制 ---恢復內容開始--- 一、多進程   1、multiprocessing模塊用來開啟子進程,並在子進程中執行我們定制的任務(比如函數),該模塊與多線程模塊threading的編程接口類似。 impo

匯編語言--CPU資源存儲器

direct 公式 專用 例子 1-1 star display 獲得 而且 二、CPU資源和存儲器 需要訪問的硬件資源主要有:CPU內部資源、存儲器和I/O端口。 1、寄存器組 (1)16位寄存器組 16位CPU所含有的寄存器有(見圖2.1中16位寄存器部分): 4個數據

基於vue2.0實現仿百度前端分頁效果

前言 上篇文章中,已經使用vue實現前端分頁效果,這篇文章我們單獨將分頁抽離出來實現一個分頁元件 先看實現效果圖 程式碼實現 按照慣例,我們在凍手實現的時候還是先想一想vue實現元件的思路 1、需要提前設定哪些引數需要暴露出來給父元件傳遞 <Paging

ASP.NETCore MVC Visual Studio入門新增控制器

ASP.NETCore MVC 和 Visual Studio入門(二)  新增控制器 Rick Anderson     Model-View-Controller(MVC) 結構模式將一個應用分離為三個主要部分:模型(M)、檢視(V)和控制器

CC++的區別

1、引用 引用就是個別名,記憶體單元的別名,底層以指標的方式來支援引用,在引用使用的地方,系統自帶解引用的過程。 int a = 10; int &b = a; a和b是同一個記憶體塊 引用的注意事項: 引用一定要初始化 引用引用的變數要能取地址 引用是