BP算法的回归

来源:互联网 发布:学电脑编程先学什么 编辑:程序博客网 时间:2024/05/10 09:46

近日看模式识别相关的书,接触到一些常见的机器学习算法,虽然书中对于算法的理论介绍很清晰,但是很少给出算法的具体函数定义,所以我就想通过书中的介绍和已有别人的代码,自己整理出来算法的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');


0 0
原创粉丝点击