mutable
A Database System for Research and Fast Prototyping
Loading...
Searching...
No Matches
LinearModel.cpp
Go to the documentation of this file.
2
3#include "util/eigen_meta.hpp"
6
7
8using namespace m;
9
10
11//======================================================================================================================
12// LinearModel Methods
13//======================================================================================================================
14
15LinearModel::LinearModel(const Eigen::MatrixXd &X, const Eigen::VectorXd &y)
16 : coefficients_(regression_linear_closed_form(X, y)), num_features_(coefficients_.rows()) {}
17
18LinearModel::LinearModel(const Eigen::MatrixXd &X, const Eigen::VectorXd &y,
19 const std::function<Eigen::MatrixXd(Eigen::MatrixXd)> &transform_function)
20 {
21 /* apply transformations */
22 auto X_trans = transform_function(X);
23
24 num_features_ = X.cols();
25 transformation_ = transform_function;
27}
28
29double LinearModel::predict_target(const Eigen::RowVectorXd& feature_vector) const
30{
31 M_insist(feature_vector.rows() == 1 and num_features_ - 1 == feature_vector.cols());
32 /* The linear regression algorithm requires a column of only ones to properly
33 * train the y-intercept of the model. This column is added here. */
34 Eigen::RowVectorXd concat_vector(1, feature_vector.cols() + 1);
35 concat_vector << 1, feature_vector;
36 M_insist(num_features_ == concat_vector.cols());
37
38 if (bool(transformation_)) {
39 /* apply transformations */
40 concat_vector = transformation_(concat_vector);
41 }
42
43 return concat_vector * coefficients_;
44}
45
47std::ostream & m::operator<<(std::ostream &out, const LinearModel &linear_model)
48{
49 out << "LinearModel ";
50 if (bool(linear_model.transformation_)) {
51 out << "with transformations ";
52 }
53 out << "\n[\n" << linear_model.coefficients_ << "\n]\n";
54 return out;
55}
56
57void LinearModel::dump(std::ostream &out) const
58{
59 out << *this;
60 out.flush();
61}
62
63void LinearModel::dump() const { dump(std::cerr); }
#define X(Kind)
Definition: Operator.hpp:621
A model for predicting the costs of a physical operator.
Definition: LinearModel.hpp:11
unsigned num_features_
number of features this model expects pre-transformation
Definition: LinearModel.hpp:16
double predict_target(const Eigen::RowVectorXd &feature_vector) const
Definition: LinearModel.cpp:29
std::function< Eigen::MatrixXd(Eigen::MatrixXd)> transformation_
transformation that is applied on the feature matrix
Definition: LinearModel.hpp:15
LinearModel(Eigen::VectorXd coefficientVector)
Create a LinearModel instance given a coefficient vector.
Definition: LinearModel.hpp:20
Eigen::VectorXd coefficients_
vector of coefficients for every feature
Definition: LinearModel.hpp:13
void dump() const
Definition: LinearModel.cpp:63
#define M_insist(...)
Definition: macro.hpp:129
‍mutable namespace
Definition: Backend.hpp:10
Eigen::VectorXd regression_linear_closed_form(const Eigen::MatrixXd &X, const Eigen::VectorXd &y)
Use closed-form solution for linear regression.
Definition: eigen_meta.hpp:14
and
Definition: enum_ops.hpp:12
M_LCOV_EXCL_START std::ostream & operator<<(std::ostream &out, const PlanTableBase< Actual > &PT)
Definition: PlanTable.hpp:401