www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@xreggpr/leastsq.m

    function [m,OK] = leastsq( m,X,Y )
%leastsq fit GPM maximum marginal log likelihood function
%    [m,OK] = leastsq( m,xc,Y )
%    xc has already been transformed to [-1,1]
%    Y has already been transformed if a Box-Cox transform is used

%  Copyright 2015-2016 The MathWorks, Inc.


try
    opts = optimoptions('fmincon');
    opts.Display = 'none';
    nObs = size(X,1);
    if nObs>m.LargeScale.Threshold && m.LargeScale.ActiveSetSize<nObs
        % large scale fitting method
        Args = {'ActiveSetSize',min(nObs,m.LargeScale.ActiveSetSize),...
            'FitMethod',m.LargeScale.FitMethod,...
            'PredictMethod',m.LargeScale.PredictMethod,...
            'ActiveSetMethod',m.LargeScale.ActiveSetMethod};
    else
        % default active set method if data size is greater than 2000. This
        % overrides the random selection method.
        Args = {'ActiveSetMethod','Random'};
    end
    
    % find initial hyperparameters
    if nObs<=1000
        % use whole data set
        [Theta0,Sigma0] = classreg.learning.gputils.initialHyperparameters(m.Kernel,m.Basis,X,Y);
    else
        % select up to 1000 points at random to find initial values
        sel = randperm(nObs,1000);
        [Theta0,Sigma0] = classreg.learning.gputils.initialHyperparameters(m.Kernel,m.Basis,X(sel,:),Y(sel));
    end
    
    ws = warning('off','stats:classreg:learning:impl:GPImpl:GPImpl:OptimizerUnableToConverge');
    restoreWarnings = onCleanup(@() warning(ws));
    % call fitrgp 
    m.StatsGPR = fitrgp(X,Y,...
        'KernelFunction',m.Kernel,...
        'BasisFunction',m.Basis,...
        'KernelParameters',Theta0,...
        'Sigma',Sigma0,...
        'Optimizer','fmincon',...
        'OptimizerOptions',opts,...
        Args{:},...
        'PredictorNames',get(m,'symbols'),...
        'ResponseName',varname(m));
    if all(isfinite(m.StatsGPR.KernelInformation.KernelParameters))
        % fitting can result in infinite lengths
        if ~isempty(m.StatsGPR.LogLikelihood)
            % store marginal likelihood if it is available
            m.LogML = m.StatsGPR.LogLikelihood;
        end
        m = var(m,[],m.StatsGPR.Sigma^2,Inf);
        OK = true;
    else
        OK = false;
    end
catch 
    OK = false;
end