![]() |
GURLS++
2.0.00
C++ Implementation of GURLS Matlab Toolbox
|
RecursiveRLSWrapper is the sub-class of GurlsWrapper that implements recursive update of the RLS estimator with retraining capability. More...
#include <recrlswrapper.h>


Public Types | |
| enum | ProblemType { CLASSIFICATION, REGRESSION } |
Public Member Functions | |
| virtual T | eval (const gVec< T > &X, unsigned long *index=NULL) |
| Estimates label for a new input point. | |
| gMat2D< T > * | eval (const gMat2D< T > &X) |
| Estimates label for an input matrix. | |
| virtual const GurlsOptionsList & | getOpt () const |
| Returns a const reference to the options structure. | |
| virtual void | loadModel (const std::string &fileName) |
| Loads a computed model from a file. | |
| RecursiveRLSWrapper (const std::string &name) | |
| Constructor. | |
| void | retrain () |
| Selection of the new regularization parameter. | |
| virtual void | saveModel (const std::string &fileName) |
| Saves the computed model to file. | |
| virtual void | setNparams (unsigned long value) |
| virtual void | setParam (double value) |
| virtual void | setProblemType (ProblemType value) |
| virtual void | setSplitProportion (double value) |
| void | train (const gMat2D< T > &X, const gMat2D< T > &y) |
| Initial parameter selection and training. | |
| void | update (const gVec< T > &X, const gVec< T > &y) |
| Estimator update. | |
Protected Member Functions | |
| virtual bool | trainedModel () |
| Checks if model has already been trained. | |
Protected Attributes | |
| std::string | name |
| Name of the options structure. | |
| unsigned long | nTot |
| Total number of samples used for training. | |
| GurlsOptionsList * | opt |
| Options structure where information about initial training is stored. | |
| ProblemType | probType |
| Problem type. | |
Initial parameter selection and training are carried out on a initial set of samples via method train() which stores all information necessary for efficient recursive update in the options structure. Once the information about initial training is stored, given a new input-output pair, the RLS estimator can be efficiently updated via the method update(). Every time a new input-output pair is available, method update() can be invoked again. Parameter selection and RLS estimation ( method retrain()) can be repeated after any number of online updates. Finally, the eval() method estimates the output for new data.
Definition at line 63 of file recrlswrapper.h.
| gurls::RecursiveRLSWrapper< T >::RecursiveRLSWrapper | ( | const std::string & | name | ) |
| name | Name of the option's structure that will be initialized |
Definition at line 9 of file recrlswrapper.hpp.
| T gurls::GurlsWrapper< T >::eval | ( | const gVec< T > & | X, |
| unsigned long * | index = NULL |
||
| ) | [virtual, inherited] |
| [in] | X | Input point |
| [out] | index | Index of the estimated label |
Definition at line 26 of file wrapper.hpp.
{
if(!trainedModel())
throw gException("Error, Train Model First");
gMat2D<T>X_mat(1, X.getSize());
copy(X_mat.getData(), X.getData(), X.getSize());
gMat2D<T>* pred_mat = eval(X_mat);
const T* pred = pred_mat->getData();
const unsigned long size = pred_mat->getSize();
const T* max = std::max_element(pred, pred+size);
T ret = *max;
if(index != NULL)
*index = max-pred;
delete pred_mat;
return ret;
}
| gMat2D< T > * gurls::RecursiveRLSWrapper< T >::eval | ( | const gMat2D< T > & | X | ) | [virtual] |
| [in] | X | Input matrix |
Implements gurls::GurlsWrapper< T >.
Definition at line 156 of file recrlswrapper.hpp.
{
if(!this->trainedModel())
throw gException("Error, Train Model First");
gurls::PredPrimal<T> predTask;
gMat2D<T> y;
OptMatrix<gMat2D<T> >* result = predTask.execute(X, y, *(this->opt));
gMat2D<T>& pred_mat = result->getValue();
result->detachValue();
delete result;
return &pred_mat;
}
| void gurls::GurlsWrapper< T >::loadModel | ( | const std::string & | fileName | ) | [virtual, inherited] |
| fileName | name of the file containing the data to load |
Definition at line 61 of file wrapper.hpp.
| void gurls::RecursiveRLSWrapper< T >::retrain | ( | ) |
Selection is performed via hold-out validation using the subset Xva,yva of the total training set as validation set.
Definition at line 174 of file recrlswrapper.hpp.
{
GurlsOptionsList* kernel = this->opt->template getOptAs<GurlsOptionsList>("kernel");
const gMat2D<T> &Xva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("Xva");
const gMat2D<T> &yva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("yva");
const unsigned long nva = Xva.rows();
this->opt->removeOpt("paramsel");
this->opt->removeOpt("optimizer");
GurlsOptionsList* split = this->opt->template getOptAs<GurlsOptionsList>("split");
split->removeOpt("indices");
split->removeOpt("lasts");
gMat2D<unsigned long>* indices = new gMat2D<unsigned long>(1, nTot);
gMat2D<unsigned long>* lasts = new gMat2D<unsigned long>(1, 1);
set(indices->getData(), 0ul, nTot-nva);
unsigned long * it = indices->getData() + (nTot-nva);
for(unsigned long i=0; i<nva; ++i, ++it)
*it = i;
lasts->getData()[0] = (nTot-nva);
split->addOpt("indices", new OptMatrix<gMat2D<unsigned long> >(*indices));
split->addOpt("lasts", new OptMatrix<gMat2D<unsigned long> >(*lasts));
ParamSelHoPrimal<T> paramselTask;
this->opt->addOpt("paramsel", paramselTask.execute(Xva, yva, *(this->opt)));
RLSPrimalRecInit<T> optimizerTask;
gMat2D<T> emptyMat;
this->opt->addOpt("nTot", new OptNumber(nTot));
this->opt->addOpt("optimizer", optimizerTask.execute(emptyMat, emptyMat, *(this->opt)));
this->opt->removeOpt("nTot");
}
| void gurls::GurlsWrapper< T >::saveModel | ( | const std::string & | fileName | ) | [virtual, inherited] |
| fileName | name of the file where data will be saved |
Definition at line 55 of file wrapper.hpp.
| void gurls::GurlsWrapper< T >::setNparams | ( | unsigned long | value | ) | [virtual, inherited] |
| [in] | value |
Definition at line 67 of file wrapper.hpp.
| void gurls::GurlsWrapper< T >::setParam | ( | double | value | ) | [virtual, inherited] |
| [in] | value |
Reimplemented in gurls::NystromWrapper< T >.
Definition at line 79 of file wrapper.hpp.
{
if(!opt->hasOpt("paramsel"))
opt->addOpt("paramsel", new GurlsOptionsList("paramsel"));
if(opt->hasOpt("paramsel.lambdas"))
opt->getOptValue<OptMatrix<gMat2D<T> > >("paramsel.lambdas").getData()[0] = (T)value;
else
{
gMat2D<T> * lambdas = new gMat2D<T>(1,1);
lambdas->getData()[0] = (T)value;
opt->getOptAs<GurlsOptionsList>("paramsel")->addOpt("lambdas", new OptMatrix<gMat2D<T> >(*lambdas));
}
setNparams(1);
}
| void gurls::GurlsWrapper< T >::setProblemType | ( | typename GurlsWrapper< T >::ProblemType | value | ) | [virtual, inherited] |
| [in] | value |
Definition at line 103 of file wrapper.hpp.
{
probType = value;
opt->getOptValue<OptString>("hoperf") = (value == CLASSIFICATION)? "macroavg": "rmse";
}
| void gurls::GurlsWrapper< T >::setSplitProportion | ( | double | value | ) | [virtual, inherited] |
| [in] | value |
Definition at line 97 of file wrapper.hpp.
{
opt->getOptValue<OptNumber>("hoproportion") = value;
}
| void gurls::RecursiveRLSWrapper< T >::train | ( | const gMat2D< T > & | X, |
| const gMat2D< T > & | y | ||
| ) | [virtual] |
| [in] | X | Input data matrix |
| [in] | Y | Labels matrix |
Implements gurls::GurlsWrapper< T >.
Definition at line 15 of file recrlswrapper.hpp.
{
this->opt->removeOpt("split");
this->opt->removeOpt("paramsel");
this->opt->removeOpt("optimizer");
this->opt->removeOpt("kernel");
SplitHo<T> splitTask;
GurlsOptionsList* split = splitTask.execute(X, y, *(this->opt));
this->opt->addOpt("split", split);
const gMat2D<unsigned long>& split_indices = split->getOptValue<OptMatrix<gMat2D<unsigned long> > >("indices");
const gMat2D<unsigned long>& split_lasts = split->getOptValue<OptMatrix<gMat2D<unsigned long> > >("lasts");
const unsigned long n = X.rows();
const unsigned long d = X.cols();
const unsigned long t = y.cols();
const unsigned long last = split_lasts.getData()[0];
const unsigned long nva = n-last;
unsigned long* va = new unsigned long[nva];
copy(va, split_indices.getData()+last, nva);
gMat2D<T>* Xva = new gMat2D<T>(nva, d);
gMat2D<T>* yva = new gMat2D<T>(nva, t);
subMatrixFromRows(X.getData(), n, d, va, nva, Xva->getData());
subMatrixFromRows(y.getData(), n, t, va, nva, yva->getData());
gMat2D<T>* XtX = new gMat2D<T>(d, d);
gMat2D<T>* Xty = new gMat2D<T>(d, t);
dot(X.getData(), X.getData(), XtX->getData(), n, d, n, d, d, d, CblasTrans, CblasNoTrans, CblasColMajor);
dot(X.getData(), y.getData(), Xty->getData(), n, d, n, t, d, t, CblasTrans, CblasNoTrans, CblasColMajor);
GurlsOptionsList* kernel = new GurlsOptionsList("kernel");
kernel->addOpt("XtX", new OptMatrix<gMat2D<T> >(*XtX));
kernel->addOpt("Xty", new OptMatrix<gMat2D<T> >(*Xty));
kernel->addOpt("Xva", new OptMatrix<gMat2D<T> >(*Xva));
kernel->addOpt("yva", new OptMatrix<gMat2D<T> >(*yva));
nTot = n;
this->opt->addOpt("kernel", kernel);
ParamSelHoPrimal<T> paramselTask;
this->opt->addOpt("paramsel", paramselTask.execute(X, y, *(this->opt)));
RLSPrimalRecInit<T> optimizerTask;
this->opt->addOpt("optimizer", optimizerTask.execute(X, y, *(this->opt)));
}
| bool gurls::GurlsWrapper< T >::trainedModel | ( | ) | [protected, virtual, inherited] |
| value | |
| value |
Definition at line 111 of file wrapper.hpp.
| void gurls::RecursiveRLSWrapper< T >::update | ( | const gVec< T > & | X, |
| const gVec< T > & | y | ||
| ) |
| [in] | X | Input data vector |
| [in] | Y | Labels vector |
Definition at line 74 of file recrlswrapper.hpp.
{
if(!this->trainedModel())
throw gException("Error, Train Model First");
RLSPrimalRecUpdate<T> optimizer;
const unsigned long d = X.getSize();
const unsigned long t = y.getSize();
gMat2D<T>X_mat(1, d);
copy(X_mat.getData(), X.getData(), d);
gMat2D<T>y_mat(1, t);
copy(y_mat.getData(), y.getData(), t);
GurlsOptionsList* ret = optimizer.execute(X_mat, y_mat, *(this->opt));
this->opt->removeOpt("optimizer");
this->opt->addOpt("optimizer", ret);
++nTot;
gMat2D<T>* xtx = new gMat2D<T>(d,d);
gMat2D<T>* xty = new gMat2D<T>(d,t);
dot(X.getData(), X.getData(), xtx->getData(), 1, d, 1, d, d, d, CblasTrans, CblasNoTrans, CblasColMajor);
dot(X.getData(), y.getData(), xty->getData(), 1, d, 1, t, d, t, CblasTrans, CblasNoTrans, CblasColMajor);
GurlsOptionsList* kernel = this->opt->template getOptAs<GurlsOptionsList>("kernel");
const gMat2D<T>& XtX = kernel->getOptValue<OptMatrix<gMat2D<T> > >("XtX");
const gMat2D<T>& Xty = kernel->getOptValue<OptMatrix<gMat2D<T> > >("Xty");
axpy(d*d, (T)1.0, XtX.getData(), 1, xtx->getData(), 1);
axpy(d*t, (T)1.0, Xty.getData(), 1, xty->getData(), 1);
kernel->removeOpt("XtX");
kernel->addOpt("XtX", new OptMatrix<gMat2D<T> >(*xtx));
kernel->removeOpt("Xty");
kernel->addOpt("Xty", new OptMatrix<gMat2D<T> >(*xty));
unsigned long proportion = static_cast<unsigned long>(gurls::round(1.0/this->opt->getOptAsNumber("hoproportion")));
if(nTot % proportion == 0)
{
const gMat2D<T>& Xva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("Xva");
const gMat2D<T>& yva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("yva");
const unsigned long nva = Xva.rows();
const unsigned long nva_new = nva+1;
gMat2D<T>* Xva_new = new gMat2D<T>(nva_new, d);
const T* old_it = Xva.getData();
T* new_it = Xva_new->getData();
for(const T* end = new_it+(nva_new*d); new_it< end; old_it+=nva, new_it +=nva_new)
copy(new_it, old_it, nva);
copy(Xva_new->getData()+nva, X.getData(), d, nva_new, 1);
kernel->removeOpt("Xva");
kernel->addOpt("Xva", new OptMatrix<gMat2D<T> >(*Xva_new));
gMat2D<T>* yva_new = new gMat2D<T>(nva_new, t);
old_it = yva.getData();
new_it = yva_new->getData();
for(const T* end = new_it+(nva_new*t); new_it< end; old_it+=nva, new_it +=nva_new)
copy(new_it, old_it, nva);
copy(yva_new->getData()+nva, y.getData(), t, nva_new, 1);
kernel->removeOpt("yva");
kernel->addOpt("yva", new OptMatrix<gMat2D<T> >(*yva_new));
}
}