GURLS++  2.0.00
C++ Implementation of GURLS Matlab Toolbox
gurls::ParamSelHoDualr< T > Class Template Reference

ParamSelHoDualr is the randomized version of ParamSelHoDual.

#include <hodual.h>

Inheritance diagram for gurls::ParamSelHoDualr< T >:
Collaboration diagram for gurls::ParamSelHoDualr< T >:

List of all members.

Public Member Functions

GurlsOptionsListexecute (const gMat2D< T > &X, const gMat2D< T > &Y, const GurlsOptionsList &opt)
 Performs parameter selection when the dual formulation of RLS is used.

Static Public Member Functions

static ParamSelection< T > * factory (const std::string &id) throw (BadParamSelectionCreation)
 Factory function returning a pointer to the newly created object.

Protected Member Functions

virtual void eig_function (T *A, T *L, int A_rows_cols, unsigned long n, const GurlsOptionsList &opt)
 Auxiliary method used to call the right eig/svd function for this class.
virtual unsigned long getRank (unsigned long last, unsigned long n, unsigned long d, bool linearKernel, const GurlsOptionsList &opt)

Detailed Description

template<typename T>
class gurls::ParamSelHoDualr< T >

Definition at line 112 of file hodual.h.


Member Function Documentation

template<typename T >
GurlsOptionsList * gurls::ParamSelHoDual< T >::execute ( const gMat2D< T > &  X,
const gMat2D< T > &  Y,
const GurlsOptionsList opt 
) [virtual, inherited]

The hold-out approach is used. The performance measure specified by opt.hoperf is maximized.

Parameters:
Xinput data matrix
Ylabels matrix
optoptions with the following:
  • nlambda (default)
  • hoperf (default)
  • smallnumber (default)
  • split (settable with the class Split and its subclasses)
  • kernel (settable with the class Kernel and its subclasses)
Returns:
paramsel, a GurlsOptionList with the following fields:
  • lambdas = array of values of the regularization parameter lambda minimizing the validation error for each class
  • guesses = array of guesses for the regularization parameter lambda
  • forho = matrix of validation accuracies for each lambda guess and for each class

Implements gurls::ParamSelection< T >.

Definition at line 156 of file hodual.h.

