%计算反向传播误差
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-');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%出师表
两汉:
诸葛亮
先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。
然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。
诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
宫中府中,俱为一体;陟罚臧否,不宜异同。
若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。
侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:
愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督:
愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。
先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。
侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也
。
臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。
先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。
后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
先帝知臣谨慎,故临崩寄臣以大事也。
受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。
今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。
此臣所以报先帝而忠陛下之职分也。
至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。
若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。
臣不胜受恩感激。
今当远离,临表涕零,不知所言。