您的位置:首页 > 其它

BP算法的回归

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BP算法