23#include <yarp/math/Math.h>
24#include <yarp/math/SVD.h>
29using namespace yarp::math;
33namespace learningmachine {
36 assert(v1.size() == v2.size());
40 for(
size_t i = 0; i < v1.size(); i++) {
42 result += diff * diff;
44 result *= -1 * this->gamma;
45 return std::exp(result);
61 alphas(other.alphas), bias(other.bias), LOO(other.LOO), C(other.C),
71 if(
this == &other)
return *
this;
73 this->IFixedSizeLearner::operator=(other);
74 this->inputs = other.inputs;
75 this->outputs = other.outputs;
76 this->alphas = other.alphas;
77 this->bias = other.bias;
78 this->LOO = other.LOO;
81 this->kernel =
new RBFKernel(*other.kernel);
90 this->inputs.push_back(input);
91 this->outputs.push_back(output);
95 assert(this->inputs.size() == this->outputs.size());
98 if(inputs.size() == 0) {
103 yarp::sig::Matrix K(inputs.size() + 1, inputs.size() + 1);
104 for(
int r = 0; r < K.rows() - 1; r++) {
106 for(
int c = 0; c <= r; c++) {
107 K(r, c) = K(c, r) = this->kernel->
evaluate(this->inputs[r], this->inputs[c]);
108 if(r == c) K(r, c) += (1.0 / this->C);
111 for(
int i = 0; i < K.rows() - 1; i++) {
112 K(i, K.cols() - 1) = K(K.rows() - 1, i) = 1.;
114 K(K.rows() - 1, K.cols() - 1) = 0.;
117 yarp::sig::Matrix Kinv = luinv(K);
120 yarp::sig::Matrix Y =
zeros(this->outputs.size() + 1, this->getCoDomainSize());
121 for(
int r = 0; r < Y.rows() - 1; r++) {
122 for(
int c = 0; c < Y.cols(); c++) {
123 Y(r, c) = this->outputs[r](c);
127 yarp::sig::Matrix result = Kinv * Y;
128 this->alphas = result.submatrix(0, result.rows() - 2, 0, result.cols() - 1);
129 this->bias = result.getRow(result.rows() - 1);
135 yarp::sig::Vector alphas_i = this->alphas.getCol(i);
136 for(
size_t j = 0; j < alphas_i.size(); j++) {
137 double err = alphas_i(j) / Kinv(j, j);
138 this->LOO(i) += err * err;
140 this->LOO(i) /= alphas_i.size();
148 if(this->inputs.size() == 0) {
153 yarp::sig::Vector k(this->inputs.size());
154 for(
size_t i = 0; i < k.size(); i++) {
155 k(i) = this->kernel->
evaluate(this->inputs[i], input);
158 return Prediction((this->alphas.transposed() * k) + this->bias);
162 this->inputs.clear();
163 this->outputs.clear();
164 this->alphas = yarp::sig::Matrix();
174 std::ostringstream buffer;
176 buffer <<
"C: " << this->
getC() <<
" | ";
177 buffer <<
"Collected Samples: " << this->inputs.size() <<
" | ";
178 buffer <<
"Training Samples: " << this->alphas.rows() <<
" | ";
179 buffer <<
"Kernel: " << this->kernel->
getInfo() << std::endl;
180 buffer <<
"LOO: " << this->LOO.toString() << std::endl;
185 std::ostringstream buffer;
188 buffer <<
" c val Tradeoff parameter C" << std::endl;
195 bot << this->kernel->
getGamma() << this->
getC() << this->bias
199 for(
unsigned int i = 0; i < this->inputs.size(); i++) {
201 bot.addFloat64(this->inputs[i](d));
204 bot.addInt32(this->inputs.size());
207 for(
unsigned int i = 0; i < this->outputs.size(); i++) {
209 bot.addFloat64(this->outputs[i](d));
212 bot.addInt32(this->outputs.size());
223 this->outputs.resize(bot.pop().asInt32());
224 for(
int i = this->outputs.size() - 1; i >= 0; i--) {
227 this->outputs[i](d) = bot.pop().asFloat64();
232 this->inputs.resize(bot.pop().asInt32());
233 for(
int i = this->inputs.size() - 1; i >= 0; i--) {
236 this->inputs[i](d) = bot.pop().asFloat64();
242 bot >> this->alphas >> this->bias >> c >> gamma;
260 if(config.find(
"c").isFloat64() || config.find(
"c").isInt32()) {
261 double val = config.find(
"c").asFloat64();
263 this->
setC(config.find(
"c").asFloat64());
268 success |= this->kernel->
configure(config);
An generalized interface for a learning machine with a fixed domain and codomain size.
virtual void writeBottle(yarp::os::Bottle &bot) const
Writes a serialization of the machine into a bottle.
virtual void feedSample(const yarp::sig::Vector &input, const yarp::sig::Vector &output)
Provide the learning machine with an example of the desired mapping.
virtual void readBottle(yarp::os::Bottle &bot)
Unserializes a machine from a bottle.
virtual bool checkDomainSize(const yarp::sig::Vector &input)
Checks whether the input is of the desired dimensionality.
unsigned int getCoDomainSize() const
Returns the size (dimensionality) of the output domain (codomain).
virtual std::string getInfo()
Asks the learning machine to return a string containing information on its operation so far.
virtual void setCoDomainSize(unsigned int size)
Mutator for the codomain size.
virtual bool configure(yarp::os::Searchable &config)
Change parameters.
virtual void setDomainSize(unsigned int size)
Mutator for the domain size.
virtual std::string getConfigHelp()
Asks the learning machine to return a string containing the list of configuration options that it sup...
unsigned int getDomainSize() const
Returns the size (dimensionality) of the input domain.
void setName(const std::string &name)
Set the name of this machine learning technique.
This is basic implementation of the LSSVM algorithms.
virtual void feedSample(const yarp::sig::Vector &input, const yarp::sig::Vector &output)
Provide the learning machine with an example of the desired mapping.
virtual void writeBottle(yarp::os::Bottle &bot)
virtual double getC()
Accessor for the regularization parameter C.
void setCoDomainSize(unsigned int size)
Mutator for the codomain size.
void reset()
Forget everything and start over.
virtual ~LSSVMLearner()
Destructor.
void setDomainSize(unsigned int size)
Mutator for the domain size.
virtual void setC(double C)
Mutator for the regularization parameter C.
LSSVMLearner * clone()
Asks the learning machine to return a clone of its type.
Prediction predict(const yarp::sig::Vector &input)
Ask the learning machine to predict the output for a given input.
virtual void train()
Train the learning machine on the examples that have been supplied so far.
virtual void readBottle(yarp::os::Bottle &bot)
Unserializes a machine from a bottle.
LSSVMLearner(unsigned int dom=1, unsigned int cod=1, double c=1.0)
Constructor.
virtual std::string getInfo()
Asks the learning machine to return a string containing information on its operation so far.
virtual LSSVMLearner & operator=(const LSSVMLearner &other)
Assignment operator.
virtual std::string getConfigHelp()
Asks the learning machine to return a string containing the list of configuration options that it sup...
virtual bool configure(yarp::os::Searchable &config)
Change parameters.
A class that represents a prediction result.
virtual std::string getConfigHelp()
virtual std::string getInfo()
virtual void setGamma(double g)
virtual double evaluate(const yarp::sig::Vector &v1, const yarp::sig::Vector &v2)
virtual bool configure(yarp::os::Searchable &config)
virtual double getGamma()
This file contains the definition of unique IDs for the body parts and the skin parts of the robot.