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

📄 whk_j.m

📁 魏海坤编著的《神经网络结构设计的理论与方法》 国防工业出版社出版
💻 M
字号:
function main()
i=0:96;
angle=i.*pi/16.0;
radius=6.5.*(104-i)/104;
XX=-radius.*sin(angle);
YY=radius.*cos(angle);

% 将两个点集数据一个合一个的合并成一个训练样本集
for i=1:97
    X(2.*i-1)=XX(i);
    Y(2.*i-1)=YY(i);
    X(2.*i)=-XX(i);
    Y(2.*i)=-YY(i);
end

figure('Position',[300 300 200 200])
echo off
axis([-7,7,-7,7])
axis on
grid
hold on
plot(XX,YY,'ro')
plot(-XX,-YY,'k+')

% 生成样本输入矩阵P,样本输出矩阵T
P=[X;Y];
for i=1:97
    T(2.*i-1)=1;
    T(2.*i)=-1;
end

TestSamIn=[];
for x=-7:0.1:7
    for y=-7:0.1:7
        TestSamIn=[TestSamIn [x;y]];
    end
end
[xxx,TestSamNum]=size(TestSamIn);

Error0=10;
Patience=0.00001;
lr=0.001;

HiddenUnit=0;
InputOfOutUnit=[P' ones(194,1)]';
WeightOfOutUnit=0.1*rands(1,3);
TargetVector=T;
WeightsOfHiddenUnits=[];
for i=1:20
    [ErrorVector,WeightOfOutUnit]=TrainCCOutputWeight(WeightOfOutUnit,...
                                        InputOfOutUnit,TargetVector,lr,Patience);
    HiddenUnit
    SSE=sumsqr(ErrorVector)
    TrainCCOut=CCNet(P,WeightsOfHiddenUnits,WeightOfOutUnit);
    TrainNNOutSign=sign(TrainCCOut);
    ErrNum=sumsqr((T-TrainNNOutSign)/2);
    
    TestCCOut=CCNet(TestSamIn,WeightsOfHiddenUnits,WeightOfOutUnit);
    DrawReceptiveField(TestSamIn,TestCCOut);
    
    if (ErrNum<1) break;end
    [R,Q]=size(InputOfOutUnit);
    
    C0=0;
    WeightOfNewUnit=[];
    OutputOfNewUnit=[];
    for j=1:8
        WeightOfNewUnitT=0.1*rands(1,R);
        [WeightOfNewUnitT,OutputOfNewUnitT,Correlation]=TrainWeightOfNewUnit...
            (InputOfOutUnit,ErrorVector,WeightOfNewUnitT,lr,Patience);
        if (abs(Correlation)>abs(C0))
            WeightOfNewUnit=WeightOfNewUnitT;
            OutputOfNewUnit=OutputOfNewUnitT;
            C0=Correlation;
        end
    end
    C0
    
    [WeightsOfHiddenUnits]=GenerateNewCCWeights...
                             (WeightsOfHiddenUnits,WeightOfNewUnit);
    HiddenUnit=HiddenUnit+1;
    TestUnitOut=CCNewUnitOut(TestSamIn,WeightsOfHiddenUnits);
    DrawReceptiveField(TestSamIn,TestUnitOut);
    InputOfOutUnit=[InputOfOutUnit' OutputOfNewUnit']';
    WeightOfOutUnit=0.1*rand(1,R+1);
end
TestCCOut=CCNet(TestSamIn,WeightsOfHiddenUnits,WeightOfOutUnit);
DrawReceptiveField(TestSamIn,TestCCOut);

% 用于网络输出权值调整
function [E,W0]=TrainCCOutputWeight(W0,P,T,lr,Patience);
% SSE,网络输出误差
% W0,网络输出节电的输入权值
% P,网络输出节电的输入矩阵
% lr,学习率
% Patience,认为误差不会下降的极限
U=W0*P;
O=tansig(U);
E=T-O;
SSE0=sumsqr(E);
for i=1:5000
    Grad_W=-E.*(1-O.^2)*P';
    W0=W0-lr*Grad_W;
    U=W0*P;
    O=tansig(U);
    E=T-O;
    SSE=sumsqr(E);
    if (abs(SSE-SSE0)<Patience) return;end
    SSE0=SSE;
end

function [W,V,C]=TrainWeightOfNewUnit(P,E,W,lr,Patience)
% 用于网络新隐节电的输入权值调整
% We,网络隐节电的输入权值
% E,输出残差向量
% P,网络隐节电的输入矩阵
% lr,学习率
% Patience,认为误差不会下降的极限
E0=mean(E);
U=W*P;
V=tansig(U);
V0=mean(V);
C0=(V-V0)*(E-E0)';
if (C0>0) delta=1;else delta=-1;end
AbsC0=delta*C0;
for i=1:5000
    Grad_W=delta*(E-E0).*(1-V.^2)*P';
    W=W+lr*Grad_W;
    U=W*P;
    V=tansig(U);
    V0=mean(V);
    C=(V-V0)*(E-E0)';
    if C>0 delta=1;
    else delta=-1;
    end
    AbsC=delta*C;
    if abs(AbsC-AbsC0)<Patience return;end
    AbsC0=AbsC;
end

function [NewWeights]=GenerateNewCCWeights(OldWeights,Weight)
% 用于记忆网络的权值
% OldWeights,添加新网络隐节点前的权值矩阵
% Weight,新权值矢量
[R,Q]=size(OldWeights);
if R==0 NewWeights=Weight;
else
    extra=zeros(R,1);
    NewWeights=[OldWeights,extra];
    NewWeights=[NewWeights' Weight']';
end

function Out=CCNet(In,CCWeights,OutWeight)
% In,CC网络输入
% CCWeights,CC网络的权值矩阵
% Out,CC网络输出
[InDim,InNum]=size(In);
[HiddenUnitNum,xxx]=size(CCWeights);
InOfUnit_i=[In' ones(InNum,1)]';
for i=1:HiddenUnitNum
    Weight_i=CCWeights(i,1:InDim+i);
    UnitActive_i=Weight_i*InOfUnit_i;
    UnitOut_i=tansig(UnitActive_i);
    InOfUnit_i=[InOfUnit_i' UnitOut_i']';
end
OutUnitActive=OutWeight*InOfUnit_i;
Out=tansig(OutUnitActive);

function UnitOut=CCNewUnitOut(In,CCWeights);
[InDim,InNum]=size(In);
[HiddenUnitNum,xxx]=size(CCWeights);
InOfUnit_i=[In' ones(InNum,1)]';
for i=1:HiddenUnitNum
    Weight_i=CCWeights(i,1:InDim+i);
    UnitActive_i=Weight_i*InOfUnit_i;
    UnitOut_i=tansig(UnitActive_i);
    InOfUnit_i=[InOfUnit_i' UnitOut_i']';
end
UnitOut=UnitOut_i;

function DrawReceptiveField(TestSamIn,UnitOut)
figure('Position',[300 300 200 200])
axis([-7,7,-7,7])
axis on
grid
hold on
[xxx,TestSamNum]=size(TestSamIn);
for i=1:TestSamNum
    if (UnitOut(i)<0)  plot(TestSamIn(1,i),TestSamIn(2,i),'k.');
    end
end
        

    

⌨️ 快捷键说明

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