OpenMS
SVMWrapper.h
Go to the documentation of this file.
1 // --------------------------------------------------------------------------
2 // OpenMS -- Open-Source Mass Spectrometry
3 // --------------------------------------------------------------------------
4 // Copyright The OpenMS Team -- Eberhard Karls University Tuebingen,
5 // ETH Zurich, and Freie Universitaet Berlin 2002-2023.
6 //
7 // This software is released under a three-clause BSD license:
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of any author or any participating institution
14 // may be used to endorse or promote products derived from this software
15 // without specific prior written permission.
16 // For a full list of authors, refer to the file AUTHORS.
17 // --------------------------------------------------------------------------
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL ANY OF THE AUTHORS OR THE CONTRIBUTING
22 // INSTITUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // --------------------------------------------------------------------------
31 // $Maintainer: Timo Sachsenberg $
32 // $Authors: Nico Pfeifer, Chris Bielow $
33 // --------------------------------------------------------------------------
34 
35 #pragma once
36 
37 #include <OpenMS/CONCEPT/Types.h>
40 #include <OpenMS/FORMAT/TextFile.h>
41 #include <OpenMS/SYSTEM/File.h>
43 
44 #include <string>
45 #include <vector>
46 #include <map>
47 #include <cmath>
48 
49 // forward declare svm types
50 struct svm_problem;
51 struct svm_parameter;
52 struct svm_model;
53 struct svm_node;
54 
55 namespace OpenMS
56 {
58  struct OPENMS_DLLAPI SVMData
59  {
60  std::vector<std::vector<std::pair<Int, double> > > sequences;
61  std::vector<double> labels;
62 
64 
65  SVMData(std::vector<std::vector<std::pair<Int, double> > >& seqs, std::vector<double>& lbls);
66 
67  bool operator==(const SVMData& rhs) const;
68 
69  bool store(const String& filename) const;
70 
71  bool load(const String& filename);
72 
73  };
74 
83  class OPENMS_DLLAPI SVMWrapper :
84  public ProgressLogger
85  {
86 public:
87 
95  {
99  C,
100  NU,
101  P,
105  BORDER_LENGTH
106  };
107 
110  {
111  OLIGO = 19,
112  OLIGO_COMBINED
113  };
114 
117 
119  ~SVMWrapper() override;
120 
163 
170  void setParameter(SVM_parameter_type type, double value);
171 
177  Int train(struct svm_problem* problem);
178 
184  Int train(SVMData& problem);
185 
196  void saveModel(const std::string& modelFilename) const;
197 
206  void loadModel(const std::string& modelFilename);
207 
213  void predict(struct svm_problem* problem, std::vector<double>& predicted_labels);
214 
220  void predict(const SVMData& problem, std::vector<double>& results);
221 
262 
291 
297  void createRandomPartitions(svm_problem* problem, Size number, std::vector<svm_problem*>& partitions);
298 
304  void createRandomPartitions(const SVMData& problem,
305  Size number,
306  std::vector<SVMData>& problems);
310  static svm_problem* mergePartitions(const std::vector<svm_problem*>& problems, Size except);
311 
315  static void mergePartitions(const std::vector<SVMData>& problems,
316  Size except,
317  SVMData& merged_problem);
318 
325  void predict(const std::vector<svm_node*>& vectors, std::vector<double>& predicted_rts);
326 
331  static void getLabels(svm_problem* problem, std::vector<double>& labels);
332 
337  double performCrossValidation(svm_problem* problem_ul,
338  const SVMData& problem_l,
339  const bool is_labeled,
340  const std::map<SVM_parameter_type, double>& start_values_map,
341  const std::map<SVM_parameter_type, double>& step_sizes_map,
342  const std::map<SVM_parameter_type, double>& end_values_map,
343  Size number_of_partitions,
344  Size number_of_runs,
345  std::map<SVM_parameter_type, double>& best_parameters,
346  bool additive_step_sizes = true,
347  bool output = false,
348  const String& performances_file_name = "performances.txt",
349  bool mcc_as_performance_measure = false);
350 
351 
362 
378  static double kernelOligo(const std::vector<std::pair<int, double> >& x,
379  const std::vector<std::pair<int, double> >& y,
380  const std::vector<double>& gauss_table,
381  int max_distance = -1);
382 
390  static double kernelOligo(const svm_node* x, const svm_node* y, const std::vector<double>& gauss_table, double sigma_square = 0, Size max_distance = 50);
391 
395  void getSignificanceBorders(svm_problem* data, std::pair<double, double>& borders, double confidence = 0.95, Size number_of_runs = 5, Size number_of_partitions = 5, double step_size = 0.01, Size max_iterations = 1000000);
396 
400  void getSignificanceBorders(const SVMData& data,
401  std::pair<double, double>& sigmas,
402  double confidence = 0.95,
403  Size number_of_runs = 5,
404  Size number_of_partitions = 5,
405  double step_size = 0.01,
406  Size max_iterations = 1000000);
407 
414  double getPValue(double sigma1, double sigma2, std::pair<double, double> point);
415 
425  void getDecisionValues(svm_problem* data, std::vector<double>& decision_values);
426 
433  void scaleData(svm_problem* data, Int max_scale_value = -1);
434 
435  static void calculateGaussTable(Size border_length, double sigma, std::vector<double>& gauss_table);
436 
444  svm_problem* computeKernelMatrix(svm_problem* problem1, svm_problem* problem2);
445 
453  svm_problem* computeKernelMatrix(const SVMData& problem1, const SVMData& problem2);
454 
459  void setTrainingSample(svm_problem* training_sample);
460 
464  void setTrainingSample(SVMData& training_sample);
465 
475  void getSVCProbabilities(struct svm_problem* problem, std::vector<double>& probabilities, std::vector<double>& prediction_labels);
476 
480  void setWeights(const std::vector<Int>& weight_labels, const std::vector<double>& weights);
481 
482 private:
489  bool nextGrid_(const std::vector<double>& start_values,
490  const std::vector<double>& step_sizes,
491  const std::vector<double>& end_values,
492  const bool additive_step_sizes,
493  std::vector<double>& actual_values);
494 
495  Size getNumberOfEnclosedPoints_(double m1, double m2, const std::vector<std::pair<double, double> >& points);
496 
501 
507  static void printToVoid_(const char* /*s*/);
508 
509  svm_parameter* param_;
510  svm_model* model_;
511  double sigma_;
512  std::vector<double> sigmas_;
513  std::vector<double> gauss_table_;
514  std::vector<std::vector<double> > gauss_tables_;
517  svm_problem* training_set_ = nullptr;
518  svm_problem* training_problem_ = nullptr;
521  };
522 
523 } // namespace OpenMS
524 
Definition: MathFunctions.h:408
Base class for all classes that want to report their progress.
Definition: ProgressLogger.h:53
Serves as a wrapper for the libsvm.
Definition: SVMWrapper.h:85
static void calculateGaussTable(Size border_length, double sigma, std::vector< double > &gauss_table)
void setWeights(const std::vector< Int > &weight_labels, const std::vector< double > &weights)
Sets weights for the classes in C_SVC (see libsvm documentation for further details)
void setTrainingSample(SVMData &training_sample)
This is used for being able to perform predictions with non libsvm standard kernels.
svm_problem * computeKernelMatrix(const SVMData &problem1, const SVMData &problem2)
computes the kernel matrix using the actual svm parameters and the given data
static void printToVoid_(const char *)
This function is passed to lib svm for output control.
svm_problem * computeKernelMatrix(svm_problem *problem1, svm_problem *problem2)
computes the kernel matrix using the actual svm parameters and the given data
Size border_length_
the actual kernel type
Definition: SVMWrapper.h:516
static double kernelOligo(const svm_node *x, const svm_node *y, const std::vector< double > &gauss_table, double sigma_square=0, Size max_distance=50)
calculates the oligo kernel value for the encoded sequences 'x' and 'y'
void createRandomPartitions(const SVMData &problem, Size number, std::vector< SVMData > &problems)
You can create 'number' equally sized random partitions.
static svm_problem * mergePartitions(const std::vector< svm_problem * > &problems, Size except)
You can merge partitions excluding the partition with index 'except'.
static void getLabels(svm_problem *problem, std::vector< double > &labels)
Stores the stored labels of the encoded SVM data at 'labels'.
void setParameter(SVM_parameter_type type, double value)
sets the double parameters of the svm
void loadModel(const std::string &modelFilename)
loads the model
std::vector< double > sigmas_
for the combined oligo kernel (amount of positional smearing)
Definition: SVMWrapper.h:512
Int train(struct svm_problem *problem)
trains the svm
double sigma_
for the oligo kernel (amount of positional smearing)
Definition: SVMWrapper.h:511
SVM_kernel_type
Kernel type.
Definition: SVMWrapper.h:110
void saveModel(const std::string &modelFilename) const
saves the svm model
Math::RandomShuffler shuffler_
random shuffler to create training partitions
Definition: SVMWrapper.h:520
bool nextGrid_(const std::vector< double > &start_values, const std::vector< double > &step_sizes, const std::vector< double > &end_values, const bool additive_step_sizes, std::vector< double > &actual_values)
find next grid search parameter combination
void createRandomPartitions(svm_problem *problem, Size number, std::vector< svm_problem * > &partitions)
You can create 'number' equally sized random partitions.
std::vector< std::vector< double > > gauss_tables_
lookup table for fast computation of the combined oligo kernel
Definition: SVMWrapper.h:514
Size kernel_type_
the actual kernel type
Definition: SVMWrapper.h:515
double getPValue(double sigma1, double sigma2, std::pair< double, double > point)
calculates a p-value for a given data point using the model parameters
SVM_parameter_type
Parameters for the svm to be set from outside.
Definition: SVMWrapper.h:95
@ GAMMA
the gamma parameter of the POLY, RBF and SIGMOID kernel
Definition: SVMWrapper.h:102
@ SVM_TYPE
the svm type can be NU_SVR or EPSILON_SVR
Definition: SVMWrapper.h:96
@ C
the C parameter of the svm
Definition: SVMWrapper.h:99
@ PROBABILITY
Definition: SVMWrapper.h:103
@ P
the epsilon parameter for epsilon-SVR
Definition: SVMWrapper.h:101
@ NU
the nu parameter for nu-SVR
Definition: SVMWrapper.h:100
@ DEGREE
the degree for the polynomial- kernel
Definition: SVMWrapper.h:98
@ KERNEL_TYPE
the kernel type
Definition: SVMWrapper.h:97
@ SIGMA
Definition: SVMWrapper.h:104
Size getNumberOfEnclosedPoints_(double m1, double m2, const std::vector< std::pair< double, double > > &points)
double getSVRProbability()
Returns the probability parameter sigma of the fitted Laplace model.
void getDecisionValues(svm_problem *data, std::vector< double > &decision_values)
stores the prediction values for the encoded data in 'decision_values'
Int train(SVMData &problem)
trains the svm
double performCrossValidation(svm_problem *problem_ul, const SVMData &problem_l, const bool is_labeled, const std::map< SVM_parameter_type, double > &start_values_map, const std::map< SVM_parameter_type, double > &step_sizes_map, const std::map< SVM_parameter_type, double > &end_values_map, Size number_of_partitions, Size number_of_runs, std::map< SVM_parameter_type, double > &best_parameters, bool additive_step_sizes=true, bool output=false, const String &performances_file_name="performances.txt", bool mcc_as_performance_measure=false)
Performs a CV for the data given by 'problem'.
void predict(const SVMData &problem, std::vector< double > &results)
predicts the labels using the trained model
static void mergePartitions(const std::vector< SVMData > &problems, Size except, SVMData &merged_problem)
You can merge partitions excluding the partition with index 'except'.
std::vector< double > gauss_table_
lookup table for fast computation of the oligo kernel
Definition: SVMWrapper.h:513
svm_model * model_
the learned svm discriminant
Definition: SVMWrapper.h:510
void scaleData(svm_problem *data, Int max_scale_value=-1)
Scales the data such that every column is scaled to [-1, 1].
void setTrainingSample(svm_problem *training_sample)
This is used for being able to perform predictions with non libsvm standard kernels.
void setParameter(SVM_parameter_type type, Int value)
You can set the parameters of the svm:
Int getIntParameter(SVM_parameter_type type)
You can get the actual int- parameters of the svm.
void initParameters_()
Initializes the svm with standard parameters.
void predict(const std::vector< svm_node * > &vectors, std::vector< double > &predicted_rts)
predicts the labels using the trained model
void predict(struct svm_problem *problem, std::vector< double > &predicted_labels)
predicts the labels using the trained model
~SVMWrapper() override
destructor
void getSignificanceBorders(svm_problem *data, std::pair< double, double > &borders, double confidence=0.95, Size number_of_runs=5, Size number_of_partitions=5, double step_size=0.01, Size max_iterations=1000000)
calculates the significance borders of the error model and stores them in 'sigmas'
double getDoubleParameter(SVM_parameter_type type)
You can get the actual double- parameters of the svm.
SVMData training_data_
the training set (different encoding)
Definition: SVMWrapper.h:519
void getSVCProbabilities(struct svm_problem *problem, std::vector< double > &probabilities, std::vector< double > &prediction_labels)
This function fills probabilities with the probability estimates for the first class.
static double kernelOligo(const std::vector< std::pair< int, double > > &x, const std::vector< std::pair< int, double > > &y, const std::vector< double > &gauss_table, int max_distance=-1)
returns the value of the oligo kernel for sequences 'x' and 'y'
svm_parameter * param_
the parameters for the svm
Definition: SVMWrapper.h:509
void getSignificanceBorders(const SVMData &data, std::pair< double, double > &sigmas, double confidence=0.95, Size number_of_runs=5, Size number_of_partitions=5, double step_size=0.01, Size max_iterations=1000000)
calculates the significance borders of the error model and stores them in 'sigmas'
SVMWrapper()
standard constructor
A more convenient string class.
Definition: String.h:60
int Int
Signed integer type.
Definition: Types.h:102
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:127
static String number(double d, UInt n)
Definition: StringUtils.h:217
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:48
Data structure used in SVMWrapper.
Definition: SVMWrapper.h:59
std::vector< double > labels
Definition: SVMWrapper.h:61
bool store(const String &filename) const
bool operator==(const SVMData &rhs) const
bool load(const String &filename)
std::vector< std::vector< std::pair< Int, double > > > sequences
Definition: SVMWrapper.h:60
SVMData(std::vector< std::vector< std::pair< Int, double > > > &seqs, std::vector< double > &lbls)