📄 learnxyf.m
字号:
function [NewXMap,NewYMap,WeightEvolution] = LearnXYF(Xtr,Ytr,XMap,YMap,MLKP);
if (MLKP.MaxIter<1)
NewXMap=XMap;
NewYMap=YMap;
WeightEvolution=0;
return
end
OldRadiusX=floor(realmax);
OldRadiusY=floor(realmax);
[Nobjects,NvarX] = size(Xtr);
[NvarY,Dummy]=size(YMap);
WeightValues = DetermineWeights(Ytr,MLKP);
[Alpha] = DetermineAlphaValues(MLKP);
Accept=0;
for iter=1:MLKP.MaxIter
% create neighbourhood and weights
[AlphaX,AlphaY,RadiusX,RadiusY,DecayFract] = AdaptLearnParams(iter,MLKP);
if (RadiusX < OldRadiusX)
[ActUnitsX, WeightsX] = MakeWinnerTable(RadiusX,MLKP);
OldRadiusX=RadiusX;
end
if (RadiusY < OldRadiusY)
[ActUnitsY, WeightsY] = MakeWinnerTable(RadiusY,MLKP);
OldRadiusY=RadiusY;
end
if (upper(MLKP.WeightDecay) == 'Y' | upper(MLKP.AddNoise) == 'Y')
[XMap] = WeightDecayAddNoise(XMap, DecayFract, MLKP);
[YMap] = WeightDecayAddNoise(YMap, DecayFract, MLKP);
end
if (upper(MLKP.FastUpdate) == 'Y' & RadiusX == MLKP.FastUpdateSize...
& RadiusY == MLKP.FastUpdateSize)
[NewXMap,NewYMap] = FastUpdateMapXY(Xtr,XMap,Ytr,YMap,MLKP,iter);
return;
end
% learn an epoch
OldXMap=XMap;
OldYMap=YMap;
perm=randperm(Nobjects);
for iobj=1:Nobjects
X=Xtr(perm(iobj),:);
Y=Ytr(perm(iobj),:);
[Value, Winner] = DetermineSimultaneousWinner(X,XMap,Y,YMap,MLKP,Alpha(iter));
if (Boltzmann(Value,iter,MLKP) == 'Y')
Accept=Accept+1;
AF = WeightValues(perm(iobj))*Value;
[NewXMap] = AdaptMap(X,XMap,Winner,AlphaX*AF,ActUnitsX,WeightsX);
[NewYMap] = AdaptMap(Y,YMap,Winner,AlphaY*AF,ActUnitsY,WeightsY);
XMap=NewXMap;
YMap=NewYMap;
end
end
WeightEvolution(1,iter) = sum(sum(abs(XMap-OldXMap)))/AlphaX;
WeightEvolution(2,iter) = sum(sum(abs(YMap-OldYMap)))/AlphaY;
if (iter > 1 & CheckConvergence(OldXMap, XMap, MLKP) == 'Y')
return;
end
end
if (upper(MLKP.BoltzmannMode) == 'THR' | upper(MLKP.BoltzmannMode) == 'EXP')
Message=sprintf('XYF: %d updates out of %d trials accepted by Boltzmann algorithm',...
Accept, MLKP.MaxIter*Nobjects);
disp(Message);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -