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

📄 learnxyf.m

📁 有监督自组织映射-偏最小二乘算法(A supervised self-organising map–partial least squares algorithm),可以用语多变量数据的回归分析
💻 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 + -