Learning Curve Plus Plus (LCPP)
paramclass.h
Go to the documentation of this file.
1 /**
2  * @file paramclass.h
3  * @author Ozgur Taylan Turan
4  *
5  * Parametric Classifiers
6  *
7  */
8 
9 #ifndef PARAMCLASS_H
10 #define PARAMCLASS_H
11 
12 namespace algo {
13 namespace classification {
14 
15 //-----------------------------------------------------------------------------
16 // Linear Discriminant Classifier
17 //-----------------------------------------------------------------------------
18 template<class T=DTYPE>
19 class LDC
20 {
21  public:
22 
23  /**
24  * Non-working model
25  */
26  LDC ( ) : lambda_(0.) { };
27 
28  /**
29  * @param lambda : regularization
30  */
31  LDC ( const size_t& num_class, const double& lambda ) : num_class_(num_class),
32  lambda_(lambda) { } ;
33 
34  /**
35  * @param inputs : X
36  * @param labels : y
37  * @param num_class : number of classes
38  */
39  LDC ( const arma::Mat<T>& inputs,
40  const arma::Row<size_t>& labels,
41  const size_t& num_class );
42 
43  /**
44  * @param inputs : X
45  * @param labels : y
46  * @param num_class : number of classes
47  * @param lambda : regularization
48  */
49  LDC ( const arma::Mat<T>& inputs,
50  const arma::Row<size_t>& labels,
51  const size_t& num_class,
52  const double& lambda );
53  /**
54  * @param inputs : X
55  * @param labels : y
56  * @param num_class : number of classes
57  * @param lambda : regularization
58  * @param priors : known priors
59  */
60  LDC ( const arma::Mat<T>& inputs,
61  const arma::Row<size_t>& labels,
62  const size_t& num_class,
63  const double& lambda,
64  const arma::Row<T>& priors );
65 
66  /**
67  * @param inputs : X
68  * @param labels : y
69  */
70  void Train ( const arma::Mat<T>& inputs,
71  const arma::Row<size_t>& labels );
72 
73  /**
74  * @param inputs : X
75  * @param labels : y
76  * @param num_class : number of classes
77  */
78  void Train ( const arma::Mat<T>& inputs,
79  const arma::Row<size_t>& labels,
80  const size_t num_class );
81 
82  /**
83  * @param inputs : X*
84  * @param labels : y*
85  */
86  void Classify ( const arma::Mat<T>& inputs,
87  arma::Row<size_t>& labels ) const;
88 
89  /**
90  * @param inputs : X*
91  * @param labels : y*
92  * @param probs : scores*
93  */
94  void Classify ( const arma::Mat<T>& inputs,
95  arma::Row<size_t>& labels,
96  arma::Mat<T>& scores ) const;
97  /**
98  * Calculate the Error Rate
99  *
100  * @param inputs : X*
101  * @param labels : y*
102  */
103  T ComputeError ( const arma::Mat<T>& points,
104  const arma::Row<size_t>& responses ) const;
105  /**
106  * Calculate the Accuracy
107  *
108  * @param inputs : X*
109  * @param labels : y*
110  *
111  */
112  T ComputeAccuracy ( const arma::Mat<T>& points,
113  const arma::Row<size_t>& responses ) const;
114 
115  /**
116  * Serialize the model.
117  */
118  template<typename Archive>
119  void serialize ( Archive& ar,
120  const unsigned int /* version */ )
121  {
122  ar (cereal::make_nvp("dim",dim_),
123  cereal::make_nvp("num_class",num_class_),
124  cereal::make_nvp("size",size_),
125  cereal::make_nvp("lambda",lambda_),
126  cereal::make_nvp("means",means_),
127  cereal::make_nvp("covs",covs_),
128  cereal::make_nvp("mean",mean_),
129  cereal::make_nvp("cov",cov_),
130  cereal::make_nvp("class",class_),
131  cereal::make_nvp("unique",unique_),
132  cereal::make_nvp("priors",priors_));
133  }
134 
135  private:
136  public:
137  size_t dim_;
138  size_t num_class_;
139  size_t size_;
140 
141  double lambda_;
142 
143  double jitter_ = 1.e-8;
144 
145  // Using maps since it easier to deal with all combinations of labels
146  std::map<size_t, arma::Row<T>> means_;
147  std::map<size_t, arma::Mat<T>> covs_;
148 
149  arma::Mat<T> cov_;
150  arma::Mat<T> mean_;
151 
152  arma::Row<size_t> unique_;
153  arma::Row<size_t> class_;
154  arma::Row<T> priors_;
155 
156 };
157 
158 //-----------------------------------------------------------------------------
159 // Quadratic Discriminant Classifier
160 //-----------------------------------------------------------------------------
161 template<class T=DTYPE>
162 class QDC
163 {
164  public:
165 
166  /**
167  * Non-working model
168  */
169  QDC ( ) : lambda_(0.) { };
170 
171  /**
172  * @param num_class : number of classes
173  * @param lambda : regularization
174  */
175  QDC ( const size_t& num_class, const double& lambda ) : num_class_(num_class),
176  lambda_(lambda) { } ;
177 
178  /**
179  * @param inputs : X
180  * @param labels : y
181  * @param num_class : number of classes
182  * @param lambda : regularization
183  */
184  QDC ( const arma::Mat<T>& inputs,
185  const arma::Row<size_t>& labels,
186  const size_t& num_class,
187  const double& lambda );
188  /**
189  * @param inputs : X
190  * @param labels : y
191  * @param num_class : number of classes
192  * @param lambda : regularization
193  * @param priors : known priors
194  */
195  QDC ( const arma::Mat<T>& inputs,
196  const arma::Row<size_t>& labels,
197  const size_t& num_class,
198  const double& lambda,
199  const arma::Row<T>& priors );
200 
201  /**
202  * @param inputs : X
203  * @param labels : y
204  * @param num_class : number of classes
205  */
206  QDC ( const arma::Mat<T>& inputs,
207  const arma::Row<size_t>& labels,
208  const size_t& num_class );
209 
210  /**
211  * @param inputs : X
212  * @param labels : y
213  */
214  void Train ( const arma::Mat<T>& inputs,
215  const arma::Row<size_t>& labels );
216 
217  /**
218  * @param inputs : X
219  * @param labels : y
220  * @param num_class : number of classes
221  */
222  void Train ( const arma::Mat<T>& inputs,
223  const arma::Row<size_t>& labels,
224  const size_t num_class );
225 
226  /**
227  * @param inputs : X*
228  * @param labels : y*
229  */
230  void Classify ( const arma::Mat<T>& inputs,
231  arma::Row<size_t>& labels ) const;
232  /**
233  * @param inputs : X*
234  * @param labels : y*
235  * @param probs : scores*
236  */
237  void Classify ( const arma::Mat<T>& inputs,
238  arma::Row<size_t>& labels,
239  arma::Mat<T>& scores ) const;
240  /**
241  * Calculate the Error Rate
242  *
243  * @param inputs : X*
244  * @param labels : y*
245  */
246  T ComputeError ( const arma::Mat<T>& points,
247  const arma::Row<size_t>& responses ) const;
248  /**
249  * Calculate the Accuracy
250  *
251  * @param inputs : X*
252  * @param labels : y*
253  *
254  */
255  T ComputeAccuracy ( const arma::Mat<T>& points,
256  const arma::Row<size_t>& responses ) const;
257 
258  /**
259  * Serialize the model.
260  */
261  template<typename Archive>
262  void serialize ( Archive& ar,
263  const unsigned int /* version */ )
264  {
265  ar ( cereal::make_nvp("dim",dim_),
266  cereal::make_nvp("num_class",num_class_),
267  cereal::make_nvp("size",size_),
268  cereal::make_nvp("lambda",lambda_),
269  cereal::make_nvp("means",means_),
270  cereal::make_nvp("covs",covs_),
271  cereal::make_nvp("icovs",icovs_),
272  cereal::make_nvp("unique",unique_),
273  cereal::make_nvp("class",class_),
274  cereal::make_nvp("priors",priors_));
275  }
276 
277  private:
278 
279  size_t dim_;
280  size_t num_class_;
281  size_t size_;
282 
283  double lambda_;
284 
285  double jitter_ = 1.e-8;
286 
287  std::map<size_t, arma::Row<T>> means_;
288  std::map<size_t, arma::Mat<T>> covs_;
289  std::map<size_t, arma::Mat<T>> icovs_;
290 
291  arma::Row<size_t> unique_;
292  arma::Row<size_t> class_;
293  arma::Row<T> priors_;
294 
295 };
296 
297 //-----------------------------------------------------------------------------
298 // Nearest Mean Classifier
299 //-----------------------------------------------------------------------------
300 template<class T=DTYPE>
301 class NMC
302 {
303  public:
304 
305  /**
306  * Non-working model
307  */
308  NMC ( ) { } ;
309 
310  /**
311  * @param num_class : number of classes
312  */
313  NMC ( const size_t& num_classes );
314 
315  /**
316  * @param inputs : X
317  * @param labels : y
318  * @param num_class : number of classes
319  */
320  NMC ( const arma::Mat<T>& inputs,
321  const arma::Row<size_t>& labels,
322  const size_t& num_class );
323 
324  // THINGS I DO FOR LOVE! (STUPID COMPILERS) //
325  /**
326  * @param inputs : X
327  * @param labels : y
328  * @param num_class : number of classes
329  * @param shrink : s
330  */
331  NMC ( const arma::Mat<T>& inputs,
332  const arma::Row<size_t>& labels,
333  const size_t& num_class,
334  const double& shrink );
335  /**
336  * @param inputs : X
337  * @param labels : y
338  */
339  void Train ( const arma::Mat<T>& inputs,
340  const arma::Row<size_t>& labels );
341  /**
342  * @param inputs : X
343  * @param labels : y
344  * @param num_class : number of classes
345  */
346  void Train ( const arma::Mat<T>& inputs,
347  const arma::Row<size_t>& labels,
348  const size_t num_class );
349 
350  /**
351  * @param inputs : X*
352  * @param labels : y*
353  */
354  void Classify ( const arma::Mat<T>& inputs,
355  arma::Row<size_t>& labels ) const;
356 
357  /**
358  * @param inputs : X*
359  * @param labels : y*
360  * @param probs : scores*
361  */
362  void Classify ( const arma::Mat<T>& inputs,
363  arma::Row<size_t>& labels,
364  arma::Mat<T>& scores ) const;
365  /**
366  * Calculate the Error Rate
367  *
368  * @param inputs : X*
369  * @param labels : y
370  */
371  T ComputeError ( const arma::Mat<T>& points,
372  const arma::Row<size_t>& responses ) const;
373  /**
374  * Calculate the Accuracy
375  *
376  * @param inputs : X*
377  * @param labels : y
378  */
379  T ComputeAccuracy ( const arma::Mat<T>& points,
380  const arma::Row<size_t>& responses ) const;
381 
382  const arma::Mat<T>& Parameters() const { return parameters_; }
383 
384  arma::Mat<T>& Parameters() { return parameters_; }
385 
386 
387  /**
388  * Serialize the model.
389  */
390  template<typename Archive>
391  void serialize ( Archive& ar,
392  const unsigned int /* version */ )
393  {
394  ar ( cereal::make_nvp("parameters",parameters_),
395  cereal::make_nvp("dim",dim_),
396  cereal::make_nvp("num_class",num_class_),
397  cereal::make_nvp("centroid",centroid_),
398  cereal::make_nvp("unique",unique_),
399  cereal::make_nvp("shrink",shrink_),
400  cereal::make_nvp("size",size_) );
401  }
402 
403  private:
404 
405  size_t dim_;
406  size_t size_;
407  double shrink_;
408  size_t num_class_;
409 
410  arma::Mat<T> centroid_;
411  arma::Mat<T> parameters_;
412 
413  arma::Row<size_t> unique_;
414 
415  mlpack::EuclideanDistance metric_;
416 
417 };
418  //---------------------------------------------------------------------------
419  // extract_class : Get all the data from one class
420  //---------------------------------------------------------------------------
421  template<class T=DTYPE>
422  std::tuple< arma::Mat<T>,
423  arma::uvec > extract_class ( const arma::Mat<T>& inputs,
424  const arma::Row<size_t>& labels,
425  const size_t& label_id )
426  {
427  arma::uvec index = arma::find(labels == label_id);
428  return std::make_tuple(inputs.cols(index), index);
429  }
430 
431  //---------------------------------------------------------------------------
432  // get_prior : Estimates prior from given labels
433  //---------------------------------------------------------------------------
434  template<class T=DTYPE>
435  arma::Row<T> get_prior ( const arma::Row<size_t>& labels,
436  const size_t& num_class )
437  {
438  auto unq = arma::regspace<arma::Row<size_t>>(0,1,num_class);
439  auto prior = arma::conv_to<arma::Row<T>>::from(arma::hist(labels, unq));
440  return prior / labels.n_cols;
441  }
442 } // namespace classification
443 } // namespace algo
444 
445 #include "paramclass_impl.h"
446 
447 #endif
448 
void Train(const arma::Mat< T > &inputs, const arma::Row< size_t > &labels)
LDC(const size_t &num_class, const double &lambda)
Definition: paramclass.h:31
void Classify(const arma::Mat< T > &inputs, arma::Row< size_t > &labels) const
T ComputeAccuracy(const arma::Mat< T > &points, const arma::Row< size_t > &responses) const
void serialize(Archive &ar, const unsigned int)
Definition: paramclass.h:119
T ComputeError(const arma::Mat< T > &points, const arma::Row< size_t > &responses) const
void serialize(Archive &ar, const unsigned int)
Definition: paramclass.h:391
void Train(const arma::Mat< T > &inputs, const arma::Row< size_t > &labels)
void Classify(const arma::Mat< T > &inputs, arma::Row< size_t > &labels) const
NMC(const size_t &num_classes)
T ComputeAccuracy(const arma::Mat< T > &points, const arma::Row< size_t > &responses) const
T ComputeError(const arma::Mat< T > &points, const arma::Row< size_t > &responses) const
QDC(const size_t &num_class, const double &lambda)
Definition: paramclass.h:175
void serialize(Archive &ar, const unsigned int)
Definition: paramclass.h:262
void Classify(const arma::Mat< T > &inputs, arma::Row< size_t > &labels) const
T ComputeError(const arma::Mat< T > &points, const arma::Row< size_t > &responses) const
void Train(const arma::Mat< T > &inputs, const arma::Row< size_t > &labels)
T ComputeAccuracy(const arma::Mat< T > &points, const arma::Row< size_t > &responses) const