const-fixing functions
[mldemos:mldemos.git] / _AlgorithmsPlugins / GP / classifierGP.h
1 /*********************************************************************\r
2 MLDemos: A User-Friendly visualization toolkit for machine learning\r
3 Copyright (C) 2010  Basilio Noris\r
4 Contact: mldemos@b4silio.com\r
5 \r
6 This library is free software; you can redistribute it and/or\r
7 modify it under the terms of the GNU Lesser General Public License,\r
8 version 3 as published by the Free Software Foundation.\r
9 \r
10 This library is distributed in the hope that it will be useful, but\r
11 WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
13 Lesser General Public License for more details.\r
14 \r
15 You should have received a copy of the GNU Lesser General Public\r
16 License along with this library; if not, write to the Free\r
17 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
18 *********************************************************************/\r
19 #ifndef _CLASSIFIER_GP_H_\r
20 #define _CLASSIFIER_GP_H_\r
21 \r
22 #include <vector>\r
23 #include <map>\r
24 #include "classifier.h"\r
25 #include "basicMath.h"\r
26 #include <mymaths.h>\r
27 #include "SECovarianceFunction.h"\r
28 #include <QDebug>\r
29 #include "newmat11/newmatap.h"\r
30 /**\r
31   GP Classifier using the Laplace approximation for the joint posterior over latent function\r
32   */\r
33 #ifndef PI\r
34 #define PI 3.14159265358979323846\r
35 #endif\r
36 \r
37 // this is an upper bound on the allowed number of training points. The code can be easily changed to accomodate data sets of arbitrary size (will do this at some point)\r
38 #define MAX_N_TRAIN 10000\r
39 // upper bound for allowed dimensionality. Can and should be removed...soon\r
40 #define MAX_DIM 100\r
41 // the maximum allowed number of iterations for the training phase.\r
42 #define MAX_TRAIN_ITERATION 1000\r
43 \r
44 \r
45 class ClassifierGP : public Classifier\r
46 {\r
47 private:\r
48     std::map<int,fvec> centers; // used as a simple examples in which we compute the distance to the center of each class\r
49     SECovarianceFunction mSECovFunc; // an object which will be responsible for computing all covariance function evaluations that we will need\r
50     ColumnVector f_mode; // This is the result of the training phase, the estimate of the mode of the joint posterior over the latent function values\r
51     Matrix K; // Covariance matrix of trainning data\r
52 \r
53     ColumnVector g_logprob_yf; // grad log p(y|f)\r
54     ColumnVector gg_logprob_yf; // grad grad log p(y|f)\r
55 \r
56     float ConvergenceObjective; // this is a vairable which is used for checking convergence in the trainig phase\r
57     int Niter; // keeps track of the number of iterations in training phase\r
58 \r
59     // these are some intermediary matrices and vectors that are used to speed up computation.\r
60     DiagonalMatrix W;\r
61     DiagonalMatrix sqrtW;\r
62     Matrix L;\r
63     Matrix Linv;\r
64     Matrix LinvXsqrtW;\r
65     SymmetricMatrix B;\r
66 \r
67 \r
68     int Ntrain; // number of tranining points\r
69     int dim; //dimensionality of training data\r
70     std::vector< fvec > training_data;\r
71     float * training_data_raw_array; // an array of floats that contains the training data in 'vector-free' form.\r
72 \r
73     bool bMonteCarlo; //a bool for determining if the class probability should be integrated numerically (bMonteCarlo = false) or using MC (bMonteCarlo = true)\r
74     int Neval; // an integer determining the number of samples/ integration steps for the evaluation of the class probability\r
75 \r
76 public:\r
77 \r
78     /**\r
79       Constructor, instanciating everything that will be used\r
80       */\r
81     ClassifierGP(){\r
82         // set up some standard values for the covariance function\r
83 \r
84         float params[2] = {0.1,0.1}; //lengthscales for the two input dimensions\r
85         mSECovFunc.SetParams(2,params,0.1,1.0);\r
86     }\r
87     /**\r
88       Deconstructor, deinstanciating everything that has been in            interfaceGPRRegress.cpp \\r
89             interfaceGPRDynamic.cpp \stanciated\r
90       */\r
91     ~ClassifierGP(){}\r
92 \r
93     /**\r
94       The training function, called by the main program, all training should go here\r
95       */\r
96     void Train(std::vector< fvec > samples, ivec labels);\r
97 \r
98     /**\r
99       Binary classification function, takes a sample, returns a real value, negative for class 0 and positive for class 1\r
100       */\r
101     float Test(const fvec &sample) const ;\r
102 \r
103 \r
104     /**\r
105       Information string for the Algorithm Information and Statistics panel in the main program interface.\r
106       Here you probably will put the number of parameters, the training time or anything else\r
107       */\r
108     const char *GetInfoString() const ;\r
109 \r
110     /**\r
111       Function to set the algorithm hyper-parameters, called prior to the training itself\r
112       */\r
113     void SetParams(double l,int method, int Ns);\r
114 };\r
115 \r
116 #endif // _CLASSIFIER_EXAMPLE_H_\r