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