![]() |
GURLS++
2.0.00
C++ Implementation of GURLS Matlab Toolbox
|
ParamSelHoGPRegr is the sub-class of ParamSelection that implements.
#include <hogpregr.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 hogpregr.h.
GurlsOptionsList * gurls::ParamSelHoGPRegr< T >::execute | ( | const gMat2D< T > & | X, |
const gMat2D< T > & | Y, | ||
const GurlsOptionsList & | opt | ||
) | [virtual] |
The hold-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 hogpregr.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"); 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 = indices_mat.getData(); unsigned long *tr = new unsigned long[indices_mat.cols()]; unsigned long *va; 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); T* guesses = new T[tot]; 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; GurlsOptionsList* nestedOpt = new GurlsOptionsList("nested"); nestedOpt->copyOpt("singlelambda", opt); 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); gMat2D<T> subXtr; gMat2D<T> subYtr; gMat2D<T> subXva; gMat2D<T> subYva; gMat2D<T>* subK = new gMat2D<T>(); gMat2D<T>* subPredK = new gMat2D<T>(); gMat2D<T>* subPredKTest = new gMat2D<T>(); tmpKernel->addOpt("K", new OptMatrix<gMat2D<T> > (*subK)); tmpPredKernel->addOpt("K", new OptMatrix<gMat2D<T> > (*subPredK)); tmpPredKernel->addOpt("Ktest", new OptMatrix<gMat2D<T> > (*subPredKTest)); RLSGPRegr<T> rlsgp; PredGPRegr<T> predgp; Performance<T>* perfClass = Performance<T>::factory(opt.getOptAsString("hoperf")); const int nholdouts = static_cast<int>(opt.getOptAsNumber("nholdouts")); const unsigned long indices_cols = indices_mat.cols(); T *perf = new T[tot*t]; gMat2D<T>* lambdas_round_mat = new gMat2D<T>(nholdouts, t); T *lambdas_round = lambdas_round_mat->getData(); gMat2D<T> *perf_mat = new gMat2D<T>(nholdouts, tot*t); gMat2D<T>* guesses_mat = new gMat2D<T>(nholdouts, tot); T *ret_guesses = guesses_mat->getData(); gMat2D<T> * lambda = new gMat2D<T>(1,1); tmpParamSel->addOpt("lambdas", new OptMatrix<gMat2D<T> >(*lambda)); // for nh = 1:opt.nholdouts for(int nh = 0; nh < nholdouts; ++nh) { // if strcmp(class(opt.split),'cell') // tr = opt.split{nh}.tr; // va = opt.split{nh}.va; // else // tr = opt.split.tr; // va = opt.split.va; // end unsigned long last = lasts[nh]; copy(tr, indices+nh, indices_cols, 1, indices_mat.rows()); va = tr+last; const unsigned long va_size = indices_cols-last; // [n,T] = size(y(tr,:)); // here n is last // opt.kernel.K = K(tr,tr); subK->resize(last, last); copy_submatrix(subK->getData(), K.getData(), K.rows(), last, last, tr, tr); // opt.predkernel.K = K(va,tr); subPredK->resize(va_size, last); copy_submatrix(subPredK->getData(), K.getData(), K.rows(), va_size, last, va, tr); // opt.predkernel.Ktest = diag(K(va,va)); T* tmpMat = new T[va_size*va_size]; subPredKTest->resize(va_size, 1); copy_submatrix(tmpMat, K.getData(), K.rows(), va_size, va_size, va, va); copy(subPredKTest->getData(), tmpMat, va_size, 1, va_size+1); delete[] tmpMat; subXtr.resize(last, d); subMatrixFromRows(X.getData(), n, d, tr, last, subXtr.getData()); subYtr.resize(last, t); subMatrixFromRows(Y.getData(), n, t, tr, last, subYtr.getData()); subXva.resize(va_size, d); subMatrixFromRows(X.getData(), n, d, va, va_size, subXva.getData()); subYva.resize(va_size, t); subMatrixFromRows(Y.getData(), n, t, va, va_size, subYva.getData()); // 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); GurlsOptionsList* ret_rlsgp = rlsgp.execute(subXtr, subYtr, *nestedOpt); nestedOpt->removeOpt("optimizer"); nestedOpt->addOpt("optimizer", ret_rlsgp); // tmp = pred_gpregr(X(va,:),y(va,:),opt); GurlsOptionsList * pred_list = predgp.execute(subXva, subYva, *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(va,:),opt); GurlsOptionsList * perf_list = perfClass->execute(subXva, subYva, *nestedOpt); gMat2D<T>& forho = perf_list->getOptValue<OptMatrix<gMat2D<T> > >("forho"); // for t = 1:T // perf(i,t) = opt.perf.forho(t); copy(perf+i, forho.getData(), t, tot, 1); delete perf_list; } // [dummy,idx] = max(perf,[],1); T* work = NULL; unsigned long* idx = new unsigned long[t]; indicesOfMax(perf, 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); delete [] lambdas_nh; // vout.perf{nh} = perf; copy(perf_mat->getData()+nh, perf, tot*t, nholdouts, 1); // vout.guesses{nh} = guesses; copy(ret_guesses+nh, guesses, tot, nholdouts, 1); } delete nestedOpt; delete[] guesses; delete perfClass; delete[] perf; 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("lambdas_round"); paramsel->removeOpt("guesses"); paramsel->removeOpt("perf"); paramsel->removeOpt("lambdas"); } else paramsel = new GurlsOptionsList("paramsel"); paramsel->addOpt("lambdas_round", new OptMatrix<gMat2D<T> >(*lambdas_round_mat)); paramsel->addOpt("perf", new OptMatrix<gMat2D<T> >(*perf_mat)); paramsel->addOpt("guesses", new OptMatrix<gMat2D<T> >(*guesses_mat)); gMat2D<T> *l = new gMat2D<T>(1, t); // if numel(vout.lambdas_round) > 1 if(nholdouts>1) { T *lambdas = new T[t]; // lambdas = cell2mat(vout.lambdas_round'); // vout.lambdas = mean(lambdas); mean(lambdas_round, lambdas, nholdouts, t, t); copy(l->getData(), lambdas, t); delete [] lambdas; } else { // vout.lambdas = vout.lambdas_round{1}; copy(l->getData(), lambdas_round, t); } paramsel->addOpt("lambdas", new OptMatrix<gMat2D<T> >(*l)); 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); }