![]() |
GURLS++
2.0.00
C++ Implementation of GURLS Matlab Toolbox
|
ParamSelLoocvDual is the sub-class of ParamSelection that implements LOO cross-validation with the dual formulation.
#include <loocvdual.h>


Public Member Functions | |
| GurlsOptionsList * | execute (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. | |
Definition at line 71 of file loocvdual.h.
| GurlsOptionsList * gurls::ParamSelLoocvDual< T >::execute | ( | const gMat2D< T > & | X, |
| const gMat2D< T > & | Y, | ||
| const GurlsOptionsList & | opt | ||
| ) | [virtual] |
The leave-one-out approach is used.
| X | input data matrix |
| Y | labels matrix |
| opt | options with the following:
|
Implements gurls::ParamSelection< T >.
Definition at line 94 of file loocvdual.h.
{
// [n,T] = size(y);
const unsigned long n = Y.rows();
const unsigned long t = Y.cols();
const unsigned long d = X.cols();
// tot = opt.nlambda;
int tot = static_cast<int>(std::ceil( opt.getOptAsNumber("nlambda")));
// [Q,L] = eig(opt.kernel.K);
// Q = double(Q);
// L = double(diag(L));
const GurlsOptionsList* kernel = opt.getOptAs<GurlsOptionsList>("kernel");
const gMat2D<T> &K_mat = kernel->getOptValue<OptMatrix<gMat2D<T> > >("K");
gMat2D<T> K(K_mat.rows(), K_mat.cols());
copy(K.getData(), K_mat.getData(), K_mat.getSize());
const unsigned long qrows = K.rows();
const unsigned long qcols = K.cols();
const unsigned long l_length = qrows;
T *Q = K.getData();
T *L = new T[l_length];
eig_sm(Q, L, qrows); // qrows == qcols
int r = n;
if(kernel->getOptAsString("type") == "linear")
{
set(L, (T) 1.0e-12, l_length-d);
r = std::min(n,d);
}
// Qty = Q'*y;
// T* Qty = new T[qrows*qcols];
T* Qty = new T[qcols*t];
dot(Q, Y.getData(), Qty, qrows, qcols, n, t, qcols, t, CblasTrans, CblasNoTrans, CblasColMajor);
T* guesses = lambdaguesses(L, n, r, n, tot, (T)(opt.getOptAsNumber("smallnumber")));
GurlsOptionsList* nestedOpt = new GurlsOptionsList("nested");
gMat2D<T>* pred = new gMat2D<T>(n, t);
OptMatrix<gMat2D<T> >* pred_opt = new OptMatrix<gMat2D<T> >(*pred);
nestedOpt->addOpt("pred", pred_opt);
Performance<T>* perfClass = Performance<T>::factory(opt.getOptAsString("hoperf"));
gMat2D<T>* perf = new gMat2D<T>(tot, t);
T* ap = perf->getData();
T* C_div_Z = new T[qrows];
T* C = new T[qrows*qcols];
T* Z = new T[qrows];
T* work = new T[std::max((qrows+1)*l_length, (qrows*qcols)+l_length)];
for(int i = 0; i < tot; ++i)
{
rls_eigen(Q, L, Qty, C, guesses[i], n, qrows, qcols, l_length, qcols, t, work);
GInverseDiagonal(Q, L, guesses+i, Z, qrows, qcols, l_length, 1, work);
for(unsigned long j = 0; j< t; ++j)
{
rdivide(C + (qrows*j), Z, C_div_Z, qrows);
// opt.pred(:,t) = y(:,t) - (C(:,t)./Z);
copy(pred->getData()+(n*j), Y.getData() + (n*j), n);
axpy(n, (T)-1.0, C_div_Z, 1, pred->getData() + (n*j), 1);
}
// opt.perf = opt.hoperf([],y,opt);
const gMat2D<T> dummy;
GurlsOptionsList* perf_opt = perfClass->execute(dummy, Y, *nestedOpt);
gMat2D<T> &forho_vec = perf_opt->getOptValue<OptMatrix<gMat2D<T> > >("forho");
copy(ap+i, forho_vec.getData(), t, tot, 1);
delete perf_opt;
}
delete nestedOpt;
delete[] work;
delete [] C;
delete [] Z;
delete [] C_div_Z;
delete perfClass;
delete [] Qty;
delete[] L;
//delete[] Q;
unsigned long* idx = new unsigned long[t];
work = NULL;
indicesOfMax(ap, tot, t, idx, work, 1);
gMat2D<T> *LAMBDA = new gMat2D<T>(1, t);
copyLocations(idx, guesses, t, tot, LAMBDA->getData());
delete[] idx;
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("guesses");
paramsel->removeOpt("perf");
paramsel->removeOpt("lambdas");
}
else
paramsel = new GurlsOptionsList("paramsel");
// opt.addOpt("lambdas", LAMBDA);
paramsel->addOpt("lambdas", new OptMatrix<gMat2D<T> >(*LAMBDA));
//vout.perf = ap;
paramsel->addOpt("perf", new OptMatrix<gMat2D<T> >(*perf));
//vout.guesses = guesses;
gMat2D<T> *guesses_mat = new gMat2D<T>(guesses, 1, tot, true);
paramsel->addOpt("guesses", new OptMatrix<gMat2D<T> >(*guesses_mat));
delete[] guesses;
return paramsel;
}
| static ParamSelection<T>* gurls::ParamSelection< T >::factory | ( | const std::string & | id | ) | throw (BadParamSelectionCreation) [inline, static, inherited] |
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);
}