{
    //    [n,T]  = size(y);
    const unsigned long n = Y.rows();
    const unsigned long t = Y.cols();

    const unsigned long x_rows = X.rows();
    const unsigned long d = X.cols();


    GurlsOptionsList* nestedOpt = new GurlsOptionsList("nested");
    nestedOpt->copyOpt("kernel", opt);

    nestedOpt->addOpt("predkernel", new GurlsOptionsList("predkernel"));


    const GurlsOptionsList* split = opt.getOptAs<GurlsOptionsList>("split");

    const gMat2D< unsigned long > &indices_mat = split->getOptValue<OptMatrix<gMat2D< unsigned long > > >("indices");
    const gMat2D< unsigned long > &lasts_mat = split->getOptValue<OptMatrix<gMat2D< unsigned long > > >("lasts");

    const unsigned long *lasts = lasts_mat.getData();
    const unsigned long* indices_buffer = indices_mat.getData();


    const GurlsOptionsList* kernel = opt.getOptAs<GurlsOptionsList>("kernel");
    const gMat2D<T> &K = kernel->getOptValue<OptMatrix<gMat2D<T> > >("K");
    const bool linearKernel = kernel->getOptAsString("type") == "linear";

    const unsigned long k_rows = K.rows();

    int tot = static_cast<int>(std::ceil( opt.getOptAsNumber("nlambda")));
    int nholdouts = static_cast<int>(std::ceil( opt.getOptAsNumber("nholdouts")));

    gMat2D<T> *LAMBDA = new gMat2D<T>(1, t);
    T* lambdas = LAMBDA->getData();
    set(lambdas, (T)0.0, t);

    gMat2D<T>*  acc_avg_mat = new gMat2D<T>(tot, t);
    T* acc_avg = acc_avg_mat->getData();
    set(acc_avg, (T)0.0, tot*t);

    //     for nh = 1:opt.nholdouts
    GurlsOptionsList* optimizer = new GurlsOptionsList("optimizer");

    Performance<T>* perfClass = Performance<T>::factory(opt.getOptAsString("hoperf"));
    PredDual<T> dual;

    nestedOpt->addOpt("optimizer",optimizer);

    gMat2D<T>* perf_mat = new gMat2D<T>(nholdouts, tot*t);
    T* perf = perf_mat->getData();

    gMat2D<T>*  guesses_mat = new gMat2D<T>(nholdouts, tot);
    T* ret_guesses = guesses_mat->getData();

    gMat2D<T>* lambdas_round_mat = new gMat2D<T>(nholdouts, t);
    T* lambdas_round = lambdas_round_mat->getData();

    for(int nh=0; nh<nholdouts; ++nh)
    {
        unsigned long last = lasts[nh];
        unsigned long* tr = new unsigned long[last];
        unsigned long* va = new unsigned long[n-last];

        //copy int tr indices_ from n*nh to last
        copy<unsigned long>(tr,indices_buffer + n*nh, last);
        //copy int va indices_ from n*nh+last to n*nh+n
        copy<unsigned long>(va,(indices_buffer+ n*nh+last), n-last);


        //Get K(tr,tr) from K
        T* Q = new T[last*last];
        copy_submatrix(Q, K.getData(), k_rows, last, last, tr, tr);

        T *L = new T[last];
        eig_function(Q, L, last, n, opt);

        unsigned long r = getRank(last, n, d, linearKernel, opt);

        if(!linearKernel)
        {
            //  opt.predkernel.K = opt.kernel.K(va,tr);%nva x ntr
            gMat2D<T>* predK = new gMat2D<T>(n-last, last);

            copy_submatrix(predK->getData(), K.getData(), k_rows, n-last, last, va, tr);

            GurlsOptionsList* predkernel = nestedOpt->getOptAs<GurlsOptionsList>("predkernel");

            predkernel->removeOpt("K");
            predkernel->addOpt("K", new OptMatrix<gMat2D<T> >(*predK));
        }

        T* guesses = lambdaguesses(L, last, r, last, tot, (T)(opt.getOptAsNumber("smallnumber")));

        //  ap = zeros(tot,T);
        T* ap = new T[tot*t];

        T* Ytr = new T[last*t];
        subMatrixFromRows(Y.getData(), n, t, tr, last, Ytr);

        //    QtY = Q'*y(tr,:);
        T* Qty = new T[last*t];

        dot(Q, Ytr, Qty, last, last, last, t, last, t, CblasTrans, CblasNoTrans, CblasColMajor);

        delete [] Ytr;

        //    for i = 1:tot
        //  opt.rls.X = X(tr,:);

        gMat2D<T>* rlsX = new gMat2D<T>(last, d);
        subMatrixFromRows(X.getData(), x_rows, d, tr, last, rlsX->getData());

        delete [] tr;

        optimizer->removeOpt("X");
        optimizer->addOpt("X", new OptMatrix<gMat2D<T> >(*rlsX));


        gMat2D<T>* xx = new gMat2D<T>(n-last, d);
        subMatrixFromRows(X.getData(), x_rows, d, va, n-last, xx->getData());

        gMat2D<T>* yy = new gMat2D<T>(n-last, t);
        subMatrixFromRows(Y.getData(), n, t, va, n-last, yy->getData());

        delete [] va;

        gMat2D<T>* C = new gMat2D<T>(last, t);
        optimizer->removeOpt("C");
        optimizer->addOpt("C", new OptMatrix<gMat2D<T> >(*C));


        gMat2D<T>* W = NULL;

        if(linearKernel)
        {
            W = new gMat2D<T>(d, t);

            optimizer->removeOpt("W");
            optimizer->addOpt("W", new OptMatrix<gMat2D<T> >(*W));
        }

        T* work = new T[last*(last+1)];

        for(int i=0; i<tot; ++i)
        {
            //  opt.rls.C = rls_eigen(Q,L,QtY,guesses(i),ntr);
            rls_eigen(Q, L, Qty, C->getData(), guesses[i], last, last, last, last, last, t, work);

            if(linearKernel)
            {
//                opt.rls.W = X(tr,:)'*opt.rls.C; % dxT = (ntrxd)'*ntrxT   last*d last*last
                dot(rlsX->getData(), C->getData(), W->getData(), last, d, last, t, d, t, CblasTrans, CblasNoTrans, CblasColMajor);
            }
//            else
//            opt.predkernel.K = opt.kernel.K(va,tr);%nva x ntr
//            (see above)


            OptMatrix<gMat2D<T> >* ret_pred = dual.execute(*xx, *yy, *nestedOpt);

            nestedOpt->addOpt("pred", ret_pred);

            //  opt.perf = opt.hoperf(Xva,yva,opt);
            GurlsOptionsList* ret_perf = perfClass->execute(*xx, *yy, *nestedOpt);

            gMat2D<T> &forho_vec = ret_perf->getOptValue<OptMatrix<gMat2D<T> > >("forho");

            //       for t = 1:T
            //          ap(i,t) = opt.perf.forho(t);
            copy(ap+i, forho_vec.getData(), t, tot, 1);

            nestedOpt->removeOpt("pred");

            delete ret_perf;

        }//for tot

        delete [] Q;
        delete [] Qty;
        delete [] L;
        delete [] work;

        delete xx;
        delete yy;

        //[dummy,idx] = max(ap,[],1);
        work = NULL;
        unsigned long* idx = new unsigned long[t];
        indicesOfMax(ap, tot, t, idx, work, 1);


        //vout.lambdas_round{nh} = guesses(idx);
        T* lambdas_nh = new T[t];
        copyLocations(idx, guesses, t, tot, lambdas_nh);

        copy(lambdas_round +nh, lambdas_nh, t, nholdouts, 1);

        //add lambdas_nh to lambdas
        axpy< T >(t, (T)1, lambdas_nh, 1, lambdas, 1);

        delete [] lambdas_nh;
        delete [] idx;

        //  vout.perf{nh} = ap;
        copy(perf + nh, ap, tot*t, nholdouts, 1);

        axpy(tot*t, (T)1, ap, 1, acc_avg, 1);

        //  vout.guesses{nh} = guesses;
        copy(ret_guesses + nh, guesses, tot, nholdouts, 1);

        delete [] guesses;
        delete [] ap;
    }//for nholdouts

    delete nestedOpt;
    delete perfClass;


    GurlsOptionsList* paramsel;

    if(opt.hasOpt("paramsel"))
    {
        GurlsOptionsList* tmp_opt = new GurlsOptionsList("tmp");
        tmp_opt->copyOpt("paramsel", opt);

        paramsel = GurlsOptionsList::dynacast(tmp_opt->getOpt("paramsel"));
        tmp_opt->removeOpt("paramsel", false);
        delete tmp_opt;

        paramsel->removeOpt("perf");
        paramsel->removeOpt("guesses");
        paramsel->removeOpt("acc_avg");
        paramsel->removeOpt("lambdas");
        paramsel->removeOpt("lambdas_round");
    }
    else
        paramsel = new GurlsOptionsList("paramsel");



    paramsel->addOpt("perf", new OptMatrix<gMat2D<T> >(*perf_mat));
    paramsel->addOpt("guesses", new OptMatrix<gMat2D<T> >(*guesses_mat));

    //     if numel(vout.lambdas_round) > 1
    //  lambdas = cell2mat(vout.lambdas_round');
    //  vout.lambdas = mean(lambdas);
    //     else
    //  vout.lambdas = vout.lambdas_round{1};
    //     end
    if(nholdouts>1)
    {
        scal(t, (T)1.0/nholdouts, lambdas, 1);
        scal(t, (T)1.0/nholdouts, acc_avg, 1);
    }

    paramsel->addOpt("acc_avg", new OptMatrix<gMat2D<T> >(*acc_avg_mat));


    paramsel->addOpt("lambdas", new OptMatrix<gMat2D<T> >(*LAMBDA));
    paramsel->addOpt("lambdas_round", new OptMatrix<gMat2D<T> >(*lambdas_round_mat));

    return paramsel;
}
template<typename T>
static ParamSelection<T>* gurls::ParamSelection< T >::factory ( const std::string &  id) throw (BadParamSelectionCreation) [inline, static, inherited]
Warning:
The returned pointer is a plain, un-managed pointer. The calling function is responsible of deallocating the object.

