CMP++: Uncertainty Quantification & Bayesian Calibration
Loading...
Searching...
No Matches
gp.h
Go to the documentation of this file.
1#ifndef GP_H
2#define GP_H
3
4
5#include <distribution.h>
6#include <scaler.h>
7#include <covariance.h>
8#include <mean++.h>
9#include <prior++.h>
10#include <optimization.h>
11#include <memory>
12
17namespace cmp::gp {
18
27
35
80 private:
81
82 // Hyperparameters and prior mean and covariance functions
83 Eigen::VectorXd par_;
84 std::shared_ptr<covariance::Covariance> pKernel_;
85 std::shared_ptr<mean::Mean> pMean_;
86 double nugget_;
87
88 // Observations (the GP can own the data or point to external data, if it owns the data the pointer will point to it)
89 std::optional<Eigen::MatrixXd> xObs_;
90 std::optional<Eigen::VectorXd> yObs_;
91 std::optional<Eigen::Ref<const Eigen::MatrixXd>> pXObs_;
92 std::optional<Eigen::Ref<const Eigen::VectorXd>> pYObs_;
93
94 // Internal storage for the covariance matrix, its decomposition and related vectors (for fast query)
95 Eigen::LDLT<Eigen::MatrixXd> covDecomposition_;
96 Eigen::VectorXd alpha_;
97 Eigen::VectorXd diagCovInverse_;
98 Eigen::VectorXd residual_;
99
100 // Internal flag to check whether we normalize y or not
101 bool normalizeY_ = false;
103
104// Private members
105 private:
106 void compute(const Eigen::Ref<const Eigen::VectorXd> &par);
107
108 public:
109
110 // Default constructor and destructor
112 ~GaussianProcess() = default;
113
114 // Constructor with parameters
115 GaussianProcess(const std::shared_ptr<covariance::Covariance> &kernel, const std::shared_ptr<mean::Mean> &mean, Eigen::Ref<const Eigen::VectorXd> params, double nugget = 1e-8);
116
117 // Copy constructors and operators
118 GaussianProcess(const GaussianProcess &other);
120 GaussianProcess(GaussianProcess &&other) noexcept;
121 GaussianProcess &operator=(GaussianProcess &&other) noexcept;
122
132 void set(const std::shared_ptr<covariance::Covariance> &kernel, const std::shared_ptr<mean::Mean> &mean, Eigen::Ref<const Eigen::VectorXd> params, double nugget = 1e-8);
133
144 void condition(const Eigen::Ref<const Eigen::MatrixXd> &xObs, const Eigen::Ref<const Eigen::VectorXd> &yObs, bool copyData = true, bool normalizeY = false);
145
162 void fit(const Eigen::Ref<const Eigen::MatrixXd> &xObs, const Eigen::Ref<const Eigen::VectorXd> &yObs, const Eigen::Ref<const Eigen::VectorXd> &lb, const Eigen::Ref<const Eigen::VectorXd> &ub, const method &method, const nlopt::algorithm &alg, const double &tol_rel, bool copyData = true, bool normalizeY = false, const std::shared_ptr<cmp::prior::Prior> &prior = cmp::prior::Uniform::make(), const std::vector<bool> &logScale = {});
163
168 Eigen::VectorXd getParameters() const {
169 return par_;
170 }
171
176 std::shared_ptr<cmp::mean::Mean> getMean() const {
177 return this->pMean_;
178 }
179
184 std::shared_ptr<cmp::covariance::Covariance> getKernel() const {
185 return this->pKernel_;
186 }
187
192 double getNugget() const {
193 return this->nugget_;
194 }
195
205 Eigen::MatrixXd covariance(Eigen::Ref<const Eigen::VectorXd> par) const;
206
212 Eigen::MatrixXd covarianceGradient(Eigen::Ref<const Eigen::VectorXd> par, const int &i) const;
213
220 Eigen::MatrixXd covarianceHessian(Eigen::Ref<const Eigen::VectorXd> par, const size_t &i, const size_t &j) const;
221
222 const Eigen::LDLT<Eigen::MatrixXd> &getCovDecomposition() const {
223 return covDecomposition_;
224 }
225
226 const Eigen::VectorXd &getAlpha() const {
227 return alpha_;
228 }
229
230 const Eigen::VectorXd &getDiagCovInverse() const {
231 return diagCovInverse_;
232 }
233
234 const Eigen::VectorXd &getResidualVector() const {
235 return residual_;
236 }
237
238 const Eigen::Ref<const Eigen::MatrixXd> &getXObs() const {
239 return pXObs_.value();
240 }
241
242 const Eigen::Ref<const Eigen::VectorXd> &getYObs() const {
243 return pYObs_.value();
244 }
245
250 size_t nObs() const {
251 if(!pXObs_.has_value()) {
252 return 0;
253 }
254 return static_cast<size_t>(pXObs_->rows());
255 }
265 Eigen::VectorXd priorMean(Eigen::Ref<const Eigen::VectorXd> par) const;
266
273 Eigen::VectorXd priorMeanGradient(Eigen::Ref<const Eigen::VectorXd> par, const int &i) const;
274
280 Eigen::VectorXd residual(Eigen::Ref<const Eigen::VectorXd> par) const;
281
294 std::pair<double, double> predict(const Eigen::Ref<const Eigen::VectorXd> &x, type predictionType = type::POSTERIOR) const;
295
304 double predictMean(const Eigen::Ref<const Eigen::VectorXd> &x, type predictionType = type::POSTERIOR) const;
305
312 std::pair<Eigen::VectorXd, Eigen::MatrixXd> predictMultiple(const Eigen::Ref<const Eigen::MatrixXd> &x_pts, type predictionType = type::POSTERIOR) const;
313
321 Eigen::VectorXd predictMeanMultiple(const Eigen::Ref<const Eigen::MatrixXd> &x_pts, type predictionType = type::POSTERIOR) const;
322
323
330 std::pair<double, double> predictLOO(const size_t &i) const;
331
341 double logLikelihood() const;
342
348 double logLikelihoodLOO(const size_t &i) const;
349
354 Eigen::MatrixXd expectedVarianceImprovement(const Eigen::Ref<const Eigen::MatrixXd> &x_pts,
355 const Eigen::Ref<const Eigen::MatrixXd> &x_pending,
356 double nu) const;
357
362 double objectiveFunction(const Eigen::Ref<const Eigen::VectorXd> &x, Eigen::Ref<Eigen::VectorXd> grad, const std::shared_ptr<cmp::prior::Prior> &prior);
363
364 double objectiveFunctionLOO(const Eigen::Ref<const Eigen::VectorXd> &x, Eigen::Ref<Eigen::VectorXd> grad, const std::shared_ptr<cmp::prior::Prior> &prior);
365
366 double objectiveFunctionLOOMSE(const Eigen::Ref<const Eigen::VectorXd> &x, Eigen::Ref<Eigen::VectorXd> grad, const std::shared_ptr<cmp::prior::Prior> &prior);
367};
368}
371#endif // MACRO
This class implements a Gaussian Process (GP) regression model for non-parametric Bayesian regression...
Definition gp.h:79
std::optional< Eigen::VectorXd > yObs_
Owning storage for training target vector.
Definition gp.h:90
Eigen::VectorXd residual_
Residuals of the mean function: y - m(x).
Definition gp.h:98
double predictMean(const Eigen::Ref< const Eigen::VectorXd > &x, type predictionType=type::POSTERIOR) const
Compute the predictive mean at a new point.
Definition gp.cpp:389
const Eigen::Ref< const Eigen::MatrixXd > & getXObs() const
Definition gp.h:238
Eigen::VectorXd diagCovInverse_
Diagonal elements of the inverse covariance matrix.
Definition gp.h:97
std::pair< Eigen::VectorXd, Eigen::MatrixXd > predictMultiple(const Eigen::Ref< const Eigen::MatrixXd > &x_pts, type predictionType=type::POSTERIOR) const
Compute the predictive variance at a new set of points.
Definition gp.cpp:416
Eigen::VectorXd priorMean(Eigen::Ref< const Eigen::VectorXd > par) const
Evaluates the mean on the observations.
Definition gp.cpp:257
std::shared_ptr< cmp::mean::Mean > getMean() const
Gets the shared pointer to the GP prior mean function.
Definition gp.h:176
double nugget_
Observation noise variance (nugget).
Definition gp.h:86
const Eigen::Ref< const Eigen::VectorXd > & getYObs() const
Definition gp.h:242
std::pair< double, double > predict(const Eigen::Ref< const Eigen::VectorXd > &x, type predictionType=type::POSTERIOR) const
Compute the predictive mean and variance at a new point.
Definition gp.cpp:350
std::optional< Eigen::Ref< const Eigen::VectorXd > > pYObs_
Reference wrapper to training target vector.
Definition gp.h:92
std::optional< Eigen::MatrixXd > xObs_
Owning storage for training input matrix.
Definition gp.h:89
void compute(const Eigen::Ref< const Eigen::VectorXd > &par)
Definition gp.cpp:5
GaussianProcess & operator=(const GaussianProcess &other)
Definition gp.cpp:55
double logLikelihoodLOO(const size_t &i) const
Compute the leave-one-out log-likelihood of the observations given the hyperparameters.
Definition gp.cpp:570
const Eigen::VectorXd & getDiagCovInverse() const
Definition gp.h:230
std::pair< double, double > predictLOO(const size_t &i) const
Compute the leave-one-out predictive mean and variance at the i-th observation point.
Definition gp.cpp:546
std::shared_ptr< mean::Mean > pMean_
Prior mean function.
Definition gp.h:85
std::shared_ptr< covariance::Covariance > pKernel_
Covariance kernel function.
Definition gp.h:84
Eigen::MatrixXd covarianceHessian(Eigen::Ref< const Eigen::VectorXd > par, const size_t &i, const size_t &j) const
Definition gp.cpp:230
Eigen::VectorXd par_
Model hyperparameters.
Definition gp.h:83
Eigen::VectorXd residual(Eigen::Ref< const Eigen::VectorXd > par) const
Evaluate the difference between the observation and the mean function.
Definition gp.cpp:276
double getNugget() const
Gets the observation noise variance (nugget).
Definition gp.h:192
void set(const std::shared_ptr< covariance::Covariance > &kernel, const std::shared_ptr< mean::Mean > &mean, Eigen::Ref< const Eigen::VectorXd > params, double nugget=1e-8)
Definition gp.cpp:109
std::optional< Eigen::Ref< const Eigen::MatrixXd > > pXObs_
Reference wrapper to training input matrix.
Definition gp.h:91
const Eigen::LDLT< Eigen::MatrixXd > & getCovDecomposition() const
Definition gp.h:222
const Eigen::VectorXd & getAlpha() const
Definition gp.h:226
cmp::scaler::StandardScaler yScaler_
Scaler used to normalize the target vector.
Definition gp.h:102
double logLikelihood() const
Compute the log-likelihood of the observations given the hyperparameters.
Definition gp.cpp:564
bool normalizeY_
Flag indicating whether target normalization is active.
Definition gp.h:101
void fit(const Eigen::Ref< const Eigen::MatrixXd > &xObs, const Eigen::Ref< const Eigen::VectorXd > &yObs, const Eigen::Ref< const Eigen::VectorXd > &lb, const Eigen::Ref< const Eigen::VectorXd > &ub, const method &method, const nlopt::algorithm &alg, const double &tol_rel, bool copyData=true, bool normalizeY=false, const std::shared_ptr< cmp::prior::Prior > &prior=cmp::prior::Uniform::make(), const std::vector< bool > &logScale={})
Fit the Gaussian Process to the observations.
Definition gp.cpp:289
std::shared_ptr< cmp::covariance::Covariance > getKernel() const
Gets the shared pointer to the GP covariance kernel.
Definition gp.h:184
Eigen::VectorXd priorMeanGradient(Eigen::Ref< const Eigen::VectorXd > par, const int &i) const
Evaluate the gradient of the mean function.
Definition gp.cpp:267
const Eigen::VectorXd & getResidualVector() const
Definition gp.h:234
Eigen::VectorXd predictMeanMultiple(const Eigen::Ref< const Eigen::MatrixXd > &x_pts, type predictionType=type::POSTERIOR) const
Compute the predictive mean at a new set of points.
Definition gp.cpp:498
Eigen::MatrixXd covarianceGradient(Eigen::Ref< const Eigen::VectorXd > par, const int &i) const
Definition gp.cpp:207
void condition(const Eigen::Ref< const Eigen::MatrixXd > &xObs, const Eigen::Ref< const Eigen::VectorXd > &yObs, bool copyData=true, bool normalizeY=false)
Condition the GP on a set of observations (allow predictive posterior computation)
Definition gp.cpp:139
size_t nObs() const
Returns the number of training observations.
Definition gp.h:250
GaussianProcess()
Definition gp.cpp:26
double objectiveFunctionLOO(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::VectorXd > grad, const std::shared_ptr< cmp::prior::Prior > &prior)
Definition gp.cpp:730
Eigen::VectorXd getParameters() const
Get the hyperparameters of the Gaussian Process.
Definition gp.h:168
Eigen::MatrixXd expectedVarianceImprovement(const Eigen::Ref< const Eigen::MatrixXd > &x_pts, const Eigen::Ref< const Eigen::MatrixXd > &x_pending, double nu) const
Definition gp.cpp:587
Eigen::LDLT< Eigen::MatrixXd > covDecomposition_
LDLT decomposition of the training covariance matrix.
Definition gp.h:95
double objectiveFunction(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::VectorXd > grad, const std::shared_ptr< cmp::prior::Prior > &prior)
Definition gp.cpp:692
double objectiveFunctionLOOMSE(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::VectorXd > grad, const std::shared_ptr< cmp::prior::Prior > &prior)
Definition gp.cpp:819
Eigen::VectorXd alpha_
GP weights vector: alpha = (K + s^2 I)^-1 (y - m).
Definition gp.h:96
static std::shared_ptr< Prior > make()
Definition prior++.h:114
Standardizes features by removing the mean and scaling to unit variance using Cholesky decomposition.
Definition scaler.h:90
Definition gp.h:17
type
GP evaluation type.
Definition gp.h:31
@ PRIOR
Prior GP response (before conditioning on training data)
Definition gp.h:32
@ POSTERIOR
Posterior GP response (conditioned on training data)
Definition gp.h:33
method
Optimization method for GP hyperparameters.
Definition gp.h:22
@ LOO
Leave-One-Out cross-validation predictive probability optimization.
Definition gp.h:24
@ LOO_MSE
Leave-One-Out Mean Squared Error minimization.
Definition gp.h:25
@ MLE
Maximum Likelihood Estimation (maximizing marginal likelihood)
Definition gp.h:23
Functor wrapper for NLopt with automatic, transparent log-scaling.