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
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
00096 optimizer->init(model);
00097 for (i=0; i<iterations; i++) optimizer->optimize(model, *baseError, trainD, trainT);
00098
00099
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
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
00136 optimizer->init(model);
00137 for (i=0; i<iterations; i++) optimizer->optimize(model, *baseError, trainD, trainT);
00138
00139
00140 return baseError->errorDerivative(model, validationD, validationT, derivative);
00141 }