Definition at line 146 of file paramsel.h.

    {
        if(id == "loocvprimal")
            return new ParamSelLoocvPrimal<T>;
        if(id == "loocvdual")
            return new ParamSelLoocvDual<T>;
        if(id == "fixlambda")
            return new ParamSelFixLambda<T>;
        if(id == "calibratesgd")
            return new ParamSelCalibrateSGD<T>;
        if(id == "siglam")
            return new ParamSelSiglam<T>;
        if(id == "siglamho")
            return new ParamSelSiglamHo<T>;
        if(id == "hodual")
            return new ParamSelHoDual<T>;
        if(id == "hodualr")
            return new ParamSelHoDualr<T>;
        if(id == "hoprimal")
            return new ParamSelHoPrimal<T>;
        if(id == "hoprimalr")
            return new ParamSelHoPrimalr<T>;
        if(id == "fixsiglam")
            return new ParamSelFixSigLam<T>;
        if(id == "loogpregr")
            return new ParamSelLooGPRegr<T>;
        if(id == "hogpregr")
            return new ParamSelHoGPRegr<T>;
        if(id == "siglamloogpregr")
            return new ParamSelSiglamLooGPRegr<T>;
        if(id == "siglamhogpregr")
            return new ParamSelSiglamHoGPRegr<T>;

        throw BadParamSelectionCreation(id);
    }

The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends