BP函数逼近.docx

上传人:b****8 文档编号:13189975 上传时间:2023-06-11 格式:DOCX 页数:17 大小:195KB
下载 相关 举报
BP函数逼近.docx_第1页
第1页 / 共17页
BP函数逼近.docx_第2页
第2页 / 共17页
BP函数逼近.docx_第3页
第3页 / 共17页
BP函数逼近.docx_第4页
第4页 / 共17页
BP函数逼近.docx_第5页
第5页 / 共17页
BP函数逼近.docx_第6页
第6页 / 共17页
BP函数逼近.docx_第7页
第7页 / 共17页
BP函数逼近.docx_第8页
第8页 / 共17页
BP函数逼近.docx_第9页
第9页 / 共17页
BP函数逼近.docx_第10页
第10页 / 共17页
BP函数逼近.docx_第11页
第11页 / 共17页
BP函数逼近.docx_第12页
第12页 / 共17页
BP函数逼近.docx_第13页
第13页 / 共17页
BP函数逼近.docx_第14页
第14页 / 共17页
BP函数逼近.docx_第15页
第15页 / 共17页
BP函数逼近.docx_第16页
第16页 / 共17页
BP函数逼近.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

BP函数逼近.docx

《BP函数逼近.docx》由会员分享,可在线阅读,更多相关《BP函数逼近.docx(17页珍藏版)》请在冰点文库上搜索。

BP函数逼近.docx

BP函数逼近

BP网络实现分类问题

一,问题的提出

根据感知器的的相关理论易知感知器善于解决线性可分问题,而不能解决XOR问题,所以引进了BP网络,并通过相关知识来解决分类问题。

反向传播网络(Back-PropagationNetwork,简称BP网络)是将W-H学习规则一般化,对非线性可微分函数进行权值训练的多层网络。

BP网络主要用于函数逼近,模式识别,分类,数据压缩。

在人工神经网络的实际应用中,80%~90%的人工神经网络模型是采用BP网络或它的变化形式,也是前行网络的核心部分,体现了人工神经网络最精华的部分。

一个具有r个输入和一个隐含层的神经网络模型结构如图所示

下图所示是S型激活函数的图型,可以看到f()是一个连续可微的函数,一阶导数存在。

对于多层网络,这种激活函数所划分的区域不再是线性划分,而是有一个非线性的超平面组成的区域。

它还可以严格利用梯度算法进行推算,他的权值修正的解析式十分明确,其算法被称为误差反向传播法,简称SP算法。

BP算法是有两部分组成:

信息的正向传递与误差的反向传播。

在正向传播过程中,输入信息从输入经隐含层逐层计算传向输出层,每一层神经元的状态值影响下一层神经元的状态。

如果在输出层没有得到期望的输出,则计算输出层的误差变化值,然后转向反向传播,通过网络将误差信号沿原来的连接通路反传回来修改各层神经元的权值直至达到期望的目标。

BP网络分类问题

 

 

原程序:

functionmain()

InDim=2;%样本输入维数

OutDim=3;%样本输出维数

 

%figure

%colordef(gcf,'white')

%echooff

%clc

%axis([-2,2,-2,2])

%axison

%grid

%xlabel('Inputx');

%ylabel('Inputy');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%line([-11],[11])

%line([1-1],[10])

%line([-1-1],[01])

%line([-11],[-0.5-0.5])

%line([-11],[-1.5-1.5])

%line([11],[-0.5-1.5])

%line([-1-1],[-0.5-1.5])

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%holdon

%sj=plot([-11],[11],[1-1],[10],[-1-1],[01]);

%holdon

%set(sj,'Color','r','LineWidth',4);

%js=plot([-11],[-0.5-0.5],'b',[-11],[-1.5-1.5],'b',[11],...

%[-0.5-1.5],'b',[-1-1],[-0.5-1.5],'b');

%holdon

%set(js,'Color','b','LineWidth',4);

%holdoff

figure

colordef(gcf,'white')

echooff

clc

axis([-2,2,-2,2])

axison

grid

xlabel('Inputx');

ylabel('Inputy');

holdon

sj=plot([-11],[11],[1-1],[10],[-1-1],[01]);

holdon

js=plot([-11],[-0.5-0.5],'b',[-11],[-1.5-1.5],'b',[11],...

[-0.5-1.5],'b',[-1-1],[-0.5-1.5],'b');

holdon

set(sj,'Color','r','LineWidth',4);

set(js,'Color','b','LineWidth',4);

holdon

SamNum=400;%训练样本数

rand('state',sum(100*clock))

SamIn=(rand(2,SamNum)-0.5)*4;%产生随机样本输入

%根据目标函数获得训练样本输入输出,并绘制样本

SamOut=[];

fori=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=[010]';

elseif((y<-0.5)&(y>-1.5))==1

plot(x,y,'ks')

class=[001]';

else

plot(x,y,'ko')

class=[100]';

end

else

plot(x,y,'ko')

class=[100]';

end

