mlpack
kde_model_impl.hpp
Go to the documentation of this file.
1 
12 #ifndef MLPACK_METHODS_KDE_MODEL_IMPL_HPP
13 #define MLPACK_METHODS_KDE_MODEL_IMPL_HPP
14 
15 // In case it hasn't been included yet.
16 #include "kde_model.hpp"
17 
18 namespace mlpack {
19 namespace kde {
20 
22 template<typename KernelType,
23  template<typename TreeMetricType,
24  typename TreeStatType,
25  typename TreeMatType> class TreeType>
26 void KDEWrapper<KernelType, TreeType>::Train(arma::mat&& referenceSet)
27 {
28  kde.Train(std::move(referenceSet));
29 }
30 
32 template<typename KernelType,
33  template<typename TreeMetricType,
34  typename TreeStatType,
35  typename TreeMatType> class TreeType>
36 void KDEWrapper<KernelType, TreeType>::Evaluate(arma::mat&& querySet,
37  arma::vec& estimates)
38 {
39  const size_t dimension = querySet.n_rows;
40  kde.Evaluate(std::move(querySet), estimates);
41  KernelNormalizer::ApplyNormalizer<KernelType>(kde.Kernel(),
42  dimension,
43  estimates);
44 }
45 
47 template<typename KernelType,
48  template<typename TreeMetricType,
49  typename TreeStatType,
50  typename TreeMatType> class TreeType>
51 void KDEWrapper<KernelType, TreeType>::Evaluate(arma::vec& estimates)
52 {
53  kde.Evaluate(estimates);
54  const size_t dimension = kde.ReferenceTree()->Dataset().n_rows;
55  KernelNormalizer::ApplyNormalizer<KernelType>(kde.Kernel(),
56  dimension,
57  estimates);
58 }
59 
60 template<template<typename TreeMetricType,
61  typename TreeStatType,
62  typename TreeMatType> class TreeType,
63  typename Archive>
64 void SerializationHelper(Archive& ar,
65  KDEWrapperBase* kdeModel,
66  const KDEModel::KernelTypes kernelType)
67 {
68  switch (kernelType)
69  {
70  case KDEModel::GAUSSIAN_KERNEL:
71  {
74  TreeType>&>(*kdeModel);
75  ar(CEREAL_NVP(typedModel));
76  break;
77  }
78  case KDEModel::EPANECHNIKOV_KERNEL:
79  {
82  TreeType>&>(*kdeModel);
83  ar(CEREAL_NVP(typedModel));
84  break;
85  }
86  case KDEModel::LAPLACIAN_KERNEL:
87  {
90  TreeType>&>(*kdeModel);
91  ar(CEREAL_NVP(typedModel));
92  break;
93  }
94  case KDEModel::SPHERICAL_KERNEL:
95  {
98  TreeType>&>(*kdeModel);
99  ar(CEREAL_NVP(typedModel));
100  break;
101  }
102  case KDEModel::TRIANGULAR_KERNEL:
103  {
106  TreeType>&>(*kdeModel);
107  ar(CEREAL_NVP(typedModel));
108  break;
109  }
110  }
111 }
112 
113 // Serialize the model.
114 template<typename Archive>
115 void KDEModel::serialize(Archive& ar, const uint32_t /* version */)
116 {
117  ar(CEREAL_NVP(bandwidth));
118  ar(CEREAL_NVP(relError));
119  ar(CEREAL_NVP(absError));
120  ar(CEREAL_NVP(kernelType));
121  ar(CEREAL_NVP(treeType));
122  ar(CEREAL_NVP(monteCarlo));
123  ar(CEREAL_NVP(mcProb));
124  ar(CEREAL_NVP(initialSampleSize));
125  ar(CEREAL_NVP(mcEntryCoef));
126  ar(CEREAL_NVP(mcBreakCoef));
127 
128  if (cereal::is_loading<Archive>())
129  {
130  monteCarlo = KDEDefaultParams::monteCarlo;
131  mcProb = KDEDefaultParams::mcProb;
132  initialSampleSize = KDEDefaultParams::initialSampleSize;
133  mcEntryCoef = KDEDefaultParams::mcEntryCoef;
134  mcBreakCoef = KDEDefaultParams::mcBreakCoef;
135  }
136 
137  if (cereal::is_loading<Archive>())
138  InitializeModel(); // Values will be overwritten.
139 
140  // Avoid polymorphism in serialization by serializing directly by the type.
141  switch (treeType)
142  {
143  case KD_TREE:
144  SerializationHelper<tree::KDTree>(ar, kdeModel, kernelType);
145  break;
146 
147  case BALL_TREE:
148  SerializationHelper<tree::BallTree>(ar, kdeModel, kernelType);
149  break;
150 
151  case COVER_TREE:
152  SerializationHelper<tree::StandardCoverTree>(ar, kdeModel, kernelType);
153  break;
154 
155  case OCTREE:
156  SerializationHelper<tree::Octree>(ar, kdeModel, kernelType);
157  break;
158 
159  case R_TREE:
160  SerializationHelper<tree::RTree>(ar, kdeModel, kernelType);
161  break;
162  }
163 }
164 
165 } // namespace kde
166 } // namespace mlpack
167 
168 #endif
static constexpr bool monteCarlo
Whether to use Monte Carlo estimations when possible.
Definition: kde.hpp:44
static constexpr double mcProb
Probability of a Monte Carlo estimation to be bounded by the relative error tolerance.
Definition: kde.hpp:48
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
The trivially simple triangular kernel, defined by.
Definition: triangular_kernel.hpp:30
virtual void Evaluate(arma::mat &&querySet, arma::vec &estimates)
Perform bichromatic KDE (i.e. KDE with a separate query set).
Definition: kde_model_impl.hpp:36
KDEWrapper is a wrapper class for all KDE types supported by KDEModel.
Definition: kde_model.hpp:138
static constexpr double mcEntryCoef
Monte Carlo entry coefficient.
Definition: kde.hpp:54
KDEWrapperBase is a base wrapper class for holding all KDE types supported by KDEModel.
Definition: kde_model.hpp:71
Definition: hmm_train_main.cpp:300
The Epanechnikov kernel, defined as.
Definition: epanechnikov_kernel.hpp:30
static constexpr double mcBreakCoef
Monte Carlo break coefficient.
Definition: kde.hpp:57
The spherical kernel, which is 1 when the distance between the two argument points is less than or eq...
Definition: spherical_kernel.hpp:23
The standard Laplacian kernel.
Definition: laplacian_kernel.hpp:30
void serialize(Archive &ar, const uint32_t version)
Serialize the KDE model.
Definition: kde_model_impl.hpp:115
The standard Gaussian kernel.
Definition: gaussian_kernel.hpp:34
static constexpr size_t initialSampleSize
Initial sample size for Monte Carlo estimations.
Definition: kde.hpp:51