![]() |
GURLS++
2.0.00
C++ Implementation of GURLS Matlab Toolbox
|
ParamSelLoocvPrimal is the sub-class of ParamSelection that implements LOO cross-validation with the primal formulation.
#include <loocvprimal.h>
Public Member Functions | |
GurlsOptionsList * | execute (const gMat2D< T > &X, const gMat2D< T > &Y, const GurlsOptionsList &opt) |
Performs parameter selection when the primal 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 76 of file loocvprimal.h.
GurlsOptionsList * gurls::ParamSelLoocvPrimal< 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 default fields:
|
Implements gurls::ParamSelection< T >.
Definition at line 97 of file loocvprimal.h.
{ typename std::set<T*> garbage; try { //[n,T] = size(y); const unsigned long n = Y.rows(); const unsigned long t = Y.cols(); // K = X'*X; const unsigned long xc = X.cols(); const unsigned long xr = X.rows(); if(xr != n) throw gException(Exception_Inconsistent_Size); T* K = new T[xc*xc]; garbage.insert(K); dot(X.getData(), X.getData(), K, xr, xc, xr, xc, xc, xc, CblasTrans, CblasNoTrans, CblasColMajor); // tot = opt.nlambda; int tot = static_cast<int>(std::ceil( opt.getOptAsNumber("nlambda"))); // [Q,L] = eig(K); // L = diag(L); // T* Q, *L; // eig(K, Q, L, xc, xc); // garbage.insert(Q); // garbage.insert(L); T* Q = K; T* L = new T[xc]; garbage.insert(L); eig_sm(Q, L, xc); T* filtered = L; T* guesses = lambdaguesses(filtered, xc, std::min(xc,xr), xr, tot, (T)(opt.getOptAsNumber("smallnumber"))); garbage.insert(guesses); // set(guesses, 0.f, tot); T* LOOSQE = new T[tot*t]; garbage.insert(LOOSQE); set(LOOSQE, (T)0.0, tot*t); // LEFT = X*Q; // RIGHT = Q'*X'*y; T* LEFT = new T[xr*xc]; garbage.insert(LEFT); dot(X.getData(), Q, LEFT, xr, xc, xc, xc, xr, xc, CblasNoTrans, CblasNoTrans, CblasColMajor); T* tmp = new T[xc*t]; garbage.insert(tmp); dot(X.getData(), Y.getData(), tmp, xr, xc, n, t, xc, t, CblasTrans, CblasNoTrans, CblasColMajor); T* RIGHT = new T[xc*t]; garbage.insert(RIGHT); dot(Q, tmp, RIGHT, xc, xc, xc, t, xc, t, CblasTrans, CblasNoTrans, CblasColMajor); delete[] tmp; garbage.erase(tmp); // right = Q'*X'; T* right = new T[xc*xr]; garbage.insert(right); dot(Q, X.getData(), right, xc, xc, xr, xc, xc, xr, CblasTrans, CblasTrans, CblasColMajor); delete[] Q; garbage.erase(Q); T* den = new T[n]; // T* Le = new T[n*t]; garbage.insert(den); // garbage.insert(Le); T* tmpvec = new T[xc]; garbage.insert(tmpvec); T* tmp1 = new T[xr*t]; garbage.insert(tmp1); T* LL = new T[xc*xc]; garbage.insert(LL); tmp = new T[xc*t]; garbage.insert(tmp); T* num = new T[xr*t]; garbage.insert(num); T* row = new T[xc]; garbage.insert(row); T* num_div_den = new T[n]; garbage.insert(num_div_den); 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); // const int pred_size = pred->getSize(); Performance<T>* perfClass = Performance<T>::factory(opt.getOptAsString("hoperf")); gMat2D<T>* perf = new gMat2D<T>(tot, t); T* ap = perf->getData(); // for i = 1:tot for(int s = 0; s < tot; ++s) { // LL = L + (n*guesses(i)); set(tmpvec, n*guesses[s] , xc); axpy(xc, (T)1.0, L, 1, tmpvec, 1); // LL = LL.^(-1) setReciprocal(tmpvec, xc); // LL = diag(LL); diag(tmpvec, xc, LL); // num = y - LEFT*LL*RIGHT; dot(LL, RIGHT, tmp, xc, xc, xc, t, xc, t, CblasNoTrans, CblasNoTrans, CblasColMajor); dot(LEFT, tmp, tmp1, xr, xc, xc, t, xr, t, CblasNoTrans, CblasNoTrans, CblasColMajor); copy(num, Y.getData(), xr*t); axpy(xr*t, (T)-1.0, tmp1, 1, num, 1); // den = zeros(n,1); set(den, (T)0.0, n); // for j = 1:n // den(j) = 1-LEFT(j,:)*LL*right(:,j); // end for (unsigned long j = 0; j < n; ++j) { dot(LL, right +(xc*j), tmp, xc, xc, xc, 1, xc, 1, CblasNoTrans, CblasNoTrans, CblasColMajor); //extract j-th row from LEFT copy(row, LEFT + j, xc, 1, xr); den[j] = ((T) 1.0) - dot (xc, row, 1, tmp, 1); } // opt.pred = zeros(n,T); // set(pred->getData(), (T)0.0, pred_size); // for t = 1:T for(unsigned long j = 0; j< t; ++j) { rdivide(num + (n*j), den, num_div_den, n); // opt.pred(:,t) = y(:,t) - (num(:,t)./den); copy(pred->getData()+(n*j), Y.getData() + (n*j), n); axpy(n, (T)-1.0, num_div_den, 1, pred->getData()+(n*j), 1); } // opt.perf = opt.hoperf([],y,opt); const gMat2D<T> dummy; GurlsOptionsList* perf = perfClass->execute(dummy, Y, *nestedOpt); gMat2D<T> &forho_vec = perf->getOptValue<OptMatrix<gMat2D<T> > >("forho"); // for t = 1:T copy(ap+s, forho_vec.getData(), forho_vec.getSize(), tot, 1); delete perf; } delete perfClass; delete[] row; garbage.erase(row); delete[] num; garbage.erase(num); delete[] tmp; garbage.erase(tmp); delete[] tmp1; garbage.erase(tmp1); delete[] tmpvec; garbage.erase(tmpvec); delete[] LL; garbage.erase(LL); delete [] num_div_den; garbage.erase(num_div_den); delete nestedOpt; delete[] L; garbage.erase(L); delete[] LEFT; garbage.erase(LEFT); delete[] RIGHT; garbage.erase(RIGHT); delete[] right; garbage.erase(right); delete[] den; garbage.erase(den); delete [] LOOSQE; garbage.erase(LOOSQE); // delete[] Le; // garbage.erase(Le); //[dummy,idx] = max(ap,[],1); unsigned long* idx = new unsigned long[t]; T* work = NULL; indicesOfMax(ap, tot, t, idx, work, 1); //vout.lambdas = guesses(idx); 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"); paramsel->addOpt("lambdas", new OptMatrix<gMat2D<T> >(*LAMBDA)); 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; } catch( gException& e) { for(typename std::set<T*>::iterator it = garbage.begin(); it != garbage.end(); ++it) delete[] (*it); throw e; } }
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); }