24 #include <boost/serialization/export.hpp> 25 #include <boost/archive/text_iarchive.hpp> 26 #include <boost/archive/text_oarchive.hpp> 27 #include <boost/archive/xml_iarchive.hpp> 28 #include <boost/archive/xml_oarchive.hpp> 43 #include <eigen3/Eigen/SVD> 44 #include <eigen3/Eigen/LU> 47 using namespace Eigen;
55 if (model_parameters!=NULL)
59 FunctionApproximatorLWR::FunctionApproximatorLWR(
const ModelParametersLWR *
const model_parameters)
66 void FunctionApproximatorLWR::preallocateMemory(
int n_basis_functions)
68 lines_one_prealloc_ = MatrixXd(1,n_basis_functions);
69 activations_one_prealloc_ = MatrixXd(1,n_basis_functions);
71 lines_prealloc_ = MatrixXd(1,n_basis_functions);
72 activations_prealloc_ = MatrixXd(1,n_basis_functions);
116 cerr <<
"WARNING: You may not call FunctionApproximatorLWR::train more than once. Doing nothing." << endl;
117 cerr <<
" (if you really want to retrain, call reTrain function instead)" << endl;
121 assert(inputs.rows() == targets.rows());
128 VectorXd min = inputs.colwise().minCoeff();
129 VectorXd max = inputs.colwise().maxCoeff();
130 MatrixXd centers, widths;
132 bool normalize_activations =
true;
133 bool asym_kernels = meta_parameters_lwr->asymmetric_kernels();
136 int n_samples = inputs.rows();
137 int n_kernels = centers.rows();
138 MatrixXd activations(n_samples,n_kernels);
139 BasisFunction::Gaussian::activations(centers,widths,inputs,activations,normalize_activations,asym_kernels);
142 bool use_offset =
true;
143 double regularization = meta_parameters_lwr->regularization();
144 double min_weight = 0.000001*activations.maxCoeff();
147 int n_betas = inputs.cols();
150 MatrixXd beta(n_kernels,n_betas);
151 VectorXd cur_beta(n_betas);
152 VectorXd weights(inputs.rows());
155 for (
int i_kernel=0; i_kernel<n_kernels; i_kernel++)
157 weights = activations.col(i_kernel);
159 beta.row(i_kernel) = cur_beta;
162 MatrixXd offsets = beta.rightCols(1);
163 MatrixXd slopes = beta.leftCols(n_betas-1);
167 preallocateMemory(n_kernels);
175 cerr <<
"WARNING: You may not call FunctionApproximatorLWPR::predict if you have not trained yet. Doing nothing." << endl;
212 bool only_one_sample = (inputs.rows()==1);
215 ENTERING_REAL_TIME_CRITICAL_CODE
218 model_parameters_lwr->
getLines(inputs, lines_one_prealloc_);
223 outputs = (lines_one_prealloc_.array()*activations_one_prealloc_.array()).rowwise().sum();
225 EXITING_REAL_TIME_CRITICAL_CODE
231 int n_time_steps = inputs.rows();
235 lines_prealloc_.resize(n_time_steps,n_basis_functions);
236 activations_prealloc_.resize(n_time_steps,n_basis_functions);
239 model_parameters_lwr->
getLines(inputs, lines_prealloc_);
244 outputs = (lines_prealloc_.array()*activations_prealloc_.array()).rowwise().sum();
252 if (save_directory.empty())
260 int n_samples = inputs.rows();
263 MatrixXd lines(n_samples,n_basis_functions);
264 model_parameters_lwr->
getLines(inputs, lines);
266 MatrixXd unnormalized_activations(n_samples,n_basis_functions);
269 MatrixXd activations(n_samples,n_basis_functions);
272 MatrixXd predictions = (lines.array()*activations.array()).rowwise().sum();
274 saveMatrix(save_directory,
"n_samples_per_dim.txt",n_samples_per_dim,overwrite);
275 saveMatrix(save_directory,
"inputs_grid.txt",inputs,overwrite);
276 saveMatrix(save_directory,
"lines_grid.txt",lines,overwrite);
277 saveMatrix(save_directory,
"activations_unnormalized_grid.txt",unnormalized_activations,overwrite);
278 saveMatrix(save_directory,
"activations_grid.txt",activations,overwrite);
279 saveMatrix(save_directory,
"predictions_grid.txt",predictions,overwrite);
286 template<
class Archive>
287 void FunctionApproximatorLWR::serialize(Archive & ar,
const unsigned int version)
Header file for input/output of Eigen matrices to ASCII files.
void kernelActivations(const Eigen::Ref< const Eigen::MatrixXd > &inputs, Eigen::MatrixXd &kernel_activations) const
Get the normalized kernel activations for given inputs.
Header file for various least squares functions.
Eigen::MatrixXd weightedLeastSquares(const Eigen::Ref< const Eigen::MatrixXd > &inputs, const Eigen::Ref< const Eigen::MatrixXd > &targets, const Eigen::Ref< const Eigen::VectorXd > &weights, bool use_offset, double regularization, double min_weight)
(Regularized) weighted least squares with bias
static void generateInputsGrid(const Eigen::VectorXd &min, const Eigen::VectorXd &max, const Eigen::VectorXi &n_samples_per_dim, Eigen::MatrixXd &inputs_grid)
Generate a input samples that lie on a grid (much like Matlab's meshgrid) For instance, if min = [2 6], and max = [3 8], and n_samples_per_dim = [3 5] then this function first makes linearly spaces samples along each dimension, e.g.
Model parameters for the Locally Weighted Regression (LWR) function approximator. ...
bool saveMatrix(std::string filename, Eigen::Matrix< Scalar, RowsAtCompileTime, ColsAtCompileTime > matrix, bool overwrite=false)
Save an Eigen matrix to an ASCII file.
bool isTrained(void) const
Determine whether the function approximator has already been trained with data or not...
void predict(const Eigen::Ref< const Eigen::MatrixXd > &inputs, Eigen::MatrixXd &outputs)
Query the function approximator to make a prediction.
BasisFunction header file.
int getExpectedOutputDim(void) const
The expected dimensionality of the output data.
Base class for all function approximators.
FunctionApproximator * clone(void) const
Return a pointer to a deep copy of the FunctionApproximator object.
void getLines(const Eigen::Ref< const Eigen::MatrixXd > &inputs, Eigen::MatrixXd &lines) const
Get the output of each linear model (unweighted) for the given inputs.
bool saveGridData(const Eigen::VectorXd &min, const Eigen::VectorXd &max, const Eigen::VectorXi &n_samples_per_dim, std::string directory, bool overwrite=false) const
Generate a grid of inputs, and output the response of the basis functions and line segments for these...
ModelParametersLWR class header file.
LWR (Locally Weighted Regression) function approximator.
const MetaParameters * getMetaParameters(void) const
Accessor for FunctionApproximator::meta_parameters_.
void train(const Eigen::Ref< const Eigen::MatrixXd > &inputs, const Eigen::Ref< const Eigen::MatrixXd > &targets)
Train the function approximator with corresponding input and target examples.
const ModelParameters * getModelParameters(void) const
Accessor for FunctionApproximator::model_parameters_.
BOOST_CLASS_EXPORT_IMPLEMENT(DmpBbo::FunctionApproximatorLWR)
For boost::serialization.
void setModelParameters(ModelParameters *model_parameters)
Accessor for FunctionApproximator::model_parameters_.
unsigned int getNumberOfBasisFunctions() const
Get the number of basis functions in this model.
FunctionApproximatorLWR class header file.
int getExpectedInputDim(void) const
The expected dimensionality of the input data.
void unnormalizedKernelActivations(const Eigen::Ref< const Eigen::MatrixXd > &inputs, Eigen::MatrixXd &kernel_activations) const
Get the unnormalized kernel activations for given inputs.
Header file for serialization of Eigen matrices.