📄 improvedran.asv
字号:
%绘制目标曲线和神经网络输出曲线
TestNNOut=RBFNN(p2,UnitCenters,w2,b2,SpreadConstant);
[xxx,PtNum]=size(t2); %此处的PtNum=201
figure
echo off %turns off echoing.
axis([0 PtNum 0 1])
axis on %turns axis labeling, tick marks and background back on.
%grid
hold on
plot(1:PtNum,t2,'*-')
plot(1:PtNum,TestNNOut,'r.-')
legend('Sample Outputs','RAN')
xlabel('目标曲线和RAN神经网络输出曲线')
UnitNum
TestRSME
%绘制隐节点变化曲线
[xxx,PtNum]=size(AllUnitNum); %此处的PtNum=400
figure
echo off
axis([0 PtNum 0 150])
axis on
grid
hold on
plot(1:PtNum,AllUnitNum,'b-')
xlabel('隐节点变化曲线')
%绘制RSME变化曲线
[xxx,PtNum]=size(AllTestRSME); %此处的PtNum=399
figure
echo off
axis on
grid
hold on
plot(1:PtNum,AllTestRSME,'b-')
xlabel('RSME')
%w2
%b2
%UnitCenters
%SpreadConstant
%% 程序二段
% 隐节点合成
TrainSTD=std(t1);
lr=0.01; % 学习率
maxepoch=49; % 最大训练时间
errcombine=0.8; % 节点合成误差
errgoal=0.60; % 训练目标误差
unitscombinethreshold=0.71; % 节点合成阈值
biascombinethreshold=0.003476; % 偏置合成误差
w2ex=[w2 b2]; % 隐层到输出层的初始权值扩展
errhistory=[];
resizeflag=1; %网络规模发生变化的标识
for epoch=1:maxepoch
if(resizeflag==1),
[OutDim,UnitNum]=size(w2ex);
UnitNum=UnitNum-1;
w2=w2ex(:,1:UnitNum);
b2=w2ex(:,UnitNum+1);
resizeflag=0;
end
% 正向传播计算网络输出
hiddenout=ho(p1,UnitCenters,SpreadConstant); % 每个节点的输出为行向量
hiddenoutex=[hiddenout' ones(TrainSamNum,1)]';
NetOut=w2ex*hiddenoutex;
% 停止学习判断
error=t1-NetOut;
sse=sqrt(sumsqr(error)/TrainSamNum)/TrainSTD ; % sse范围在0,1之间
% 纪录每次权值调整后的训练误差
errhistory=[errhistory sse];
if(sse<errcombine),
% 计算隐节点输出标准差
hiddenvar=var(hiddenout')';
% 计算隐节点输出相关系数
hiddencorr=corrcoef(hiddenout');
% 检查是否有隐节点需要合并
[hiddenunit1,hiddenunit2]=findunittocombine(hiddencorr,...
hiddenvar,unitscombinethreshold,biascombinethreshold);
if(hiddenunit1>0),
if(hiddenunit2>0), % 两个隐节点合并
[a,b]=linearreg(hiddenout(hiddenunit1,:),...
hiddenout(hiddenunit2,:)); % 线性回归,即计算出vj=avi+b中的a和b
epoch
combinetype=11
drawcorrelatedunitsout(hiddenout...
(hiddenunit1,:),hiddenout(hiddenunit2,:));
[UnitCenters,SpreadConstant,w2ex]=combinetwounits(hiddenunit1,...
hiddenunit2,a,b,w2ex,UnitCenters,SpreadConstant); % 当变量需要更新时函数定义中该变量在自变量和返回中均需出现,如UnitCenters和SpreadConstant
else % 隐节点并到偏移
epoch
combinetype=12
drawbiasedunitout(hiddenout(hiddenunit1,:));
unitmean=mean(hiddenout(hiddenunit1,:));
[UnitCenters,SpreadConstant,w2ex]=combineunittobias...
(hiddenunit1,unitmean,w2ex,UnitCenters,SpreadConstant);
end
resizeflag=1;
continue; % 执行到此不再执行循环体下面尚没有执行的部分,重新回到是否执行循环的判断
end
end
if(sse<errgoal),break,end
% 计算反向传播误差
delta2=error.*NetOut.*(1-NetOut);
% 计算权值调节量
hiddenoutex=[hiddenout' ones(TrainSamNum,1)]';
dw2ex=delta2*hiddenoutex';
% 权值调节
w2ex=w2ex+lr*dw2ex;
% 分离w2和b2
[c,d]=size(w2ex);
w2=w2ex(:,1:d-1);
b2=w2ex(:,d);
end
% 绘制学习误差曲线
figure
echo off
axis on
grid
hold on
[xx,num]=size(errhistory);
%semilogy(1:num,errhistory,'r-'); % SEMILOGY(...) is the same as PLOT(...), except a logarithmic (base 10) scale is used for the Y-axis.
plot(1:num,errhistory,'r-');
xlabel('学习误差曲线')
%绘制目标曲线和神经网络输出曲线
TestNNOut=RBFNN(p2,UnitCenters,w2,b2,SpreadConstant);
[xxx,PtNum]=size(t2); %此处的PtNum=201
figure
echo off %turns off echoing.
axis([0 PtNum 0 1])
axis on %turns axis labeling, tick marks and background back on.
%grid
hold on
plot(1:PtNum,t2,'o-')
plot(1:PtNum,TestNNOut,'k.-')
legend('','')
xlabel('目标曲线和HUCRAN神经网络输出曲线')
TestRSME2=sqrt(sumsqr(TestNNOut-t2)/TestSamNum)/TestSTD
%---------------------------------------------------------------------------------------------------------
% 下面是主函数中调用的函数,均以function定义,在主函数中没有function
%程序二段中调用的函数
% 隐层输出
function hiddenout=ho(p1,UnitCenters,SpreadConstant)
[xxx,InNum]=size(p1);
SpreadMat=repmat(SpreadConstant,1,InNum);
AllDist=dist(UnitCenters',p1);
hiddenout=radbas(AllDist./SpreadMat);
% 寻找需要合并的隐节点
function [hiddenunit1,hiddenunit2]=findunittocombine(hiddencorr,hiddenvar,...
unitscombinethreshold,biascombinethreshold)
corrtri=triu(hiddencorr)-eye(size(hiddencorr)); % TRIU Extract upper triangular part
while(1)
[val,pos]=max(abs(corrtri)); % [Y,I] = MAX(X) returns the indices of the maximum values in vector I and the maximum values in Y of X
[maxcorr,hiddenunit2]=max(val); %对于行向量X,[c,d]=max(X),返回c,d分别表示X中最大的数及其对应X的index
if(maxcorr<unitscombinethreshold)
hiddenunit1=0;hiddenunit2=0;
break % 用以退出while循环
end
hiddenunit1=pos(hiddenunit2); % 如果该语句执行则说明maxcorr>unitscombinethreshold,if段没有执行
if(hiddenvar(hiddenunit1)>biascombinethreshold &...
hiddenvar(hiddenunit2)>biascombinethreshold)
break
else
corrtri(hiddenunit1,hiddenunit2)=0;
end
end
if(hiddenunit1>0)return;end % return与break不同,用以退出本函数
[minvar,unit]=min(hiddenvar);
if(minvar<biascombinethreshold)
hiddenunit1=unit;
hiddenunit2=0;
end
% 线性回归
function [a,b]=linearreg(vect1,vect2)
[xxx,n]=size(vect1);
meanv1=mean(vect1);
meanv2=mean(vect2);
a=(vect1*vect2'/n-meanv1*meanv2)/(vect1*vect1'/n-meanv1^2);
b=meanv2-a*meanv1;
% 绘制两相关隐节点对所有样本的输出
function drawcorrelatedunitsout(unitout1,unitout2)
[xxx,ptnum]=size(unitout1);
figure
echo off
axis([0 ptnum 0 1])
axis on
grid
hold on
plot(1:ptnum,unitout1,'b-')
plot(1:ptnum,unitout2,'k-')
% 两个隐节点合并
function [UnitCenters,SpreadConstant,w2ex]=combinetwounits(hiddenunit1,hiddenunit2,a,b,w2ex,UnitCenters,SpreadConstant)
[xxx,biascol]=size(w2ex); % biascol=h1num+1,
w2ex(:,hiddenunit1)=w2ex(:,hiddenunit1)+a*w2ex(:,hiddenunit2); % 节点unit1与下一层节点的连接权矢量
w2ex(:,biascol)=w2ex(:,biascol)+b*w2ex(:,hiddenunit2); % 偏移权矢量更新
UnitCenters(:,hiddenunit2)=[];
SpreadConstant(hiddenunit2,:)=[];
w2ex(:,hiddenunit2)=[]; % 删除隐节点unit2 % unit2与下一层的连接权值矢量
% 绘制标准差较小的单个隐节点输出
function drawbiasedunitout(unitout)
[xxx,ptnum]=size(unitout);
figure('position',[300 300 400 300])
echo off
axis([0 ptnum 0 1])
axis on
grid
hold on
plot(1:ptnum,unitout,'k-')
% 将隐节点合并到偏移
function [UnitCenters,SpreadConstant,w2ex]=combineunittobias(hiddenunit1,unitmean,w2ex,UnitCenters,SpreadConstant)
[xxx,biascol]=size(w2ex);
w2ex(:,biascol)=w2ex(:,biascol)+unitmean*w2ex(:,hiddenunit1);
w2ex(:,hiddenunit1)=[];
UnitCenters(:,hiddenunit1)=[];
SpreadConstant(hiddenunit1,:)=[];
% ----------------------------------------------------------------------------------------
% 程序一段中调用的函数
%网络输出函数
function NetOut=RBFNN(NewInput,UnitCenters,w2,b2,SpreadConstant)
[OutDim,UnitNum]=size(w2);
[xxx,InNum]=size(NewInput);
if(UnitNum==0),
NetOut=repmat(b2,1,InNum);
else
SpreadMat=repmat(SpreadConstant,1,InNum);
AllDist=dist(UnitCenters',NewInput);
al=radbas(AllDist./SpreadMat);
NetOut=w2*al+b2;
end
%增加新的隐节点
function[UnitCenters,w2,SpreadConstant]=AddNewUnit(NewInput,NewErr,NewDist,UnitCenters,w2,SpreadConstant,OverLapCoe)
UnitCenters=[UnitCenters NewInput];
w2=[w2 NewErr];
SpreadConstant=[SpreadConstant;OverLapCoe*NewDist];
%梯度法实现参数精调
function[UnitCenters,w2,b2]=FineTuning(NewInput,NewOutput,UnitCenters,w2,b2,SpreadConstant,tp)
[xxx,UnitNum]=size(UnitCenters);
if(UnitNum==0),b2=NewOutput;return,end
ErrLimit=tp(1); %即tp的第一个值
lr=tp(2);
MaxEpoch=tp(3);
for epoch=1:MaxEpoch
AllDist=dist(UnitCenters',NewInput);
al=radbas(AllDist./SpreadConstant); %radbas(n)=exp(-n^2),隐层输出
NetOut=w2*al+b2;
NewErr=NewOutput-NetOut;
if(norm(NewErr)<ErrLimit),break,end
b2=b2+lr*NewErr;
w2=w2+lr*NewErr*al';
for i=1:UnitNum
CentInc=2*(NewInput-UnitCenters(:,i))*al(i)*NewErr*w2(i)/(SpreadConstant(i)^2);
UnitCenters(:,i)=UnitCenters(:,i)+lr*CentInc;
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -