![]() |
GURLS++
2.0.00
C++ Implementation of GURLS Matlab Toolbox
|
00001 00002 //#include "gurls.h" 00003 //#include "optlist.h" 00004 #include "gurls++/recrlswrapper.h" 00005 00006 namespace gurls 00007 { 00008 template <typename T> 00009 RecursiveRLSWrapper<T>::RecursiveRLSWrapper(const std::string &name): GurlsWrapper<T>(name) 00010 { 00011 this->opt->template getOptValue<OptNumber>("nholdouts") = 1.0; 00012 } 00013 00014 template <typename T> 00015 void RecursiveRLSWrapper<T>::train(const gMat2D<T> &X, const gMat2D<T> &y) 00016 { 00017 this->opt->removeOpt("split"); 00018 this->opt->removeOpt("paramsel"); 00019 this->opt->removeOpt("optimizer"); 00020 this->opt->removeOpt("kernel"); 00021 00022 00023 SplitHo<T> splitTask; 00024 GurlsOptionsList* split = splitTask.execute(X, y, *(this->opt)); 00025 this->opt->addOpt("split", split); 00026 00027 00028 const gMat2D<unsigned long>& split_indices = split->getOptValue<OptMatrix<gMat2D<unsigned long> > >("indices"); 00029 const gMat2D<unsigned long>& split_lasts = split->getOptValue<OptMatrix<gMat2D<unsigned long> > >("lasts"); 00030 00031 const unsigned long n = X.rows(); 00032 const unsigned long d = X.cols(); 00033 const unsigned long t = y.cols(); 00034 00035 const unsigned long last = split_lasts.getData()[0]; 00036 const unsigned long nva = n-last; 00037 00038 unsigned long* va = new unsigned long[nva]; 00039 copy(va, split_indices.getData()+last, nva); 00040 00041 gMat2D<T>* Xva = new gMat2D<T>(nva, d); 00042 gMat2D<T>* yva = new gMat2D<T>(nva, t); 00043 00044 subMatrixFromRows(X.getData(), n, d, va, nva, Xva->getData()); 00045 subMatrixFromRows(y.getData(), n, t, va, nva, yva->getData()); 00046 00047 gMat2D<T>* XtX = new gMat2D<T>(d, d); 00048 gMat2D<T>* Xty = new gMat2D<T>(d, t); 00049 00050 00051 dot(X.getData(), X.getData(), XtX->getData(), n, d, n, d, d, d, CblasTrans, CblasNoTrans, CblasColMajor); 00052 dot(X.getData(), y.getData(), Xty->getData(), n, d, n, t, d, t, CblasTrans, CblasNoTrans, CblasColMajor); 00053 00054 00055 GurlsOptionsList* kernel = new GurlsOptionsList("kernel"); 00056 kernel->addOpt("XtX", new OptMatrix<gMat2D<T> >(*XtX)); 00057 kernel->addOpt("Xty", new OptMatrix<gMat2D<T> >(*Xty)); 00058 00059 kernel->addOpt("Xva", new OptMatrix<gMat2D<T> >(*Xva)); 00060 kernel->addOpt("yva", new OptMatrix<gMat2D<T> >(*yva)); 00061 00062 nTot = n; 00063 this->opt->addOpt("kernel", kernel); 00064 00065 ParamSelHoPrimal<T> paramselTask; 00066 this->opt->addOpt("paramsel", paramselTask.execute(X, y, *(this->opt))); 00067 00068 00069 RLSPrimalRecInit<T> optimizerTask; 00070 this->opt->addOpt("optimizer", optimizerTask.execute(X, y, *(this->opt))); 00071 } 00072 00073 template <typename T> 00074 void RecursiveRLSWrapper<T>::update(const gVec<T> &X, const gVec<T> &y) 00075 { 00076 if(!this->trainedModel()) 00077 throw gException("Error, Train Model First"); 00078 00079 RLSPrimalRecUpdate<T> optimizer; 00080 00081 const unsigned long d = X.getSize(); 00082 const unsigned long t = y.getSize(); 00083 00084 gMat2D<T>X_mat(1, d); 00085 copy(X_mat.getData(), X.getData(), d); 00086 gMat2D<T>y_mat(1, t); 00087 copy(y_mat.getData(), y.getData(), t); 00088 00089 GurlsOptionsList* ret = optimizer.execute(X_mat, y_mat, *(this->opt)); 00090 this->opt->removeOpt("optimizer"); 00091 this->opt->addOpt("optimizer", ret); 00092 00093 ++nTot; 00094 00095 gMat2D<T>* xtx = new gMat2D<T>(d,d); 00096 gMat2D<T>* xty = new gMat2D<T>(d,t); 00097 00098 dot(X.getData(), X.getData(), xtx->getData(), 1, d, 1, d, d, d, CblasTrans, CblasNoTrans, CblasColMajor); 00099 dot(X.getData(), y.getData(), xty->getData(), 1, d, 1, t, d, t, CblasTrans, CblasNoTrans, CblasColMajor); 00100 00101 GurlsOptionsList* kernel = this->opt->template getOptAs<GurlsOptionsList>("kernel"); 00102 00103 const gMat2D<T>& XtX = kernel->getOptValue<OptMatrix<gMat2D<T> > >("XtX"); 00104 const gMat2D<T>& Xty = kernel->getOptValue<OptMatrix<gMat2D<T> > >("Xty"); 00105 00106 axpy(d*d, (T)1.0, XtX.getData(), 1, xtx->getData(), 1); 00107 axpy(d*t, (T)1.0, Xty.getData(), 1, xty->getData(), 1); 00108 00109 kernel->removeOpt("XtX"); 00110 kernel->addOpt("XtX", new OptMatrix<gMat2D<T> >(*xtx)); 00111 00112 kernel->removeOpt("Xty"); 00113 kernel->addOpt("Xty", new OptMatrix<gMat2D<T> >(*xty)); 00114 00115 00116 unsigned long proportion = static_cast<unsigned long>(gurls::round(1.0/this->opt->getOptAsNumber("hoproportion"))); 00117 00118 if(nTot % proportion == 0) 00119 { 00120 const gMat2D<T>& Xva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("Xva"); 00121 const gMat2D<T>& yva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("yva"); 00122 00123 const unsigned long nva = Xva.rows(); 00124 const unsigned long nva_new = nva+1; 00125 00126 00127 gMat2D<T>* Xva_new = new gMat2D<T>(nva_new, d); 00128 00129 const T* old_it = Xva.getData(); 00130 T* new_it = Xva_new->getData(); 00131 for(const T* end = new_it+(nva_new*d); new_it< end; old_it+=nva, new_it +=nva_new) 00132 copy(new_it, old_it, nva); 00133 00134 copy(Xva_new->getData()+nva, X.getData(), d, nva_new, 1); 00135 00136 kernel->removeOpt("Xva"); 00137 kernel->addOpt("Xva", new OptMatrix<gMat2D<T> >(*Xva_new)); 00138 00139 00140 gMat2D<T>* yva_new = new gMat2D<T>(nva_new, t); 00141 00142 old_it = yva.getData(); 00143 new_it = yva_new->getData(); 00144 for(const T* end = new_it+(nva_new*t); new_it< end; old_it+=nva, new_it +=nva_new) 00145 copy(new_it, old_it, nva); 00146 00147 copy(yva_new->getData()+nva, y.getData(), t, nva_new, 1); 00148 00149 kernel->removeOpt("yva"); 00150 kernel->addOpt("yva", new OptMatrix<gMat2D<T> >(*yva_new)); 00151 00152 } 00153 } 00154 00155 template <typename T> 00156 gMat2D<T>* RecursiveRLSWrapper<T>::eval(const gMat2D<T> &X) 00157 { 00158 if(!this->trainedModel()) 00159 throw gException("Error, Train Model First"); 00160 00161 gurls::PredPrimal<T> predTask; 00162 gMat2D<T> y; 00163 00164 OptMatrix<gMat2D<T> >* result = predTask.execute(X, y, *(this->opt)); 00165 00166 gMat2D<T>& pred_mat = result->getValue(); 00167 result->detachValue(); 00168 delete result; 00169 00170 return &pred_mat; 00171 } 00172 00173 template <typename T> 00174 void RecursiveRLSWrapper<T>::retrain() 00175 { 00176 GurlsOptionsList* kernel = this->opt->template getOptAs<GurlsOptionsList>("kernel"); 00177 const gMat2D<T> &Xva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("Xva"); 00178 const gMat2D<T> &yva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("yva"); 00179 00180 const unsigned long nva = Xva.rows(); 00181 00182 this->opt->removeOpt("paramsel"); 00183 this->opt->removeOpt("optimizer"); 00184 00185 GurlsOptionsList* split = this->opt->template getOptAs<GurlsOptionsList>("split"); 00186 split->removeOpt("indices"); 00187 split->removeOpt("lasts"); 00188 00189 00190 gMat2D<unsigned long>* indices = new gMat2D<unsigned long>(1, nTot); 00191 gMat2D<unsigned long>* lasts = new gMat2D<unsigned long>(1, 1); 00192 00193 set(indices->getData(), 0ul, nTot-nva); 00194 unsigned long * it = indices->getData() + (nTot-nva); 00195 for(unsigned long i=0; i<nva; ++i, ++it) 00196 *it = i; 00197 00198 lasts->getData()[0] = (nTot-nva); 00199 00200 split->addOpt("indices", new OptMatrix<gMat2D<unsigned long> >(*indices)); 00201 split->addOpt("lasts", new OptMatrix<gMat2D<unsigned long> >(*lasts)); 00202 00203 00204 ParamSelHoPrimal<T> paramselTask; 00205 this->opt->addOpt("paramsel", paramselTask.execute(Xva, yva, *(this->opt))); 00206 00207 00208 RLSPrimalRecInit<T> optimizerTask; 00209 gMat2D<T> emptyMat; 00210 this->opt->addOpt("nTot", new OptNumber(nTot)); 00211 this->opt->addOpt("optimizer", optimizerTask.execute(emptyMat, emptyMat, *(this->opt))); 00212 this->opt->removeOpt("nTot"); 00213 00214 } 00215 00216 }