• Main Page
  • Related Pages
  • Classes
  • Files
  • Examples
  • File List
  • File Members

ValidationError.cpp

Go to the documentation of this file.
00001 //===========================================================================
00042 //===========================================================================
00043 
00044 
00045 #include <vector>
00046 #include <Rng/GlobalRng.h>
00047 #include <ReClaM/ValidationError.h>
00048 
00049 
00050 ValidationError::ValidationError(ErrorFunction* base, Optimizer* opt, int iter, double holdOutFraction)
00051 {
00052     this->baseError = base;
00053     this->optimizer = opt;
00054     this->iterations = iter;
00055     this->holdOut = holdOutFraction;
00056 }
00057 
00058 ValidationError::~ValidationError()
00059 {
00060 }
00061 
00062 
00063 double ValidationError::error(Model& model, const Array<double>& input, const Array<double>& target)
00064 {
00065     // split the data into training and validation set
00066     int i, ic = input.dim(0);
00067     int dim = input.dim(1);
00068     int tdim = target.dim(1);
00069     int train = (int)((1.0 - holdOut) * ic);
00070     int validation = ic - train;
00071     std::vector<int> tr(ic);
00072     std::vector<int> val(validation);
00073     for (i=0; i<ic; i++) tr[i] = i;
00074     for (i=0; i<validation; i++)
00075     {
00076         int n = Rng::discrete(0, tr.size() - 1);
00077         val[i] = tr[n];
00078         tr.erase(tr.begin() + n);
00079     }
00080     Array<double> trainD(train, dim);
00081     Array<double> trainT(train, tdim);
00082     Array<double> validationD(validation, dim);
00083     Array<double> validationT(validation, tdim);
00084     for (i=0; i<train; i++)
00085     {
00086         trainD[i] = input[tr[i]];
00087         trainT[i] = target[tr[i]];
00088     }
00089     for (i=0; i<validation; i++)
00090     {
00091         validationD[i] = input[val[i]];
00092         validationT[i] = target[val[i]];
00093     }
00094 
00095     // train the model on the training subset
00096     optimizer->init(model);
00097     for (i=0; i<iterations; i++) optimizer->optimize(model, *baseError, trainD, trainT);
00098 
00099     // return the validation error
00100     return baseError->error(model, validationD, validationT);
00101 }
00102 
00103 double ValidationError::errorDerivative(Model& model, const Array<double>& input, const Array<double>& target, Array<double>& derivative)
00104 {
00105     // split the data into training and validation set
00106     int i, ic = input.dim(0);
00107     int dim = input.dim(1);
00108     int tdim = target.dim(1);
00109     int train = (int)(holdOut * ic);
00110     int validation = ic - train;
00111     std::vector<int> tr(ic);
00112     std::vector<int> val(validation);
00113     for (i=0; i<ic; i++) tr[i] = i;
00114     for (i=0; i<validation; i++)
00115     {
00116         int n = Rng::discrete(0, tr.size() - 1);
00117         val[i] = tr[n];
00118         tr.erase(tr.begin() + n);
00119     }
00120     Array<double> trainD(train, dim);
00121     Array<double> trainT(train, tdim);
00122     Array<double> validationD(validation, dim);
00123     Array<double> validationT(validation, tdim);
00124     for (i=0; i<train; i++)
00125     {
00126         trainD[i] = input[tr[i]];
00127         trainT[i] = target[tr[i]];
00128     }
00129     for (i=0; i<validation; i++)
00130     {
00131         validationD[i] = input[val[i]];
00132         validationT[i] = target[val[i]];
00133     }
00134 
00135     // train the model on the training subset
00136     optimizer->init(model);
00137     for (i=0; i<iterations; i++) optimizer->optimize(model, *baseError, trainD, trainT);
00138 
00139     // return the validation error
00140     return baseError->errorDerivative(model, validationD, validationT, derivative);
00141 }
  • Shark Main Page
  • Array
  • Rng
  • LinAlg
  • FileUtil
  • EALib
  • MOO-EALib
  • ReClaM
  • Fuzzy
  • Mixture
  • Tutorials
  • FAQ