19 #include "drwnFeatureMaps.h"
20 #include "drwnRegression.h"
21 #include "drwnOptimizer.h"
45 const vector<vector<double> > *_features;
46 const vector<double> *_targets;
47 const vector<double> *_weights;
59 virtual const char *
type()
const {
return "drwnLinearRegressor"; }
62 virtual bool save(drwnXMLNode& xml)
const;
63 virtual bool load(drwnXMLNode& xml);
70 virtual double getRegression(
const vector<double>& features)
const = 0;
74 double objective(
const double *x)
const;
75 void gradient(
const double *x,
double *df)
const;
76 virtual double objectiveAndGradient(
const double *x,
double *df)
const = 0;
107 template<
class FeatureMap = drwnBiasFeatureMap>
127 virtual void initialize(
unsigned n);
130 virtual double getRegression(
const vector<double>& features)
const;
133 virtual double objectiveAndGradient(
const double *x,
double *df)
const;
145 template<
class FeatureMap>
149 const FeatureMap phi(_nFeatures);
150 _theta = VectorXd::Zero(phi.numParameters());
153 template<
class FeatureMap>
156 DRWN_ASSERT(features.size() == (unsigned)_nFeatures);
159 vector<double> t(_theta.rows());
160 Eigen::Map<VectorXd>(&t[0], t.size()) = _theta;
162 const FeatureMap phi(_nFeatures);
163 return phi.dot(t, features);
166 template<
class FeatureMap>
172 const unsigned m = _targets->size();
173 const FeatureMap phi(_nFeatures);
174 const vector<double> vx(x, x + _n);
175 vector<double> vdf(_n, 0.0);
179 for (
unsigned i = 0; i < m; i++) {
180 double predicted = phi.dot(vx, (*_features)[i]);
181 double dist = predicted - (*_targets)[i];
182 double wdist = (_weights == NULL) ? dist : dist * (*_weights)[i];
184 phi.mac(vdf, (*_features)[i], wdist);
191 for (
unsigned i = 0; i < m; i++) {
192 double predicted = phi.dot(vx, (*_features)[i]);
193 double u = predicted - (*_targets)[i];
194 if (_weights == NULL) {
195 obj += drwn::huberFunctionAndDerivative(u, &dh, _beta);
197 obj += (*_weights)[i] * drwn::huberFunctionAndDerivative(u, &dh, _beta);
198 dh *= (*_weights)[i];
200 phi.mac(vdf, (*_features)[i], dh);
204 memcpy((
void *)df, (
void *)&vdf[0], _n *
sizeof(
double));
205 if (m == 0.0)
return 0.0;
208 Eigen::Map<VectorXd>(df, _n) /= (
double)m;
211 switch (_regularizer) {
214 double weightNorm = 0.0;
215 for (
unsigned i = 0; i < _n; i++) {
216 weightNorm += x[i] * x[i];
217 df[i] += _lambda * x[i];
220 obj += 0.5 * _lambda * weightNorm;
227 for (
unsigned i = 0; i < _n; i++) {
228 obj += _lambda * drwn::huberFunctionAndDerivative(x[i], &dh, 1.0e-3);
229 df[i] += _lambda * dh;
235 DRWN_LOG_ERROR(
"unsupported regularizer " << _regularizer);
virtual double train(const drwnRegressionDataset &dataset)=0
estimate the regression parameters a drwnRegressionDataset
int _penalty
regression penalty option
Definition: drwnLinearRegressor.h:38
Implements the interface for a generic machine learning regression, e.g. see drwnLinearRegressor.
Definition: drwnRegression.h:27
double _beta
huber penalty threshold
Definition: drwnLinearRegressor.h:39
Common functionality for drwnLinearRegressor.
Definition: drwnLinearRegressor.h:30
static int MAX_ITERATIONS
maximum training iterations
Definition: drwnLinearRegressor.h:34
drwnTLinearRegressor(const drwnTLinearRegressor< FeatureMap > &c)
copy constructor
Definition: drwnLinearRegressor.h:116
drwnTLinearRegressor(unsigned n)
construct a linear regressor for data of dimension n
Definition: drwnLinearRegressor.h:113
virtual void initialize(unsigned n)
initialize the regressor to accept data of dimensionality n
Definition: drwnRegression.cpp:47
static double HUBER_BETA
beta parameter for huber penalty
Definition: drwnLinearRegressor.h:32
virtual double objectiveAndGradient(const double *x, double *df) const
returns value of objective function and populates gradient df at point x
Definition: drwnLinearRegressor.h:167
virtual drwnTLinearRegressor< FeatureMap > * clone() const
returns a copy of the class usually implemented as virtual Foo* clone() { return new Foo(*this); } ...
Definition: drwnLinearRegressor.h:122
VectorXd _theta
regression weights
Definition: drwnLinearRegressor.h:37
virtual double getRegression(const vector< double > &features) const
return the estimated value for a given feature vector
Definition: drwnLinearRegressor.h:154
static double REG_STRENGTH
regularization strength
Definition: drwnLinearRegressor.h:33
Interface for solving large-scale unconstrained optimization problems using L-BFGS.
Definition: drwnOptimizer.h:68
int _regularizer
regularization option
Definition: drwnLinearRegressor.h:40
virtual void initialize(unsigned n)
initialize the regressor to accept data of dimensionality n
Definition: drwnLinearRegressor.h:146
Implements a cacheable dataset containing feature vectors, labels and optional weights.
Definition: drwnDataset.h:43
drwnTLinearRegressor()
default constructor
Definition: drwnLinearRegressor.h:111
virtual const char * type() const
returns object type as a string (e.g., Foo::type() { return "Foo"; })
Definition: drwnLinearRegressor.h:59
double _lambda
regularization strength
Definition: drwnLinearRegressor.h:41
Implements linear regression optimization templated on a drwnFeatureMap.
Definition: drwnLinearRegressor.h:108
drwnTLinearRegressor drwnLinearRegressor
Conveinience type declaration for linear regression with default feature mapping. ...
Definition: drwnLinearRegressor.h:141