📄 whk_j.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 + -