CMP++: Uncertainty Quantification & Bayesian Calibration
Loading...
Searching...
No Matches
classifier.h
Go to the documentation of this file.
1#ifndef CLASSIFIER_H
2#define CLASSIFIER_H
3
4#include <cmp_defines.h>
5#include <list>
6#include <kernel++.h>
7#include <svm.h>
8#include <statistics.h>
9#include <optimization.h>
10#include <kde.h>
11#include <covariance.h>
12
17namespace cmp::classifier {
18
26
27
28
42 public:
43 virtual ~Classifier() = default;
44 virtual std::vector<double> predictProbabilities(const Eigen::Ref<const Eigen::VectorXd> &x) const = 0;
45 virtual size_t predict(const Eigen::Ref<const Eigen::VectorXd> &x) const = 0;
46};
47
60class KNN {
61 private:
62 std::vector<std::vector<size_t>> neighbours_;
64 size_t nPoints_;
65
66 public:
73 void compute(const std::vector<Eigen::VectorXd> &points, size_t k);
74
81 const std::vector<size_t> &operator[](size_t i) const;
82
88 size_t nPoints() const;
89
95 size_t k() const;
96};
97
98
99
120class KDE : public Classifier {
121 private:
122 Eigen::MatrixXd xObs_ = Eigen::MatrixXd(0, 0);
125
126 size_t nObs_ = 0;
127 size_t dimX_ = 0;
128 size_t nClasses_ = 1;
129
130 std::shared_ptr<cmp::kernel::Bandwidth> bandwidth_{nullptr};
131 std::shared_ptr<kernel::Kernel> kernel_{nullptr};
132
133 public:
134 KDE() {};
135
136
143 void set(std::shared_ptr<kernel::Kernel> kernel, std::shared_ptr<cmp::kernel::Bandwidth> bandwidth) {
144 kernel_ = kernel;
145 bandwidth_ = bandwidth;
146 };
147
148
157 void condition(const Eigen::Ref<const Eigen::MatrixXd> &xObs, const Eigen::Ref<const Eigen::VectorXs> &labels) {
158 xObs_ = xObs;
159 labels_ = labels;
160
161 nObs_ = xObs_.rows();
162 dimX_ = xObs_.cols();
163 nClasses_ = labels_.maxCoeff() + 1;
164
165 if(nObs_ != labels_.size()) {
166 throw std::runtime_error("KDE::set: Number of observations and labels size do not match.");
167 }
168
169 classCounts_ = Eigen::VectorXs::Zero(nClasses_);
170 for(size_t i = 0; i < nObs_; i++) {
171 classCounts_(labels_(i))++;
172 }
173 }
174
181 double density(const Eigen::Ref<const Eigen::VectorXd> &x, const size_t &classLabel) const;
182
188 std::vector<double> predictProbabilities(const Eigen::Ref<const Eigen::VectorXd> &x) const override;
189
195 size_t predict(const Eigen::Ref<const Eigen::VectorXd> &x) const override {
196 std::vector<double> probs = predictProbabilities(x);
197 return std::max_element(probs.begin(), probs.end()) - probs.begin();
198 };
199
200
208 double objectiveFunctionCV(const method& method, const cmp::statistics::KFold& kf) const;
209
214 double objectiveFunctionLOO() const;
215
230 void fit(const Eigen::Ref<const Eigen::MatrixXd>& xObs, const Eigen::Ref<const Eigen::VectorXs>& labels, cmp::statistics::KFold kf, const double& minBw, const double& maxBw, const method method = CV_PROB_SCORE, nlopt::algorithm algo = nlopt::LN_SBPLX, double ftol_rel = 1e-4, std::vector<bool> logScaleFlags = {});
231
232
244 void fitLOO(const Eigen::Ref<const Eigen::MatrixXd>& xObs, const Eigen::Ref<const Eigen::VectorXs>& labels, const double& minBw, const double& maxBw, nlopt::algorithm algo = nlopt::LN_SBPLX, double ftol_rel = 1e-4, std::vector<bool> logScaleFlags = {});
245};
246
247
248
277class SVM : public Classifier {
278 private:
279
280 struct svm_model *model_ = nullptr;
281 struct svm_problem prob_;
282
283 struct svm_parameter modelParameters_;
284 std::shared_ptr<cmp::covariance::Covariance> covariance_{nullptr};
285 Eigen::VectorXd hyperparameters_ = Eigen::VectorXd(0);
286
287 // Eigen::VectorXd to hold the original training data
288 Eigen::MatrixXd xObs_;
289 size_t nObs_ = 0;
290
296 static void silent_print(const char *s) {}
297
304 void initDefaultParameters(double C, double eps) {
305 modelParameters_ = svm_parameter();
306
307 // Use a classifier with precomputed kernel
308 modelParameters_.svm_type = C_SVC;
309 modelParameters_.kernel_type = PRECOMPUTED;
310
311 // Set the two parameters C and eps
312 modelParameters_.eps = eps;
313 modelParameters_.C = C;
314
315 // Other parameters
316 modelParameters_.weight = nullptr;
317 modelParameters_.weight_label = nullptr;
318 modelParameters_.shrinking = 1;
319 modelParameters_.probability = 1;
320 modelParameters_.nr_weight = 0;
321 modelParameters_.cache_size = 200;
322 }
323
324
325 // Helper function to free a problem pointer
326 static void freeProblem(struct svm_problem *prob) {
327 if(prob->x) {
328 for(int i = 0; i < prob->l; i++) {
329 delete[] prob->x[i];
330 }
331 delete[] prob->x;
332 prob->x = nullptr;
333 }
334 if(prob->y) {
335 delete[] prob->y;
336 prob->y = nullptr;
337 }
338 prob->l = 0;
339 }
340
341 public:
342
343 // Initialize the SVM with default parameters
344 SVM() {
345 initDefaultParameters(100, 1e-3);
346
347 // Disable LIBSVM printing by default
348 svm_set_print_string_function(&silent_print);
349 };
350
355 svm_free_and_destroy_model(&model_);
357 };
358
367 void set(std::shared_ptr<cmp::covariance::Covariance> covariance, const Eigen::Ref<const Eigen::VectorXd> hpar, const double &C, const double &eps = 1e-3) {
368 initDefaultParameters(C, eps);
369 covariance_ = covariance;
370 hyperparameters_ = hpar;
371 }
372
373
381 void condition(const Eigen::Ref<const Eigen::MatrixXd> &xObs, const Eigen::Ref<const Eigen::VectorXs> &labels);
382
383
389 size_t predict(const Eigen::Ref<const Eigen::VectorXd> &x) const override;
390
396 std::vector<double> predictProbabilities(const Eigen::Ref<const Eigen::VectorXd> &x) const override;
397
398
402 std::pair<Eigen::VectorXd, double> getHyperparameters() const {
404 }
405
406
420 void fit(const method& method, const cmp::statistics::KFold& kf, const Eigen::Ref<const Eigen::MatrixXd>& xObs, const Eigen::Ref<const Eigen::VectorXs>& membershipTable, Eigen::VectorXd lb, Eigen::VectorXd ub, nlopt::algorithm algo = nlopt::LN_SBPLX, double ftol_rel = 1e-4, std::vector<bool> logScaleFlags = {});
421
433 void fit(Eigen::Ref<const Eigen::MatrixXd> xObs, Eigen::Ref<const Eigen::VectorXs> membershipTable, Eigen::Ref<const Eigen::VectorXd> lb, Eigen::Ref<const Eigen::VectorXd> ub, nlopt::algorithm algo = nlopt::LN_SBPLX, double ftol_rel = 1e-4, std::vector<bool> logScaleFlags = {});
434
435
444
449 double objectiveFunctionSpan();
450};
451
452
467class Dummy : public Classifier {
468 private :
469 size_t nClasses_{1};
470
471 public :
478 void condition(const Eigen::Ref<const Eigen::MatrixXd> &xObs, const Eigen::Ref<const Eigen::VectorXs> &labels);
479
486 size_t predict(const Eigen::Ref<const Eigen::VectorXd> &x) const override;
487
494 std::vector<double> predictProbabilities(const Eigen::Ref<const Eigen::VectorXd> &x) const override;
495
496};
497
498} // namespace cmp::classifier
499
502#endif // CLASSIFIER_H
Abstract base class for all classifiers.
Definition classifier.h:41
virtual size_t predict(const Eigen::Ref< const Eigen::VectorXd > &x) const =0
virtual ~Classifier()=default
virtual std::vector< double > predictProbabilities(const Eigen::Ref< const Eigen::VectorXd > &x) const =0
Baseline classifier predicting class labels based on training frequency distributions.
Definition classifier.h:467
size_t nClasses_
Total number of class labels.
Definition classifier.h:469
void condition(const Eigen::Ref< const Eigen::MatrixXd > &xObs, const Eigen::Ref< const Eigen::VectorXs > &labels)
Computes the class frequencies from training labels.
Definition classifier.cpp:662
size_t predict(const Eigen::Ref< const Eigen::VectorXd > &x) const override
Predicts the class label with the highest prior frequency.
Definition classifier.cpp:669
std::vector< double > predictProbabilities(const Eigen::Ref< const Eigen::VectorXd > &x) const override
Estimates the class prior probabilities based on training frequencies.
Definition classifier.cpp:673
Classifier that uses Kernel Density Estimation (KDE) for classification.
Definition classifier.h:120
double objectiveFunctionCV(const method &method, const cmp::statistics::KFold &kf) const
Objective function for cross-validation. This function computes the objective value for cross-validat...
Definition classifier.cpp:123
size_t dimX_
Input features dimensionality.
Definition classifier.h:127
size_t nObs_
Count of observations per class.
Definition classifier.h:126
size_t nClasses_
Total number of distinct class labels.
Definition classifier.h:128
std::shared_ptr< kernel::Kernel > kernel_
Bandwidth object for KDE.
Definition classifier.h:131
KDE()
Kernel object for KDE.
Definition classifier.h:134
void fitLOO(const Eigen::Ref< const Eigen::MatrixXd > &xObs, const Eigen::Ref< const Eigen::VectorXs > &labels, const double &minBw, const double &maxBw, nlopt::algorithm algo=nlopt::LN_SBPLX, double ftol_rel=1e-4, std::vector< bool > logScaleFlags={})
Fit the KDE by maximizing an efficient leave-one-out objective. This method optimizes bandwidth using...
Definition classifier.cpp:243
Eigen::VectorXs classCounts_
Labels for the observations.
Definition classifier.h:124
Eigen::VectorXs labels_
Observations.
Definition classifier.h:123
Eigen::MatrixXd xObs_
Definition classifier.h:122
std::vector< double > predictProbabilities(const Eigen::Ref< const Eigen::VectorXd > &x) const override
Predict the class probabilities at a given point.
Definition classifier.cpp:104
void set(std::shared_ptr< kernel::Kernel > kernel, std::shared_ptr< cmp::kernel::Bandwidth > bandwidth)
Set the kernel and bandwidth for the KDE. This method allows you to set the kernel and bandwidth obje...
Definition classifier.h:143
std::shared_ptr< cmp::kernel::Bandwidth > bandwidth_
Definition classifier.h:130
void condition(const Eigen::Ref< const Eigen::MatrixXd > &xObs, const Eigen::Ref< const Eigen::VectorXs > &labels)
Condition the KDE with observations and labels. This method sets the observations and labels for the ...
Definition classifier.h:157
double objectiveFunctionLOO() const
Objective function for efficient leave-one-out optimization. This function computes mean LOO log-prob...
Definition classifier.cpp:180
void fit(const Eigen::Ref< const Eigen::MatrixXd > &xObs, const Eigen::Ref< const Eigen::VectorXs > &labels, cmp::statistics::KFold kf, const double &minBw, const double &maxBw, const method method=CV_PROB_SCORE, nlopt::algorithm algo=nlopt::LN_SBPLX, double ftol_rel=1e-4, std::vector< bool > logScaleFlags={})
Fit the KDE using cross-validation to optimize the bandwidth. This method uses the specified optimiza...
Definition classifier.cpp:217
size_t predict(const Eigen::Ref< const Eigen::VectorXd > &x) const override
Predict the class label at a given point.
Definition classifier.h:195
K-Nearest Neighbors classifier helper class.
Definition classifier.h:60
size_t nPoints() const
Returns the total number of points in the dataset.
Definition classifier.cpp:76
std::vector< std::vector< size_t > > neighbours_
Cache containing nearest neighbor indices for each data point.
Definition classifier.h:62
const std::vector< size_t > & operator[](size_t i) const
Accesses the list of nearest neighbor indices for the i-th point.
Definition classifier.cpp:72
void compute(const std::vector< Eigen::VectorXd > &points, size_t k)
Computes the nearest neighbor index map for the given points.
Definition classifier.cpp:3
size_t kNearestValue_
The number of nearest neighbors (k).
Definition classifier.h:63
size_t k() const
Returns the value of k (number of neighbors).
Definition classifier.cpp:80
size_t nPoints_
Total number of data points.
Definition classifier.h:64
Classifier that uses Support Vector Machine (SVM) for classification.
Definition classifier.h:277
struct svm_problem prob_
Pointer to the SVM model.
Definition classifier.h:281
double objectiveFunctionSpan()
Objective function for span-based optimization. This function returns the negative mean support-vecto...
Definition classifier.cpp:531
Eigen::VectorXd hyperparameters_
Covariance object for the kernel.
Definition classifier.h:285
void initDefaultParameters(double C, double eps)
Initializes default parameters for the SVM model.
Definition classifier.h:304
double objectiveFunctionCV(const method &method, const cmp::statistics::KFold &kf)
Objective function for cross-validation. This function computes the objective value for cross-validat...
Definition classifier.cpp:427
void condition(const Eigen::Ref< const Eigen::MatrixXd > &xObs, const Eigen::Ref< const Eigen::VectorXs > &labels)
Condition the SVM with observations and labels. This method sets the observations and labels for the ...
Definition classifier.cpp:274
struct svm_model * model_
Definition classifier.h:280
Eigen::MatrixXd xObs_
Hyperparameters for the covariance function.
Definition classifier.h:288
static void silent_print(const char *s)
Custom print redirect function to suppress standard console output from LIBSVM.
Definition classifier.h:296
~SVM()
Definition classifier.h:354
void fit(const method &method, const cmp::statistics::KFold &kf, const Eigen::Ref< const Eigen::MatrixXd > &xObs, const Eigen::Ref< const Eigen::VectorXs > &membershipTable, Eigen::VectorXd lb, Eigen::VectorXd ub, nlopt::algorithm algo=nlopt::LN_SBPLX, double ftol_rel=1e-4, std::vector< bool > logScaleFlags={})
Fit the SVM using cross-validation to optimize hyperparameters and C. This method uses the specified ...
Definition classifier.cpp:360
size_t predict(const Eigen::Ref< const Eigen::VectorXd > &x) const override
Predict the class label at a given point.
Definition classifier.cpp:315
SVM()
Definition classifier.h:344
size_t nObs_
Total number of training observations.
Definition classifier.h:289
std::shared_ptr< cmp::covariance::Covariance > covariance_
Structure to hold the SVM parameters.
Definition classifier.h:284
std::vector< double > predictProbabilities(const Eigen::Ref< const Eigen::VectorXd > &x) const override
Predict the class probabilities at a given point.
Definition classifier.cpp:332
std::pair< Eigen::VectorXd, double > getHyperparameters() const
Get the current hyperparameters and SVM regularization parameter C.
Definition classifier.h:402
void set(std::shared_ptr< cmp::covariance::Covariance > covariance, const Eigen::Ref< const Eigen::VectorXd > hpar, const double &C, const double &eps=1e-3)
Set the covariance function, hyperparameters, and SVM parameters. This method allows you to set the c...
Definition classifier.h:367
struct svm_parameter modelParameters_
Structure to hold the SVM problem.
Definition classifier.h:283
static void freeProblem(struct svm_problem *prob)
Definition classifier.h:326
K-Fold cross-validation partition generator.
Definition statistics.h:44
Matrix< size_t, Eigen::Dynamic, 1 > VectorXs
Definition cmp_defines.h:20
Definition classifier.h:17
method
Bandwidth selection objective criterion.
Definition classifier.h:22
@ CV_SCORE
Cross-validation score optimization based on classification accuracy.
Definition classifier.h:23
@ CV_PROB_SCORE
Cross-validation score optimization based on probability likelihood.
Definition classifier.h:24
Functor wrapper for NLopt with automatic, transparent log-scaling.
Header file for statistical functions and classes.