CMP++: Uncertainty Quantification & Bayesian Calibration
Loading...
Searching...
No Matches
scaler.h
Go to the documentation of this file.
1#ifndef CMP_SCALER_H
2#define CMP_SCALER_H
3
4#include <cmp_defines.h>
5
10namespace cmp::scaler {
11
15constexpr double TOL = 1e-10;
16
31class Scaler {
32 public:
38 virtual Eigen::VectorXd transform(const Eigen::Ref<const Eigen::VectorXd> &data) const = 0;
39
45 virtual Eigen::VectorXd inverseTransform(const Eigen::Ref<const Eigen::VectorXd> &data) const = 0;
46
51 virtual Eigen::VectorXd getIntercept() const = 0;
52
57 virtual Eigen::MatrixXd getScale() const = 0;
58
63 virtual void fit(const Eigen::Ref<const Eigen::MatrixXd> &data) = 0;
64
70 virtual Eigen::MatrixXd fit_transform(const Eigen::Ref<const Eigen::MatrixXd> &data) = 0;
71};
72
90class StandardScaler : public Scaler {
91 private:
93 Eigen::VectorXd mean_;
94
96 Eigen::LLT<Eigen::MatrixXd> lltDecomposition_;
97
98 public:
100 StandardScaler() = default;
101
107 StandardScaler(const Eigen::Ref<const Eigen::VectorXd> &mean, const Eigen::Ref<const Eigen::MatrixXd> &scale) : mean_(mean), lltDecomposition_(scale) {};
108
109 StandardScaler(const StandardScaler &other) = default;
110 StandardScaler(StandardScaler &&other) = default;
111 ~StandardScaler() = default;
112 StandardScaler &operator=(const StandardScaler &other) = default;
114
115 Eigen::VectorXd transform(const Eigen::Ref<const Eigen::VectorXd> &data) const override;
116 Eigen::VectorXd inverseTransform(const Eigen::Ref<const Eigen::VectorXd> &data) const override;
117
118 Eigen::VectorXd getIntercept() const override {
119 return mean_;
120 };
121 Eigen::MatrixXd getScale() const override {
122 return lltDecomposition_.matrixL();
123 };
124
125 void fit(const Eigen::Ref<const Eigen::MatrixXd> &data) override;
126 Eigen::MatrixXd fit_transform(const Eigen::Ref<const Eigen::MatrixXd> &data) override;
127};
128
152class PCA : public Scaler {
153 private:
155 Eigen::VectorXd mean_;
156
158 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> eigenSolver_;
159
161 Eigen::MatrixXd sqrtCov_;
162
164 Eigen::MatrixXd sqrtCovInv_;
165
168
172 void eigenDecomposition();
173
174 public:
179 PCA(size_t nComponents) : nComponents_(nComponents) {};
180
181 PCA(const PCA &other) = default;
182 PCA(PCA &&other) = default;
183 ~PCA() = default;
184 PCA &operator=(const PCA &other) = default;
185 PCA &operator=(PCA &&other) = default;
186
187 Eigen::VectorXd transform(const Eigen::Ref<const Eigen::VectorXd> &data) const override;
188 Eigen::VectorXd inverseTransform(const Eigen::Ref<const Eigen::VectorXd> &data) const override;
189
190 Eigen::VectorXd getIntercept() const override {
191 return mean_;
192 };
193 Eigen::MatrixXd getScale() const override {
194 return sqrtCov_;
195 };
196
197 void fit(const Eigen::Ref<const Eigen::MatrixXd> &data) override;
198 Eigen::MatrixXd fit_transform(const Eigen::Ref<const Eigen::MatrixXd> &data) override;
199
204 void resize(size_t nComponents);
205
210 Eigen::VectorXd getEigenvalues() const {
211 return eigenSolver_.eigenvalues();
212 };
213
218 Eigen::MatrixXd getEigenvectors() const {
219 return eigenSolver_.eigenvectors();
220 };
221};
222
233class DummyScaler : public Scaler {
234 private:
236 size_t dim_;
237
238 public:
240 DummyScaler() = default;
241
242 DummyScaler(const DummyScaler &other) = default;
243 DummyScaler(DummyScaler &&other) = default;
244 ~DummyScaler() = default;
245 DummyScaler &operator=(const DummyScaler &other) = default;
246 DummyScaler &operator=(DummyScaler &&other) = default;
247
248 Eigen::VectorXd transform(const Eigen::Ref<const Eigen::VectorXd> &data) const override {
249 return data;
250 };
251 Eigen::VectorXd inverseTransform(const Eigen::Ref<const Eigen::VectorXd> &data) const override {
252 return data;
253 };
254
255 Eigen::VectorXd getIntercept() const override {
256 return Eigen::VectorXd::Zero(dim_);
257 };
258 Eigen::MatrixXd getScale() const override {
259 return Eigen::MatrixXd::Identity(dim_, dim_);
260 };
261
262 void fit(const Eigen::Ref<const Eigen::MatrixXd> &data) override {
263 dim_ = data.cols();
264 };
265 Eigen::MatrixXd fit_transform(const Eigen::Ref<const Eigen::MatrixXd> &data) override {
266 dim_ = data.cols();
267 return data;
268 };
269
274 void setDim(size_t dim) {
275 dim_ = dim;
276 };
277};
278
294class EllipticScaler : public Scaler {
295 private:
297 Eigen::VectorXd mean_;
298
300 Eigen::VectorXd std_;
301
302 public:
304 EllipticScaler() = default;
305
311 EllipticScaler(const Eigen::Ref<const Eigen::VectorXd> &mean, const Eigen::Ref<const Eigen::VectorXd> &std) : mean_(mean), std_(std) {};
312
313 EllipticScaler(const EllipticScaler &other) = default;
314 EllipticScaler(EllipticScaler &&other) = default;
315 ~EllipticScaler() = default;
316 EllipticScaler &operator=(const EllipticScaler &other) = default;
318
319 Eigen::VectorXd transform(const Eigen::Ref<const Eigen::VectorXd> &data) const override;
320 Eigen::VectorXd inverseTransform(const Eigen::Ref<const Eigen::VectorXd> &data) const override;
321
322 Eigen::VectorXd getIntercept() const override {
323 return mean_;
324 };
325 Eigen::MatrixXd getScale() const override {
326 Eigen::MatrixXd scale = Eigen::MatrixXd::Identity(mean_.size(), mean_.size());
327 for(int i = 0; i < mean_.size(); i++) {
328 scale(i, i) = std_[i];
329 }
330 return scale;
331 };
332
333 void fit(const Eigen::Ref<const Eigen::MatrixXd> &data) override;
334 Eigen::MatrixXd fit_transform(const Eigen::Ref<const Eigen::MatrixXd> &data) override;
335
340 void setMean(const Eigen::Ref<const Eigen::VectorXd> &mean) {
341 mean_ = mean;
342 };
343
348 void setStd(const Eigen::Ref<const Eigen::VectorXd> &std) {
349 std_ = std;
350 };
351};
352
367class MinMaxScaler : public Scaler {
368 private:
370 Eigen::VectorXd min_;
371
373 Eigen::VectorXd max_;
374
376 Eigen::VectorXd data_min_;
377
379 Eigen::VectorXd data_max_;
380
381 public:
383 MinMaxScaler() = default;
384
390 MinMaxScaler(const Eigen::Ref<const Eigen::VectorXd> &min, const Eigen::Ref<const Eigen::VectorXd> &max) : min_(min), max_(max) {};
391
392 MinMaxScaler(const MinMaxScaler &other) = default;
393 MinMaxScaler(MinMaxScaler &&other) = default;
394 ~MinMaxScaler() = default;
395 MinMaxScaler &operator=(const MinMaxScaler &other) = default;
397
398 Eigen::VectorXd transform(const Eigen::Ref<const Eigen::VectorXd> &data) const override;
399 Eigen::VectorXd inverseTransform(const Eigen::Ref<const Eigen::VectorXd> &data) const override;
400
405 Eigen::VectorXd getDataMin() const {
406 return data_min_;
407 };
408
413 Eigen::VectorXd getDataMax() const {
414 return data_max_;
415 };
416
417 void fit(const Eigen::Ref<const Eigen::MatrixXd> &data) override;
418 Eigen::MatrixXd fit_transform(const Eigen::Ref<const Eigen::MatrixXd> &data) override;
419
420 Eigen::VectorXd getIntercept() const override;
421 Eigen::MatrixXd getScale() const override;
422};
423}
424
427#endif // SCALER_H
A pass-through scaler that leaves input data unchanged.
Definition scaler.h:233
Eigen::VectorXd transform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Transforms the input data from physical space to the scaled latent space.
Definition scaler.h:248
void setDim(size_t dim)
Explicitly sets the data dimensionality.
Definition scaler.h:274
Eigen::VectorXd inverseTransform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Reconstructs the data from the scaled latent space back to physical space.
Definition scaler.h:251
Eigen::VectorXd getIntercept() const override
Retrieves the intercept vector used in the transformation.
Definition scaler.h:255
void fit(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Learns the scaling parameters (e.g., mean, variance) from the training data.
Definition scaler.h:262
DummyScaler & operator=(DummyScaler &&other)=default
Eigen::MatrixXd getScale() const override
Retrieves the scaling matrix used in the transformation.
Definition scaler.h:258
Eigen::MatrixXd fit_transform(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Fits the scaling parameters to the data and subsequently transforms the data.
Definition scaler.h:265
DummyScaler & operator=(const DummyScaler &other)=default
DummyScaler(DummyScaler &&other)=default
size_t dim_
The dimensionality of the data vectors.
Definition scaler.h:236
DummyScaler()=default
Default constructor.
DummyScaler(const DummyScaler &other)=default
Scaler that standardizes features independently using diagonal variance scaling.
Definition scaler.h:294
void fit(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Learns the scaling parameters (e.g., mean, variance) from the training data.
Definition scaler.cpp:139
Eigen::VectorXd inverseTransform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Reconstructs the data from the scaled latent space back to physical space.
Definition scaler.cpp:131
void setStd(const Eigen::Ref< const Eigen::VectorXd > &std)
Explicitly overrides the standard deviation parameters .
Definition scaler.h:348
EllipticScaler & operator=(const EllipticScaler &other)=default
Eigen::VectorXd getIntercept() const override
Retrieves the intercept vector used in the transformation.
Definition scaler.h:322
EllipticScaler()=default
Default constructor.
Eigen::VectorXd mean_
The empirical mean vector of the training dataset.
Definition scaler.h:297
EllipticScaler(const EllipticScaler &other)=default
Eigen::MatrixXd fit_transform(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Fits the scaling parameters to the data and subsequently transforms the data.
Definition scaler.cpp:152
EllipticScaler(const Eigen::Ref< const Eigen::VectorXd > &mean, const Eigen::Ref< const Eigen::VectorXd > &std)
Constructs an EllipticScaler with specified mean and standard deviations.
Definition scaler.h:311
void setMean(const Eigen::Ref< const Eigen::VectorXd > &mean)
Explicitly overrides the mean parameters .
Definition scaler.h:340
EllipticScaler(EllipticScaler &&other)=default
Eigen::MatrixXd getScale() const override
Retrieves the scaling matrix used in the transformation.
Definition scaler.h:325
Eigen::VectorXd transform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Transforms the input data from physical space to the scaled latent space.
Definition scaler.cpp:123
EllipticScaler & operator=(EllipticScaler &&other)=default
Eigen::VectorXd std_
The standard deviation vector for each feature.
Definition scaler.h:300
Linearly scales features to a target bounding box range.
Definition scaler.h:367
MinMaxScaler(const MinMaxScaler &other)=default
void fit(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Learns the scaling parameters (e.g., mean, variance) from the training data.
Definition scaler.cpp:189
Eigen::VectorXd inverseTransform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Reconstructs the data from the scaled latent space back to physical space.
Definition scaler.cpp:175
MinMaxScaler & operator=(MinMaxScaler &&other)=default
MinMaxScaler()=default
Default constructor.
Eigen::VectorXd transform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Transforms the input data from physical space to the scaled latent space.
Definition scaler.cpp:161
MinMaxScaler & operator=(const MinMaxScaler &other)=default
Eigen::VectorXd getDataMin() const
Retrieves the empirical minimum vector found during fitting.
Definition scaler.h:405
Eigen::VectorXd min_
Target minimum value bounding vector .
Definition scaler.h:370
Eigen::MatrixXd getScale() const override
Retrieves the scaling matrix used in the transformation.
Definition scaler.cpp:227
Eigen::VectorXd data_min_
Empirical minimum value vector observed in the training dataset.
Definition scaler.h:376
MinMaxScaler(const Eigen::Ref< const Eigen::VectorXd > &min, const Eigen::Ref< const Eigen::VectorXd > &max)
Constructs a MinMaxScaler bounded to a specific target range.
Definition scaler.h:390
Eigen::VectorXd max_
Target maximum value bounding vector .
Definition scaler.h:373
Eigen::VectorXd getIntercept() const override
Retrieves the intercept vector used in the transformation.
Definition scaler.cpp:223
Eigen::VectorXd getDataMax() const
Retrieves the empirical maximum vector found during fitting.
Definition scaler.h:413
MinMaxScaler(MinMaxScaler &&other)=default
Eigen::VectorXd data_max_
Empirical maximum value vector observed in the training dataset.
Definition scaler.h:379
Eigen::MatrixXd fit_transform(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Fits the scaling parameters to the data and subsequently transforms the data.
Definition scaler.cpp:211
Principal Component Analysis (PCA) feature scaler and dimension reducer.
Definition scaler.h:152
size_t nComponents_
The number of principal components to retain.
Definition scaler.h:167
PCA(size_t nComponents)
Constructs a PCA scaler targeting a specific latent dimensionality.
Definition scaler.h:179
PCA(const PCA &other)=default
void resize(size_t nComponents)
Resizes the number of retained principal components after fitting.
Definition scaler.cpp:117
Eigen::VectorXd getEigenvalues() const
Returns the eigenvalues of the covariance matrix.
Definition scaler.h:210
Eigen::SelfAdjointEigenSolver< Eigen::MatrixXd > eigenSolver_
Eigen solver storing the eigenvectors and eigenvalues .
Definition scaler.h:158
Eigen::VectorXd inverseTransform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Reconstructs the data from the scaled latent space back to physical space.
Definition scaler.cpp:80
void fit(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Learns the scaling parameters (e.g., mean, variance) from the training data.
Definition scaler.cpp:84
PCA & operator=(const PCA &other)=default
Eigen::MatrixXd fit_transform(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Fits the scaling parameters to the data and subsequently transforms the data.
Definition scaler.cpp:106
PCA & operator=(PCA &&other)=default
Eigen::MatrixXd sqrtCovInv_
Precomputed inverse square root of the truncated eigenvalues matrix .
Definition scaler.h:164
void eigenDecomposition()
Internal helper to execute the eigendecomposition on the current covariance matrix.
Definition scaler.cpp:45
Eigen::VectorXd getIntercept() const override
Retrieves the intercept vector used in the transformation.
Definition scaler.h:190
Eigen::MatrixXd getEigenvectors() const
Returns the eigenvectors of the covariance matrix.
Definition scaler.h:218
Eigen::VectorXd transform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Transforms the input data from physical space to the scaled latent space.
Definition scaler.cpp:75
Eigen::MatrixXd sqrtCov_
Precomputed square root of the truncated eigenvalues matrix .
Definition scaler.h:161
PCA(PCA &&other)=default
Eigen::VectorXd mean_
The empirical mean vector .
Definition scaler.h:155
Eigen::MatrixXd getScale() const override
Retrieves the scaling matrix used in the transformation.
Definition scaler.h:193
Template virtual base class for feature scaling and transformation.
Definition scaler.h:31
virtual void fit(const Eigen::Ref< const Eigen::MatrixXd > &data)=0
Learns the scaling parameters (e.g., mean, variance) from the training data.
virtual Eigen::VectorXd getIntercept() const =0
Retrieves the intercept vector used in the transformation.
virtual Eigen::VectorXd inverseTransform(const Eigen::Ref< const Eigen::VectorXd > &data) const =0
Reconstructs the data from the scaled latent space back to physical space.
virtual Eigen::MatrixXd getScale() const =0
Retrieves the scaling matrix used in the transformation.
virtual Eigen::MatrixXd fit_transform(const Eigen::Ref< const Eigen::MatrixXd > &data)=0
Fits the scaling parameters to the data and subsequently transforms the data.
virtual Eigen::VectorXd transform(const Eigen::Ref< const Eigen::VectorXd > &data) const =0
Transforms the input data from physical space to the scaled latent space.
Standardizes features by removing the mean and scaling to unit variance using Cholesky decomposition.
Definition scaler.h:90
Eigen::MatrixXd getScale() const override
Retrieves the scaling matrix used in the transformation.
Definition scaler.h:121
StandardScaler(StandardScaler &&other)=default
StandardScaler()=default
Default constructor.
Eigen::VectorXd inverseTransform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Reconstructs the data from the scaled latent space back to physical space.
Definition scaler.cpp:9
void fit(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Learns the scaling parameters (e.g., mean, variance) from the training data.
Definition scaler.cpp:13
Eigen::VectorXd transform(const Eigen::Ref< const Eigen::VectorXd > &data) const override
Transforms the input data from physical space to the scaled latent space.
Definition scaler.cpp:5
Eigen::VectorXd mean_
The empirical mean vector of the training dataset.
Definition scaler.h:93
Eigen::LLT< Eigen::MatrixXd > lltDecomposition_
The LLT (Cholesky) decomposition of the covariance matrix .
Definition scaler.h:96
StandardScaler(const StandardScaler &other)=default
StandardScaler(const Eigen::Ref< const Eigen::VectorXd > &mean, const Eigen::Ref< const Eigen::MatrixXd > &scale)
Constructs a StandardScaler with a pre-computed mean and covariance scale.
Definition scaler.h:107
StandardScaler & operator=(const StandardScaler &other)=default
Eigen::VectorXd getIntercept() const override
Retrieves the intercept vector used in the transformation.
Definition scaler.h:118
StandardScaler & operator=(StandardScaler &&other)=default
Eigen::MatrixXd fit_transform(const Eigen::Ref< const Eigen::MatrixXd > &data) override
Fits the scaling parameters to the data and subsequently transforms the data.
Definition scaler.cpp:36
Definition scaler.h:10
constexpr double TOL
Global tolerance value used for numerical stability and zero-checks.
Definition scaler.h:15