⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ran.m

📁 资源分配神经网络解决Mackey-Glass时间序列预测函数逼近问题
💻 M
字号:
% rbf在线学习实现函数逼近
% 资源分配网络实现动态分配节点
% 2008-6-27

function ran()


TrainSamNum=3000;              %训练样本数
TestSamNum=500;                %测试样本数
InDim=4;                    %输入维数
OutDim=1;                   %输出唯数



a=zeros(1,5586);
a(1)=1.2;
for i=2:17
    a(i)=a(i-1)/1.1;
end

for i=18:5586
    a(i)=(0.2*a(i-17)/(1+(a(i-17))^10)+a(i-1))/1.1;
end

TrainSamIn=zeros(4,3000);
TrainSamOut=zeros(1,3000);
TestSamIn=zeros(4,500);
TestSamOut=zeros(1,500);

m=randperm(TrainSamNum);
TrainSamIn(1,m)=a(m+201-18);
TrainSamIn(2,m)=a(m+201-12);
TrainSamIn(3,m)=a(m+201-6);
TrainSamIn(4,m)=a(m+201);
TrainSamOut(1,m)=a(m+201+85);


for i=5002:5501
TestSamIn(1,i-5001)=a(i-18);
TestSamIn(2,i-5001)=a(i-12);
TestSamIn(3,i-5001)=a(i-6);
TestSamIn(4,i-5001)=a(i);
TestSamOut(1,i-5001)=a(i+85);
end



  

OverLapCoe=0.75;
DistMax=0.6;
DistMin=0.02;
ErrLimit=0.01;
DecayCoe=0.95;
lr=0.01;
MaxEpoch=900;
DistLimit=DistMax;
b2=TrainSamOut(:,1);
w2=[];
UnitCenters=[];
SpreadConstant=[];
UnitNum=0;
AllUnitNum=0;
AllTestRSME=[];

for TrainNum=2:TrainSamNum
    
    NewInput=TrainSamIn(:,TrainNum);
    NewOutput=TrainSamOut(:,TrainNum);
    NetOut=RBFNNN(NewInput,UnitCenters,w2,b2,SpreadConstant);
    
    NewErr=NewOutput-NetOut;
    if UnitNum==0
        NewDist=DistMax;
    else
          AllDist=dist(UnitCenters',NewInput);
          NewDist=min(AllDist);
    end
    
    if norm(NewErr)>=ErrLimit & NewDist>=DistLimit
        UnitCenters=[UnitCenters NewInput];
        w2=[w2 NewErr];
        SpreadConstant=[SpreadConstant;OverLapCoe*NewDist];
        UnitNum=UnitNum+1;
    else
             [xxx,UnitNum]=size(UnitCenters);
            if UnitNum==0
                    b2=NewOutput;
             else
                 for     epoch=1:MaxEpoch
                         AllDist=dist(UnitCenters',NewInput);
                         a1=radbas(AllDist./SpreadConstant);    
                         NewDist=min(AllDist);
                         NetOut=w2*a1+b2;
                         NewErr=NewOutput-NetOut;
   
                       if norm(NewErr)<ErrLimit
                         break
                       end
                        b2=b2+lr*NewErr;
                        w2=w2+lr*NewErr*a1';
                        for i=1:UnitNum
                            DeltaCenter=2*(NewInput-UnitCenters(:,i))*a1(i)*NewErr*w2(i)/(SpreadConstant(i)^2);
                            UnitCenters(:,i)=UnitCenters(:,i)+lr*DeltaCenter;
                        end
                 end
            end
    end


    if DistLimit>DistMin
         DistLimit=DistLimit*DecayCoe;
     else
         DistLimit=DistMin;
    end


     AllUnitNum=[AllUnitNum UnitNum];
     TestNNOut=RBFNNN(TestSamIn,UnitCenters,w2,b2,SpreadConstant);
     TestRSME=sqrt(sumsqr(TestNNOut-TestSamOut)/TestSamNum);
     AllTestRSME=[AllTestRSME TestRSME];
     
    
end


% 预测输出与实际输出比较
figure
TargetInOut=a(5087:5586);
plot(1:500,TargetInOut,'b-',1:500,TestNNOut,'r+')
legend('折线样本输出','神经网络拟合输出')



% 画出隐节点的变化曲线
    [xxx,InputNum]=size(AllUnitNum);
    figure
    plot(1:InputNum,AllUnitNum);
    xlabel('训练样本个数')
    ylabel('隐节点个数')
    title('隐节点随训练次数的增加')
    
%画出 RSME 的变化曲线
   [xxx,InputNum]=size(AllTestRSME);   
   figure
   plot(1:InputNum,AllTestRSME);   
    xlabel('训练样本个数')
    ylabel('RSME  值')  
    title('RSME随训练次数的变化')
    
    

    
    % 建立rbf网,根据数据中心,输出权值,扩展常数计算输出
    function NetOut=RBFNNN(NewInput,UnitCenters,w2,b2,SpreadConstant)
[UnitNum,OutDim]=size(w2);
[xxx,InNum]=size(NewInput);
[xxx1,CenterNum]=size(UnitCenters);
if UnitNum==0
    NetOut=repmat(b2,1,InNum);   %   look again
else
    SpreadMat=repmat(SpreadConstant,1,InNum);
    
    %新增点到各个数据中心的距离
    AllDist=dist(UnitCenters',NewInput);
    a1=radbas(AllDist./SpreadMat);    
    NetOut=w2*a1+b2;
end


















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -