kde_model.hpp
Go to the documentation of this file.
1 
12 #ifndef MLPACK_METHODS_KDE_MODEL_HPP
13 #define MLPACK_METHODS_KDE_MODEL_HPP
14 
15 // Include trees.
20 
21 // Include core.
22 #include <mlpack/core.hpp>
23 
24 // Remaining includes.
25 #include <boost/variant.hpp>
26 #include "kde.hpp"
27 
28 namespace mlpack {
29 namespace kde {
30 
32 template<typename KernelType,
33  template<typename TreeMetricType,
34  typename TreeStatType,
35  typename TreeMatType> class TreeType>
36 using KDEType = KDE<KernelType,
38  arma::mat,
39  TreeType,
41  kde::KDEStat,
42  arma::mat>::template DualTreeTraverser,
44  kde::KDEStat,
45  arma::mat>::template SingleTreeTraverser>;
46 
52 {
53  private:
54  // SFINAE check if Normalizer function is present.
55  HAS_MEM_FUNC(Normalizer, HasNormalizer);
56 
57  public:
59  template<typename KernelType>
60  static void ApplyNormalizer(
61  KernelType& /* kernel */,
62  const size_t /* dimension */,
63  arma::vec& /* estimations */,
64  const typename std::enable_if<
65  !HasNormalizer<KernelType, double(KernelType::*)(size_t)>::value>::
66  type* = 0)
67  { return; }
68 
70  template<typename KernelType>
71  static void ApplyNormalizer(
72  KernelType& kernel,
73  const size_t dimension,
74  arma::vec& estimations,
75  const typename std::enable_if<
76  HasNormalizer<KernelType, double(KernelType::*)(size_t)>::value>::
77  type* = 0)
78  {
79  estimations /= kernel.Normalizer(dimension);
80  }
81 };
82 
87 class DualMonoKDE : public boost::static_visitor<void>
88 {
89  private:
91  arma::vec& estimations;
92 
93  public:
95  template<typename KernelType,
96  template<typename TreeMetricType,
97  typename TreeStatType,
98  typename TreeMatType> class TreeType>
100 
102  template<typename KernelType,
103  template<typename TreeMetricType,
104  typename TreeStatType,
105  typename TreeMatType> class TreeType>
106  void operator()(KDETypeT<KernelType, TreeType>* kde) const;
107 
108  // TODO Implement specific cases where a leaf size can be selected.
109 
111  DualMonoKDE(arma::vec& estimations);
112 };
113 
118 class DualBiKDE : public boost::static_visitor<void>
119 {
120  private:
122  const size_t dimension;
123 
125  const arma::mat& querySet;
126 
128  arma::vec& estimations;
129 
130  public:
132  template<typename KernelType,
133  template<typename TreeMetricType,
134  typename TreeStatType,
135  typename TreeMatType> class TreeType>
137 
139  template<typename KernelType,
140  template<typename TreeMetricType,
141  typename TreeStatType,
142  typename TreeMatType> class TreeType>
143  void operator()(KDETypeT<KernelType, TreeType>* kde) const;
144 
145  // TODO Implement specific cases where a leaf size can be selected.
146 
148  DualBiKDE(arma::mat&& querySet, arma::vec& estimations);
149 };
150 
154 class TrainVisitor : public boost::static_visitor<void>
155 {
156  private:
158  arma::mat&& referenceSet;
159 
160  public:
162  template<typename KernelType,
163  template<typename TreeMetricType,
164  typename TreeStatType,
165  typename TreeMatType> class TreeType>
166  void operator()(KDEType<KernelType, TreeType>* kde) const;
167 
168  // TODO Implement specific cases where a leaf size can be selected.
169 
171  TrainVisitor(arma::mat&& referenceSet);
172 };
173 
177 class ModeVisitor : public boost::static_visitor<KDEMode&>
178 {
179  public:
181  template<typename KDEType>
182  KDEMode& operator()(KDEType* kde) const;
183 };
184 
185 class DeleteVisitor : public boost::static_visitor<void>
186 {
187  public:
189  template<typename KDEType>
190  void operator()(KDEType* kde) const;
191 };
192 
193 class KDEModel
194 {
195  public:
197  {
202  R_TREE
203  };
204 
206  {
211  TRIANGULAR_KERNEL
212  };
213 
214  private:
216  double bandwidth;
217 
219  double relError;
220 
222  double absError;
223 
225  KernelTypes kernelType;
226 
228  TreeTypes treeType;
229 
234  boost::variant<KDEType<kernel::GaussianKernel, tree::KDTree>*,
259 
260  public:
274  KDEModel(const double bandwidth = 1.0,
275  const double relError = 0.05,
276  const double absError = 0,
277  const KernelTypes kernelType = KernelTypes::GAUSSIAN_KERNEL,
278  const TreeTypes treeType = TreeTypes::KD_TREE);
279 
281  KDEModel(const KDEModel& other);
282 
284  KDEModel(KDEModel&& other);
285 
293  KDEModel& operator=(KDEModel other);
294 
296  ~KDEModel();
297 
299  template<typename Archive>
300  void serialize(Archive& ar, const unsigned int /* version */);
301 
303  double Bandwidth() const { return bandwidth; }
304 
306  double& Bandwidth() { return bandwidth; }
307 
309  double RelativeError() const { return relError; }
310 
312  double& RelativeError() { return relError; }
313 
315  double AbsoluteError() const { return absError; }
316 
318  double& AbsoluteError() { return absError; }
319 
321  TreeTypes TreeType() const { return treeType; }
322 
324  TreeTypes& TreeType() { return treeType; }
325 
327  KernelTypes KernelType() const { return kernelType; }
328 
330  KernelTypes& KernelType() { return kernelType; }
331 
333  KDEMode Mode() const;
334 
336  KDEMode& Mode();
337 
346  void BuildModel(arma::mat&& referenceSet);
347 
359  void Evaluate(arma::mat&& querySet, arma::vec& estimations);
360 
369  void Evaluate(arma::vec& estimations);
370 
371 
372  private:
374  void CleanMemory();
375 };
376 
377 } // namespace kde
378 } // namespace mlpack
379 
380 #include "kde_model_impl.hpp"
381 
382 #endif
KDE< KernelType, metric::EuclideanDistance, arma::mat, TreeType, TreeType< metric::EuclideanDistance, kde::KDEStat, arma::mat >::template DualTreeTraverser, TreeType< metric::EuclideanDistance, kde::KDEStat, arma::mat >::template SingleTreeTraverser > KDEType
Alias template.
Definition: kde_model.hpp:45
double Bandwidth() const
Get the bandwidth of the kernel.
Definition: kde_model.hpp:303
double RelativeError() const
Get the relative error tolerance.
Definition: kde_model.hpp:309
.hpp
Definition: add_to_po.hpp:21
KDEMode
KDEMode represents the ways in which KDE algorithm can be executed.
Definition: kde.hpp:25
DualBiKDE computes a Kernel Density Estimation on the given KDEType.
Definition: kde_model.hpp:118
KernelTypes & KernelType()
Modify the kernel type of the model.
Definition: kde_model.hpp:330
TreeTypes TreeType() const
Get the tree type of the model.
Definition: kde_model.hpp:321
ModeVisitor exposes the Mode() method of the KDEType.
Definition: kde_model.hpp:177
void CleanMemory()
Delete any unique pointers that are held by the CLI object.
The KDE class is a template class for performing Kernel Density Estimations.
Definition: kde.hpp:59
Include all of the base components required to write mlpack methods, and the main mlpack Doxygen docu...
static void ApplyNormalizer(KernelType &kernel, const size_t dimension, arma::vec &estimations, const typename std::enable_if< HasNormalizer< KernelType, double(KernelType::*)(size_t)>::value >::type *=0)
Normalize kernels that have normalizer.
Definition: kde_model.hpp:71
static void ApplyNormalizer(KernelType &, const size_t, arma::vec &, const typename std::enable_if< !HasNormalizer< KernelType, double(KernelType::*)(size_t)>::value >::type *=0)
Normalization not needed.
Definition: kde_model.hpp:60
double AbsoluteError() const
Get the absolute error tolerance.
Definition: kde_model.hpp:315
TreeTypes & TreeType()
Modify the tree type of the model.
Definition: kde_model.hpp:324
double & RelativeError()
Modify the relative error tolerance.
Definition: kde_model.hpp:312
double & AbsoluteError()
Modify the absolute error tolerance.
Definition: kde_model.hpp:318
DualMonoKDE computes a Kernel Density Estimation on the given KDEType.
Definition: kde_model.hpp:87
double & Bandwidth()
Modify the bandwidth of the kernel.
Definition: kde_model.hpp:306
TrainVisitor trains a given KDEType using a reference set.
Definition: kde_model.hpp:154
KernelNormalizer holds a set of methods to normalize estimations applying in each case the appropiate...
Definition: kde_model.hpp:51
LMetric< 2, true > EuclideanDistance
The Euclidean (L2) distance.
Definition: lmetric.hpp:112
KernelTypes KernelType() const
Get the kernel type of the model.
Definition: kde_model.hpp:327