10 #ifndef MLPACK_CORE_KERNELS_SPHERICAL_KERNEL_HPP 11 #define MLPACK_CORE_KERNELS_SPHERICAL_KERNEL_HPP 13 #include <boost/math/special_functions/gamma.hpp> 31 bandwidthSquared(
std::pow(bandwidth, 2.0))
43 template<
typename VecTypeA,
typename VecTypeB>
44 double Evaluate(
const VecTypeA& a,
const VecTypeB& b)
const 61 template<
typename VecTypeA,
typename VecTypeB>
65 if (distance >= 2.0 * bandwidth)
69 double volumeSquared = pow(Normalizer(a.n_rows), 2.0);
74 return 1.0 / volumeSquared * (2.0 * bandwidth - distance);
76 return 1.0 / volumeSquared *
77 (2.0 * bandwidth * bandwidth * acos(distance/(2.0 * bandwidth)) -
78 distance / 4.0 * sqrt(4.0*bandwidth*bandwidth-distance*distance));
80 Log::Fatal <<
"The spherical kernel does not support convolution\ 81 integrals above dimension two, yet..." << std::endl;
85 double Normalizer(
size_t dimension)
const 87 return pow(bandwidth, (
double) dimension) * pow(M_PI, dimension / 2.0) /
88 std::tgamma(dimension / 2.0 + 1.0);
98 return (t <= bandwidth) ? 1.0 : 0.0;
100 double Gradient(
double t)
102 return t == bandwidth ? arma::datum::nan : 0.0;
106 template<
typename Archive>
109 ar(CEREAL_NVP(bandwidth));
110 ar(CEREAL_NVP(bandwidthSquared));
115 double bandwidthSquared;
124 static const bool IsNormalized =
true;
126 static const bool UsesSquaredDistance =
false;
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.
Definition: spherical_kernel.hpp:62
This is a template class that can provide information about various kernels.
Definition: kernel_traits.hpp:27
static MLPACK_EXPORT util::PrefixedOutStream Fatal
Prints fatal messages prefixed with [FATAL], then terminates the program.
Definition: log.hpp:90
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
SphericalKernel(const double bandwidth=1.0)
Construct the SphericalKernel with the given bandwidth.
Definition: spherical_kernel.hpp:29
double Evaluate(const VecTypeA &a, const VecTypeB &b) const
Evaluate the spherical kernel with the given two vectors.
Definition: spherical_kernel.hpp:44
The core includes that mlpack expects; standard C++ includes and Armadillo.
Definition: pointer_wrapper.hpp:23
double Evaluate(const double t) const
Evaluate the kernel when only a distance is given, not two points.
Definition: spherical_kernel.hpp:96
static VecTypeA::elem_type Evaluate(const VecTypeA &a, const VecTypeB &b)
Computes the distance between two points.
Definition: lmetric_impl.hpp:24
void serialize(Archive &ar, const uint32_t)
Serialize the object.
Definition: spherical_kernel.hpp:107
The spherical kernel, which is 1 when the distance between the two argument points is less than or eq...
Definition: spherical_kernel.hpp:23