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算法通常用在三层神经网络,三层:输入层、隐藏层、输出层,其中输入层与输出层的数据都是已知的,但是输入与隐藏层之间的连接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');
相关文章推荐
- 多层感知器python代码(简单的多层感知器)
- Stanford UFLDL教程 反向传播算法(BP算法)
- 反向传播神经网络 BPNN
- 实现一个反向传播人工神经网络
- 神经网络-文本识别
- 神经网络-并行BP算法
- 卷积神经网络反向BP算法公式推导
- 深度学习:神经网络中的前向传播和反向传播算法推导
- BP算法从原理到python实现
- 神经网络
- BP算法公式推导
- Stanford UFLDL教程(一)--神经网络、BP算法、BP初始值设置和梯度检验
- 深度学习基础:反向传播即BP算法的推导过程
- 深入浅出BP神经网络算法的原理
- BP神经网络算法推导
- tensorflow 神经网络基本使用
- 神经网络和深度学习(二)——BP(Backpropagation Algorithm, 反向传播算法)
- 机器学习之深入理解神经网络理论基础、BP算法及其Python实现
- 人工神经网络(ANN)及BP算法
- BP神经网络原理及C++代码实现