mlpack  master
spherical_kernel.hpp
Go to the documentation of this file.
1 
10 #ifndef MLPACK_CORE_KERNELS_SPHERICAL_KERNEL_HPP
11 #define MLPACK_CORE_KERNELS_SPHERICAL_KERNEL_HPP
12 
13 #include <boost/math/special_functions/gamma.hpp>
14 #include <mlpack/prereqs.hpp>
15 
16 namespace mlpack {
17 namespace kernel {
18 
24 {
25  public:
29  SphericalKernel(const double bandwidth = 1.0) :
31  bandwidthSquared(std::pow(bandwidth, 2.0))
32  { /* Nothing to do. */ }
33 
43  template<typename VecTypeA, typename VecTypeB>
44  double Evaluate(const VecTypeA& a, const VecTypeB& b) const
45  {
46  return
48  1.0 : 0.0;
49  }
61  template<typename VecTypeA, typename VecTypeB>
62  double ConvolutionIntegral(const VecTypeA& a, const VecTypeB& b) const
63  {
64  double distance = sqrt(metric::SquaredEuclideanDistance::Evaluate(a, b));
65  if (distance >= 2.0 * bandwidth)
66  {
67  return 0.0;
68  }
69  double volumeSquared = pow(Normalizer(a.n_rows), 2.0);
70 
71  switch(a.n_rows)
72  {
73  case 1:
74  return 1.0 / volumeSquared * (2.0 * bandwidth - distance);
75  break;
76  case 2:
77  return 1.0 / volumeSquared *
78  (2.0 * bandwidth * bandwidth * acos(distance/(2.0 * bandwidth)) -
79  distance / 4.0 * sqrt(4.0*bandwidth*bandwidth-distance*distance));
80  break;
81  default:
82  Log::Fatal << "The spherical kernel does not support convolution\
83  integrals above dimension two, yet..." << std::endl;
84  return -1.0;
85  break;
86  }
87  }
88  double Normalizer(size_t dimension) const
89  {
90  return pow(bandwidth, (double) dimension) * pow(M_PI, dimension / 2.0) /
91  std::tgamma(dimension / 2.0 + 1.0);
92  }
93 
99  double Evaluate(const double t) const
100  {
101  return (t <= bandwidth) ? 1.0 : 0.0;
102  }
103  double Gradient(double t) {
104  return t == bandwidth ? arma::datum::nan : 0.0;
105  }
106 
108  template<typename Archive>
109  void Serialize(Archive& ar, const unsigned int /* version */)
110  {
111  ar & data::CreateNVP(bandwidth, "bandwidth");
112  ar & data::CreateNVP(bandwidthSquared, "bandwidthSquared");
113  }
114 
115  private:
116  double bandwidth;
118 };
119 
121 template<>
123 {
124  public:
126  static const bool IsNormalized = true;
128  static const bool UsesSquaredDistance = false;
129 };
130 
131 } // namespace kernel
132 } // namespace mlpack
133 
134 #endif
void Serialize(Archive &ar, const unsigned int)
Serialize the object.
This is a template class that can provide information about various kernels.
double Evaluate(const VecTypeA &a, const VecTypeB &b) const
Evaluate the spherical kernel with the given two vectors.
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: binarize.hpp:18
SphericalKernel(const double bandwidth=1.0)
Construct the SphericalKernel with the given bandwidth.
double ConvolutionIntegral(const VecTypeA &a, const VecTypeB &b) const
Obtains the convolution integral [integral K(||x-a||)K(||b-x||)dx] for the two vectors.
The core includes that mlpack expects; standard C++ includes and Armadillo.
FirstShim< T > CreateNVP(T &t, const std::string &name, typename std::enable_if_t< HasSerialize< T >::value > *=0)
Call this function to produce a name-value pair; this is similar to BOOST_SERIALIZATION_NVP(), but should be used for types that have a Serialize() function (or contain a type that has a Serialize() function) instead of a serialize() function.
Definition: prereqs.hpp:56
double Evaluate(const double t) const
Evaluate the kernel when only a distance is given, not two points.
#define M_PI
Definition: prereqs.hpp:40
static VecTypeA::elem_type Evaluate(const VecTypeA &a, const VecTypeB &b)
Computes the distance between two points.
double Normalizer(size_t dimension) const
static MLPACK_EXPORT util::PrefixedOutStream Fatal
Prints fatal messages prefixed with [FATAL], then terminates the program.
Definition: log.hpp:90
The spherical kernel, which is 1 when the distance between the two argument points is less than or eq...