![]() |
GURLS++
2.0.00
C++ Implementation of GURLS Matlab Toolbox
|
ParamSelLooGPRegr is the sub-class of ParamSelection that implements.
#include <loogpregr.h>


Public Member Functions | |
| GurlsOptionsList * | execute (const gMat2D< T > &X, const gMat2D< T > &Y, const GurlsOptionsList &opt) |
| Performs parameter selection for Gaussian Process regression. | |
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 68 of file loogpregr.h.
| GurlsOptionsList * gurls::ParamSelLooGPRegr< 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 91 of file loogpregr.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>(opt.getOptAsNumber("nlambda"));
// K = opt.kernel.K;
const gMat2D<T> &K = opt.getOptValue<OptMatrix<gMat2D<T> > >("kernel.K");
// lmax = mean(std(y));
// T* work = new T[t+n];
// T* stdY = new T[t];
// stdDev(Y.getData(), n, t, stdY, work);
// const T lmax = sumv(stdY, t)/((T)t);
// delete[] work;
// delete[] stdY;
// const T lmin = lmax * (T)1.0e-5;
T lmin;
T lmax;
if(opt.hasOpt("lambdamin"))
lmin = opt.getOptAsNumber("lambdamin");
else
lmin = 0.001;
if(opt.hasOpt("lambdamax"))
lmax = opt.getOptAsNumber("lambdamax");
else
lmax = 10;
// guesses = lmin.*(lmax/lmin).^linspace(0,1,tot);
gMat2D<T> *guesses_mat = new gMat2D<T>(tot, 1);
T* guesses = guesses_mat->getData();
T* linspc = new T[tot];
linspace((T)0.0, (T)1.0, tot, linspc);
const T coeff = lmax/lmin;
for(int i=0; i< tot; ++i)
guesses[i] = lmin* std::pow(coeff, linspc[i]);
delete[] linspc;
// perf = zeros(tot,T);
gMat2D<T> *perf_mat = new gMat2D<T>(tot, t);
T* perf = perf_mat->getData();
set(perf, (T)0.0, tot*t);
const int tr_size = n-1;
unsigned long* tr = new unsigned long[tr_size+1]; // + 1 cell for convenience
unsigned long* tr_it = tr;
for(unsigned long i=1; i< n; ++i, ++tr_it)
*tr_it = i;
GurlsOptionsList* nestedOpt = new GurlsOptionsList("nested");
nestedOpt->copyOpt("singlelambda", opt);
gMat2D<T>* tmpK = new gMat2D<T>(tr_size, tr_size);
gMat2D<T>* tmpPredK = new gMat2D<T>(1, tr_size);
gMat2D<T>* tmpPredKTest = new gMat2D<T>(1, 1);
GurlsOptionsList* tmpPredKernel = new GurlsOptionsList("predkernel");
GurlsOptionsList* tmpKernel = new GurlsOptionsList("kernel");
GurlsOptionsList* tmpParamSel = new GurlsOptionsList("paramsel");
nestedOpt->addOpt("kernel", tmpKernel);
nestedOpt->addOpt("predkernel", tmpPredKernel);
nestedOpt->addOpt("paramsel", tmpParamSel);
tmpKernel->addOpt("K", new OptMatrix<gMat2D<T> > (*tmpK));
tmpPredKernel->addOpt("K", new OptMatrix<gMat2D<T> > (*tmpPredK));
tmpPredKernel->addOpt("Ktest", new OptMatrix<gMat2D<T> > (*tmpPredKTest));
gMat2D<T> rlsX(tr_size, d);
gMat2D<T> rlsY(tr_size, t);
// T* tmpMat = new T[ tr_size * std::max(d, t)];
gMat2D<T> predX(1, d);
gMat2D<T> predY(1, t);
RLSGPRegr<T> rlsgp;
PredGPRegr<T> predgp;
Performance<T>* perfClass = Performance<T>::factory(opt.getOptAsString("hoperf"));
gMat2D<T> *lambda = new gMat2D<T>(1,1);
tmpParamSel->addOpt("lambdas", new OptMatrix<gMat2D<T> >(*lambda));
// for k = 1:n;
for(unsigned long k = 0; k<n; ++k)
{
// tr = setdiff(1:n,k);
// opt.kernel.K = K(tr,tr);
copy_submatrix(tmpK->getData(), K.getData(), K.rows(), tr_size, tr_size, tr, tr);
// opt.predkernel.K = K(k,tr);
copy_submatrix(tmpPredK->getData(), K.getData(), K.rows(), 1, tr_size, &k , tr);
// opt.predkernel.Ktest = K(k,k);
tmpPredKTest->getData()[0] = K.getData()[(k*K.rows()) + k];
// for i = 1:tot
for(int i=0; i< tot; ++i)
{
// opt.paramsel.noises = guesses(i);
lambda->getData()[0] = guesses[i];
// opt.rls = rls_gpregr(X(tr,:),y(tr,:),opt);
subMatrixFromRows(X.getData(), n, d, tr, tr_size, rlsX.getData());
subMatrixFromRows(Y.getData(), n, t, tr, tr_size, rlsY.getData());
GurlsOptionsList* ret_rlsgp = rlsgp.execute(rlsX, rlsY, *nestedOpt);
nestedOpt->removeOpt("optimizer");
nestedOpt->addOpt("optimizer", ret_rlsgp);
// tmp = pred_gpregr(X(k,:),y(k,:),opt);
getRow(X.getData(), n, d, k, predX.getData());
getRow(Y.getData(), n, t, k, predY.getData());
GurlsOptionsList * pred_list = predgp.execute(predX, predY, *nestedOpt);
// opt.pred = tmp.means;
nestedOpt->removeOpt("pred");
nestedOpt->addOpt("pred", pred_list->getOpt("means"));
pred_list->removeOpt("means", false);
delete pred_list;
// opt.perf = opt.hoperf([],y(k,:),opt);
GurlsOptionsList * perf_list = perfClass->execute(predX, predY, *nestedOpt);
gMat2D<T>& forho = perf_list->getOptValue<OptMatrix<gMat2D<T> > >("forho");
// for t = 1:T
for(unsigned long j = 0; j<t; ++j)
// perf(i,t) = opt.perf.forho(t)+perf(i,t)./n;
// perf(i,t) = opt.perf.forho(t)./n+perf(i,t);
perf[i+(tot*j)] += forho.getData()[j]/n;
//perf[i+(tot*j)] = forho.getData()[j]/n+perf[i+(tot*j)];
delete perf_list;
}
tr[k] = k;
}
delete perfClass;
delete nestedOpt;
GurlsOptionsList* paramsel;
if(opt.hasOpt("paramsel"))
{
GurlsOptionsList* tmp_opt = new GurlsOptionsList("tmp");
tmp_opt->copyOpt("paramsel", opt);
paramsel = tmp_opt->getOptAs<GurlsOptionsList>("paramsel");
tmp_opt->removeOpt("paramsel", false);
delete tmp_opt;
paramsel->removeOpt("lambdas");
paramsel->removeOpt("perf");
paramsel->removeOpt("guesses");
}
else
paramsel = new GurlsOptionsList("paramsel");
// [dummy,idx] = max(perf,[],1);
unsigned long* idx = new unsigned long[t];
T* work = NULL;
indicesOfMax(perf, tot, t, idx, work, 1);
// vout.noises = guesses(idx);
gMat2D<T> *lambdas = new gMat2D<T>(1, t);
copyLocations(idx, guesses, t, tot, lambdas->getData());
delete[] idx;
paramsel->addOpt("lambdas", new OptMatrix<gMat2D<T> >(*lambdas));
// vout.perf = perf;
paramsel->addOpt("perf", new OptMatrix<gMat2D<T> >(*perf_mat));
// vout.guesses = guesses;
paramsel->addOpt("guesses", new OptMatrix<gMat2D<T> >(*guesses_mat));
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);
}