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


Public Member Functions | |
| GurlsOptionsList * | execute (const gMat2D< T > &X, const gMat2D< T > &Y, const GurlsOptionsList &opt) |
| Implements the selection of the regularization parameter(s) | |
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 67 of file siglamhogpregr.h.
| GurlsOptionsList * gurls::ParamSelSiglamHoGPRegr< T >::execute | ( | const gMat2D< T > & | X, |
| const gMat2D< T > & | Y, | ||
| const GurlsOptionsList & | opt | ||
| ) | [virtual] |
| X | input data matrix |
| Y | labels matrix |
| opt | options with the different required fields based on the sub-class |
Implements gurls::ParamSelection< T >.
Definition at line 77 of file siglamhogpregr.h.
{
// [n,T] = size(y);
const unsigned long n = Y.rows();
const unsigned long t = Y.cols();
const unsigned long d = X.cols();
GurlsOptionsList* nestedOpt = new GurlsOptionsList("nested");
nestedOpt->copyOpt("nlambda", opt);
nestedOpt->copyOpt("nholdouts", opt);
nestedOpt->copyOpt("hoperf", opt);
nestedOpt->copyOpt("split", opt);
nestedOpt->copyOpt("singlelambda", opt);
// if ~isfield(opt,'kernel')
if(!opt.hasOpt("kernel"))
{
// opt.kernel.type = 'rbf';
GurlsOptionsList* kernel = new GurlsOptionsList("kernel");
kernel->addOpt("type", "rbf");
nestedOpt->addOpt("kernel", kernel);
}
else
nestedOpt->copyOpt("kernel", opt);
GurlsOptionsList* kernel = nestedOpt->getOptAs<GurlsOptionsList>("kernel");
gMat2D<T> *distance;
// if ~isfield(opt.kernel,'distance')
if(!kernel->hasOpt("distance"))
{
distance = new gMat2D<T>(n, n);
// opt.kernel.distance = square_distance(X',X');
distance_transposed(X.getData(), X.getData(), d, n, n, distance->getData());
kernel->addOpt("distance", new OptMatrix<gMat2D<T> >(*distance));
}
else
distance = &(kernel->getOptValue<OptMatrix<gMat2D<T> > >("distance"));
// if ~isfield(opt,'sigmamin')
if(!opt.hasOpt("sigmamin"))
{
int d_len = n*(n-1)/2;
T* distLinearized = new T[d_len];
// D = sort(opt.kernel.distance(tril(true(n),-1)));
const unsigned long size = distance->cols();
T* it = distLinearized;
T* d_it = distance->getData();
for(unsigned long i=1; i< size; ++i)
{
gurls::copy(it , d_it+i, size - i);
it += size - i;
d_it += size;
}
std::sort(distLinearized, distLinearized + d_len);
// firstPercentile = round(0.01*numel(D)+0.5);
int firstPercentile = gurls::round((T)0.01 * d_len + (T)0.5)-1;
// opt.sigmamin = D(firstPercentile);
nestedOpt->addOpt("sigmamin", new OptNumber(sqrt( distLinearized[firstPercentile]) ));
delete [] distLinearized;
}
else
nestedOpt->copyOpt("sigmamin", opt);
// if ~isfield(opt,'sigmamax')
if(!opt.hasOpt("sigmamax"))
{
// opt.sigmamax = sqrt(max(max(opt.kernel.distance)));
double sigmaMax = sqrt(*std::max_element(distance->getData(), distance->getData()+distance->getSize()));
nestedOpt->addOpt("sigmamax", new OptNumber(sigmaMax));
}
else
nestedOpt->copyOpt("sigmamax", opt);
// if opt.sigmamin <= 0
if( le(nestedOpt->getOptAsNumber("sigmamin"), 0.0))
{
// opt.sigmamin = eps;
nestedOpt->removeOpt("sigmamin");
nestedOpt->addOpt("sigmamin", new OptNumber(std::numeric_limits<T>::epsilon()));
}
// if opt.sigmamax <= 0
if( le(nestedOpt->getOptAsNumber("sigmamax"), 0.0) )
{
// opt.sigmamax = eps;
nestedOpt->removeOpt("sigmamax");
nestedOpt->addOpt("sigmamax", new OptNumber(std::numeric_limits<T>::epsilon()));
}
const int nsigma = static_cast<int>(opt.getOptAsNumber("nsigma"));
const int nlambda = static_cast<int>(opt.getOptAsNumber("nlambda"));
const T sigmamin = static_cast<T>(nestedOpt->getOptAsNumber("sigmamin"));
// q = (opt.sigmamax/opt.sigmamin)^(1/(opt.nsigma-1));
T q = static_cast<T>(std::pow(nestedOpt->getOptAsNumber("sigmamax")/nestedOpt->getOptAsNumber("sigmamin"), 1.0/(nsigma-1.0)));
// PERF = zeros(opt.nsigma,opt.nlambda,T);
T* perf = new T[nsigma*nlambda];
set(perf, (T)0.0, nsigma*nlambda);
// sigmas = zeros(1,opt.nsigma);
// T* sigmas = new T[nsigma];
T* guesses = new T[nsigma*nlambda];
KernelRBF<T> rbf;
ParamSelHoGPRegr<T> hogp;
GurlsOptionsList* paramsel_rbf = new GurlsOptionsList("paramsel");
nestedOpt->addOpt("paramsel", paramsel_rbf);
T* perf_median = new T[nlambda*t];
T* guesses_median = new T[nlambda];
const unsigned long nholdouts = static_cast<unsigned long>(opt.getOptAsNumber("nholdouts"));
T* work = new T[std::max(nholdouts, t)];
// for i = 1:opt.nsigma
for(int i=0; i<nsigma; ++i)
{
// sigmas(i) = (opt.sigmamin*(q^(i-1)));
const T sigma = sigmamin* std::pow(q, i);
// opt.paramsel.sigma = sigmas(i);
paramsel_rbf->removeOpt("sigma");
paramsel_rbf->addOpt("sigma", new OptNumber(sigma));
// opt.kernel = kernel_rbf(X,y,opt);
GurlsOptionsList* rbf_kernel = rbf.execute(X, Y, *nestedOpt);
nestedOpt->removeOpt("kernel");
nestedOpt->addOpt("kernel", rbf_kernel);
// paramsel = paramsel_hogpregr(X,y,opt);
GurlsOptionsList* paramsel_hogp = hogp.execute(X, Y, *nestedOpt);
// PERF(i,:,:) = reshape(median(reshape(cell2mat(paramsel.perf')',opt.nlambda*T,nh),2),T,opt.nlambda)';
gMat2D<T> &perf_mat = paramsel_hogp->getOptValue<OptMatrix<gMat2D<T> > >("perf"); //nholdouts x nlambda*t
median(perf_mat.getData(), perf_mat.rows(), perf_mat.cols(), 1, perf_median, work);
T* perf_it = perf + i;
for(int j=0; j<nlambda; ++j, perf_it += nsigma)
{
getRow(perf_median, nlambda, t, j, work);
*perf_it = sumv(work, t);
}
// guesses(i,:) = median(cell2mat(paramsel.guesses'),1);
gMat2D<T> &guesses_mat = paramsel_hogp->getOptValue<OptMatrix<gMat2D<T> > >("guesses"); // nholdouts x nlambda
median(guesses_mat.getData(), guesses_mat.rows(), guesses_mat.cols(), 1, guesses_median, work);
copy(guesses+i, guesses_median, nlambda, nsigma, 1);
delete paramsel_hogp;
}
delete [] perf_median;
delete [] guesses_median;
delete [] work;
delete nestedOpt;
// M = sum(PERF,3); % sum over classes
// [dummy,i] = max(M(:));
int i = std::max_element(perf, perf +(nsigma*nlambda)) - perf;
// [m,n] = ind2sub(size(M),i);
int im = i%nsigma;
delete[] perf;
GurlsOptionsList* paramsel = new GurlsOptionsList("paramsel");
// % opt sigma
// vout.sigma = opt.sigmamin*(q^(m-1));
paramsel->addOpt("sigma", new OptNumber( sigmamin*(std::pow(q, im))) );
// % opt lambda
// vout.noises = guesses(m,n)*ones(1,T);
gMat2D<T> *lambdas = new gMat2D<T>(1, t);
set(lambdas->getData(), guesses[i], t);
paramsel->addOpt("lambdas", new OptMatrix<gMat2D<T> >(*lambdas));
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);
}