BP函数逼近
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BP网络实现分类问题
一,问题的提出
根据感知器的的相关理论易知感知器善于解决线性可分问题,而不能解决XOR问题,所以引进了BP网络,并通过相关知识来解决分类问题。
反向传播网络(Back-Propagation Network,简称BP网络)是将W-H学习规则一般化,对非线性可微分函数进行权值训练的多层网络。BP网络主要用于函数逼近,模式识别,分类,数据压缩。在人工神经网络的实际应用中,80%~90%的人工神经网络模型是采用BP网络或它的变化形式,也是前行网络的核心部分,体现了人工神经网络最精华的部分。
一个具有r个输入和一个隐含层的神经网络模型结构如图所示
下图所示是S型激活函数的图型,可以看到f ()是一个连续可微的函数,一阶导数存在。对于多层网络,这种激活函数所划分的区域不再是线性划分,而是有一个非线性的超平面组成的区域。它还可以严格利用梯度算法进行推算,他的权值修正的解析式十分明确,其算法被称为误差反向传播法,简称SP算法。
BP算法是有两部分组成:信息的正向传递与误差的反向传播。在正向传播过程中,输入信息从输入经隐含层逐层计算传向输出层,每一层神经元的状态值影响下一层神经元的状态。如果在输出层没有得到期望的输出,则计算输出层的误差变化值,然后转向反向传播,通过网络将误差信号沿原来的连接通路反传回来修改各层神经元的权值直至达到期望的目标。
BP网络分类问题
原程序:
function main()
InDim=2; % 样本输入维数OutDim=3; % 样本输出维数
% figure
% colordef(gcf,'white')
% echo off
% clc
% axis([-2,2,-2,2])
% axis on
% grid
% xlabel('Input x');
% ylabel('Input y');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% line([-1 1],[1 1])
% line([1 -1],[1 0])
% line([-1 -1],[0 1])
% line([-1 1],[-0.5 -0.5])
% line([-1 1],[-1.5 -1.5])
% line([1 1],[-0.5 -1.5])
% line([-1 -1],[-0.5 -1.5]) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% hold on
% sj=plot([-1 1],[1 1],[1 -1],[1 0],[-1 -1],[0 1]);
% hold on
% set(sj,'Color','r','LineWidth',4);
% js=plot([-1 1],[-0.5 -0.5],'b',[-1 1],[-1.5 -1.5],'b',[1 1],... % [-0.5 -1.5],'b',[-1 -1],[-0.5 -1.5],'b');
% hold on
% set(js,'Color','b','LineWidth',4);
%hold off
figure
colordef(gcf,'white')
echo off
clc
axis([-2,2,-2,2])
axis on
grid
xlabel('Input x');
ylabel('Input y');
hold on
sj=plot([-1 1],[1 1],[1 -1],[1 0],[-1 -1],[0 1]);
hold on
js=plot([-1 1],[-0.5 -0.5],'b',[-1 1],[-1.5 -1.5],'b',[1 1],... [-0.5 -1.5],'b',[-1 -1],[-0.5 -1.5],'b');
hold on
set(sj,'Color','r','LineWidth',4);
set(js,'Color','b','LineWidth',4);
hold on
SamNum=400; % 训练样本数rand('state', sum(100*clock))
SamIn=(rand(2,SamNum)-0.5)*4; % 产生随机样本输入
% 根据目标函数获得训练样本输入输出,并绘制样本
SamOut=[];
for i=1:SamNum
Sam=SamIn(:,i);
x=Sam(1,1);
y=Sam(2,1);
if((x>-1)&(x<1))==1
if((y>x/2+1/2)&(y<1))==1
plot(x,y,'k+')
class=[0 1 0]';
elseif((y<-0.5)&(y>-1.5))==1
plot(x,y,'ks')
class=[0 0 1]';
else
plot(x,y,'ko')
class=[1 0 0]';
end
else
plot(x,y,'ko')
class=[1 0 0]';
end
SamOut=[SamOut class];
end
HiddenUnitNum=10; % 隐节点数
MaxEpochs=10000; % 最大训练次数
lr=0.1; % 学习率
E0=0.1; % 目标误差
W1=0.2*rand(HiddenUnitNum,InDim)-0.1; % 输入层到隐层的初始权值
B1=0.2*rand(HiddenUnitNum,1)-0.1; % 隐节点初始偏移
W2=0.2*rand(OutDim,HiddenUnitNum)-0.1; % 隐层到输出层的初始权值
B2=0.2*rand(OutDim,1)-0.1; % 输出层初始偏移
W1Ex=[W1 B1]; % 输入层到隐层的初始权值扩展, 10*3
W2Ex=[W2 B2]; % 隐层到输出层的初始权值, 3*11