BP算法的迴歸

近日看模式識別相關的書,接觸到一些常見的機器學習算法,雖然書中對於算法的理論介紹很清晰,但是很少給出算法的具體函數定義,所以我就想通過書中的介紹和已有別人的代碼,自己整理出來算法的matlab實現。

BP算法通常用在三層神經網絡,三層:輸入層、隱藏層、輸出層,其中輸入層與輸出層的數據都是已知的,但是輸入與隱藏層之間的連接w、隱藏層與輸出層的連接v未知。我們首先爲w v設定一組初始值,相當於認爲的構造了網絡內部的參數,然後給神經網絡一組輸入,網絡在初始參數的變換下產生一組輸出,當然這個輸出不可能跟你實際的輸出相同,下一步就是用這組網絡輸出跟實際輸出做差值,用這個誤差再反過來調節w v,如此循環,直到模型的輸出誤差滿足要求。

1.BP算法的函數定義

function [TestingTime, TestingAccuracy,PreY] = bp(train,test, IN, HN, times,limit,alpha,beta)
%input and output must be row vector
%HN means numbers of hidden-node
%times and limit give the condition of quit the loop 
%alpha is in 0.9~1,beta is in 0.1~3,but youcan adjust them to any value as need
 
input=train(1:IN,:);output=train((IN+1):end,:);
[m,N]=size(input);[n,N]=size(output);
%%輸入元素歸一化
minx=min(min(input));maxx=max(max(input));
input=(input-minx)/(maxx-minx);
%%輸出元素歸一化
miny=min(min(output));maxy=max(max(output));
output=(output-miny)/(maxy-miny);

w=rand(HN,m)*2-1;v=rand(n,HN)*2-1;
w0=zeros(size(w));v0=zeros(size(v));
epoch=0;
while(epoch<times)
    epoch=epoch+1;
    %計算隱含層各神經元的輸出
    NETi=w*input;
    Oi=sigmf(NETi,[1,0]);
    %計算輸出層各神經元輸出
    NETk=v*Oi;
    Ok=sigmf(NETk,[1,0]);
    %計算全局誤差函數
    errtp=output-Ok;
    Accuracy=0.5*errtp*errtp';
    y_delta=errtp.*Ok.*(1-Ok);
    %計算隱含層誤差函數
    errtp=v'*y_delta;
    hn_delta=errtp.*Oi.*(1-Oi);
    
    %調整輸出層加權係數
    v0=alpha*v0+beta*y_delta*Oi';
    v=v+v0;
    %調整隱含層加權係數
    w0=alpha*w0+beta*hn_delta*input';
    w=w+w0;
    %判斷誤差是否足夠小
      if Accuracy<limit
        break;
      end
end


%BP網絡的第二階段工作期(根據訓練好的w,v和給定的輸入計算輸出)
%%輸入元素歸一化
t0=cputime;
Tinput=test(1:IN,:);
Tinput=(Tinput-minx)/(maxx-minx);
%%輸出元素歸一化
output=test((IN+1):end,:);
output=(output-miny)/(maxy-miny);
%計算隱含層各神經元輸出
NETi=w*Tinput;
Oi=sigmf(NETi,[1,0]);
%計算輸出層各神經元的輸出
NETk=v*Oi;
Ok=sigmf(NETk,[1,0]);
%%計算輸出的均方差
errtp=output-Ok;
TestingAccuracy=sqrt(errtp*errtp');
%%輸出算法預測結果
PreY=Ok*(maxy-miny)+miny;
t1=cputime;
TestingTime=t1-t0;

2.一個函數運行的實例驗證

X=0.1:0.1:5;
Y=power(X,2);
train=[X;Y];

x=2.1:0.1:4;

y=power(x,2);

test=[x;y];
[estingTime, TestingAccuracy,PreY] = bp(train,test,1, 8, 1000,0.001,0.1,0.1);
figure
plot(x,y,'b',x,PreY,'r');


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章