SamOut=[SamOutclass];

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=[W1B1];%输入层到隐层的初始权值扩展,10*3

W2Ex=[W2B2];%隐层到输出层的初始权值,3*11

SamInEx=[SamIn'ones(SamNum,1)]';%样本输入扩展,3*200

ErrHistory=[];%用于记录每次权值调整后的训练误差

 

fori=1:

MaxEpochs

%正向传播计算网络输出

HiddenOut=logsig(W1Ex*SamInEx);

HiddenOutEx=[HiddenOut'ones(SamNum,1)]';

NetworkOut=logsig(W2Ex*HiddenOutEx);

%停止学习判断

Error=SamOut-NetworkOut;

SSE=sumsqr(Error);

fprintf('Times:

%7.0f',i);

fprintf('SSE:

%12.4f\n\n',SSE);

%记录每次权值调整后的训练误差

ErrHistory=[ErrHistorySSE];

ifSSE

%计算反向传播误差

Delta2=Error.*NetworkOut.*(1-NetworkOut);

Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);

%计算权值调节量

dW2Ex=Delta2*HiddenOutEx';

dW1Ex=Delta1*SamInEx';

%权值调节

W1Ex=W1Ex+lr*dW1Ex;

W2Ex=W2Ex+lr*dW2Ex;

%分离隐层到输出层的权值,以便后面使用(见%计算反向传播误差之第二行132)

W2=W2Ex(:

1:

HiddenUnitNum);

end

 

W1=W1Ex(:

1:

InDim);

B1=W1Ex(:

InDim+1);

%W2=W2Ex(:

1:

HiddenUnitNum);

B2=W2Ex(:

1+HiddenUnitNum);

 

%绘制学习误差曲线

 

figure

holdon

grid

[xx,Num]=size(ErrHistory);

er111=plot(1:

Num,ErrHistory,'k-');

set(er111,'Color','b','LineWidth',1.5);

 

%根据目标函数获得训练样本输入输出,并绘制样本

TestSamNum=10000;%测试样本数

%rand('state',sum(100*clock));

TestSamIn=(rand(2,TestSamNum)-0.3)*4;%产生随机样本输入

TestHiddenOut=logsig(W1*TestSamIn+repmat(B1,1,TestSamNum));

TestNetworkOut=logsig(W2*TestHiddenOut+repmat(B2,1,TestSamNum));

[Val,NNClass]=max(TestNetworkOut);

TestTargetOut=[];

fori=1:

TestSamNum

Sam=TestSamIn(:

i);

x=Sam(1,1);

y=Sam(2,1);

if((x>-1)&(x<1))==1

if((y>x/2+1/2)&(y<1))==1

TestTargetOut=[TestTargetOut2];

elseif((y<-0.5)&(y>-1.5))==1

TestTargetOut=[TestTargetOut3];

else

TestTargetOut=[TestTargetOut1];

end

else

TestTargetOut=[TestTargetOut1];

end

end

 

%显示计算结果

NNC1Flag=abs(NNClass-1)<0.1;

NNC2Flag=abs(NNClass-2)<0.1;

NNC3Flag=abs(NNClass-3)<0.1;

 

TargetC1Flag=abs(TestTargetOut-1)<0.1;

TargetC2Flag=abs(TestTargetOut-2)<0.1;

TargetC3Flag=abs(TestTargetOut-3)<0.1;

Target_C1_num=sum(TargetC1Flag);

Target_C2_num=sum(TargetC2Flag);

Target_C3_num=sum(TargetC3Flag);

Test_C1_num=sum(NNC1Flag);

Test_C2_num=sum(NNC2Flag);

Test_C3_num=sum(NNC3Flag);

 

Test_C1_C1=1.0*NNC1Flag*TargetC1Flag';

Test_C1_C2=1.0*NNC1Flag*TargetC2Flag';

Test_C1_C3=1.0*NNC1Flag*TargetC3Flag';

 

Test_C2_C1=1.0*NNC2Flag*TargetC1Flag';

Test_C2_C2=1.0*NNC2Flag*TargetC2Flag';

Test_C2_C3=1.0*NNC2Flag*TargetC3Flag';

 

Test_C3_C1=1.0*NNC3Flag*TargetC1Flag';

Test_C3_C2=1.0*NNC3Flag*TargetC2Flag';

Test_C3_C3=1.0*NNC3Flag*TargetC3Flag';

Test_Correct=(Test_C1_C1+Test_C2_C2+Test_C3_C3)/TestSamNum;

%输出格式设计

disp('///////////////////////////////////////////////////////////');

fprintf('\n');

disp('测试报告');

fprintf('\n');

fprintf('测试样本总数:

%7.0f\n\n',TestSamNum);

fprintf('第一类样本数:

%7.0f\n',Target_C1_num);

fprintf('第二类样本数:

%7.0f\n',Target_C2_num);

fprintf('第三类样本数:

%7.0f\n\n',Target_C3_num);

disp('===========================');

fprintf('\n');

fprintf('第一类样本分布(C1=%4.0f)\n',Test_C1_num);

fprintf('C11=%4.0f',Test_C1_C1);

fprintf('C12=%4.0f',Test_C1_C2);

fprintf('C13=%4.0f\n\n',Test_C1_C3);

fprintf('第二类样本分布(C2=%3.0f)\n',Test_C2_num);

fprintf('C21=%4.0f',Test_C2_C1);

fprintf('C22=%4.0f',Test_C2_C2);

fprintf('C23=%4.0f\n\n',Test_C2_C3);

fprintf('第三类样本分布(C3=%3.0f)\n',Test_C3_num);

fprintf('C31=%4.0f',Test_C3_C1);

fprintf('C32=%4.0f',Test_C3_C2);

fprintf('C33=%4.0f\n\n',Test_C3_C3);

fprintf('正确率:

%6.4f\n\n',Test_Correct);

disp('///////////////////////////////////////////////////////////');

fprintf('\n\n');

RBF网络对非线性函数的逼近问题

Powell于1985年提出了多变量差值的径向基函数(RadialBasisFuction,RBF)方法。

后来,Broomhead等人于1988年成功地将径向基函数用于模式识别。

径向基函数网络是一种前馈神经网络,一般为三层结构。

与多层感知器不同,RBF网络的做显著的特点是隐节电的基函数采用距离函数,并使用径向基函数作为激活函数。

RBF网络的各个神经元具有局部特性,最终整个RBF网最终也呈现“”局部映射,即RBF网是一种局部响应的神经网络。

这意味着如果神经网络有较大的输出,必定激活了一个或多个隐节点。

事实上,RBF网络的隐节点的局部特性主要四模仿了某些生物神经元的“内兴奋外抑制”功能,灵长类动物的视觉系统中就有这样的的神经元

RBF网的分类方法可分为两大类:

数据中心从样本输入中选取和数据中心动态调节方法。

聚类方法是最经典的RBF网学习算法,其思路是先用无监督学习方法确定RBF网中h个隐节点的数据中心,并根据数据中心之间的距离确定隐节点的扩展常数,然后用有监督学习训练个隐节点的输出权值。

RBF的梯度训练方法与BP算法训练多层感知器的原理类似,也是通过最小化目标函数实现对个隐节点数据中心、扩展常数和输出权值的调节。

径向基函数网络利用具有局部隆起的所谓径向基函数来做逼近或分类问题,对于某些问题,RBF网络比BP精度更高。

下面来

clear;clc;

X=[0:

0.1:

1];%样本点

N=length(X);

Nr=6;%隐层节点数

T=exp(X)+X.^2+sin(X);%逼近的函数

%%%%计算中心矢量

a=0.2;

c=randn(1,Nr);

fork=1:

N

d=(X(k)*ones(1,Nr)-c).^2;

[m,I]=min(d);

c1=c;

c1(I)=c(I)+a*[X(k)-c(I)];

c=c1;

a=a/(1+sqrt(k/Nr));

end

%%%%计算方差

deta=zeros(1,Nr);

fork=1:

N

deta=deta+(X(k)*ones(1,Nr)-c).^2;

end

deta=deta/N;

%%%%权值迭代

R=zeros(1,Nr);

W0=0.2*randn(1,Nr);

dww=1;

a2=0.4;%更新步长

n2=0;%迭代次数

whiledww>0.001

W=W0;

y=zeros(1,N);

fork=1:

N

R=exp(-(X(k)*ones(1,Nr)-c).^2./(2*deta));

y(k)=W*R';%输出

dW=a2*(T(k)-y(k))*R;

W=W+dW;%更新权值

end

dww=norm(W-W0);

n2=n2+1;

W0=W;

dE=0;

fork=1:

N

dE=dE+1/2*(T(k)-y(k))^2;

end

E(n2)=dE;

end

%%%%测试

t1=[0:

0.1:

1];

Yout1=zeros(1,N);

fori=1:

N

R=exp(-(t1(i)*ones(1,Nr)-c).^2./(2*deta));

Yout1(i)=W*R';

end

t2=[0:

0.05:

1];

Yout2=zeros(1,length(t2));

fori=1:

length(t2)

R=exp(-(t2(i)*ones(1,Nr)-c).^2./(2*deta));

Yout2(i)=W*R';

end

figure

(1);

plot(t1,Yout1,'b-',t2,Yout2,'r+',X,T,'g-');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%出师表

两汉:

诸葛亮

  先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。

然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。

诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。

  宫中府中,俱为一体;陟罚臧否,不宜异同。

若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。

  侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:

愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。

  将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督:

愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。

  亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。

先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。

侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也

  臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。

先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。

后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。

  先帝知臣谨慎,故临崩寄臣以大事也。

受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。

今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。

此臣所以报先帝而忠陛下之职分也。

至于斟酌损益,进尽忠言,则攸之、祎、允之任也。

  愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。

若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。

臣不胜受恩感激。

  今当远离,临表涕零,不知所言。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2