diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-09 13:19:48 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-09 13:20:02 +0000 |
commit | 58daab21cd043e1dc37024a7f99b396788372918 (patch) | |
tree | 96771e43bb69f7c1c2b0b4f7374cb74d7866d0cb /ml/dlib/dlib/svm/sparse_kernel.h | |
parent | Releasing debian version 1.43.2-1. (diff) | |
download | netdata-58daab21cd043e1dc37024a7f99b396788372918.tar.xz netdata-58daab21cd043e1dc37024a7f99b396788372918.zip |
Merging upstream version 1.44.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ml/dlib/dlib/svm/sparse_kernel.h')
-rw-r--r-- | ml/dlib/dlib/svm/sparse_kernel.h | 384 |
1 files changed, 384 insertions, 0 deletions
diff --git a/ml/dlib/dlib/svm/sparse_kernel.h b/ml/dlib/dlib/svm/sparse_kernel.h new file mode 100644 index 000000000..f571135ec --- /dev/null +++ b/ml/dlib/dlib/svm/sparse_kernel.h @@ -0,0 +1,384 @@ +// Copyright (C) 2009 Davis E. King (davis@dlib.net) +// License: Boost Software License See LICENSE.txt for the full license. +#ifndef DLIB_SVm_SPARSE_KERNEL +#define DLIB_SVm_SPARSE_KERNEL + +#include "sparse_kernel_abstract.h" +#include <cmath> +#include <limits> +#include "../algs.h" +#include "../serialize.h" +#include "sparse_vector.h" + + +namespace dlib +{ + +// ---------------------------------------------------------------------------------------- + + template < + typename T + > + struct sparse_radial_basis_kernel + { + typedef typename T::value_type::second_type scalar_type; + typedef T sample_type; + typedef default_memory_manager mem_manager_type; + + sparse_radial_basis_kernel(const scalar_type g) : gamma(g) {} + sparse_radial_basis_kernel() : gamma(0.1) {} + sparse_radial_basis_kernel( + const sparse_radial_basis_kernel& k + ) : gamma(k.gamma) {} + + + const scalar_type gamma; + + scalar_type operator() ( + const sample_type& a, + const sample_type& b + ) const + { + const scalar_type d = distance_squared(a,b); + return std::exp(-gamma*d); + } + + sparse_radial_basis_kernel& operator= ( + const sparse_radial_basis_kernel& k + ) + { + const_cast<scalar_type&>(gamma) = k.gamma; + return *this; + } + + bool operator== ( + const sparse_radial_basis_kernel& k + ) const + { + return gamma == k.gamma; + } + }; + + template < + typename T + > + void serialize ( + const sparse_radial_basis_kernel<T>& item, + std::ostream& out + ) + { + try + { + serialize(item.gamma, out); + } + catch (serialization_error& e) + { + throw serialization_error(e.info + "\n while serializing object of type sparse_radial_basis_kernel"); + } + } + + template < + typename T + > + void deserialize ( + sparse_radial_basis_kernel<T>& item, + std::istream& in + ) + { + typedef typename T::value_type::second_type scalar_type; + try + { + deserialize(const_cast<scalar_type&>(item.gamma), in); + } + catch (serialization_error& e) + { + throw serialization_error(e.info + "\n while deserializing object of type sparse_radial_basis_kernel"); + } + } + +// ---------------------------------------------------------------------------------------- + + template < + typename T + > + struct sparse_polynomial_kernel + { + typedef typename T::value_type::second_type scalar_type; + typedef T sample_type; + typedef default_memory_manager mem_manager_type; + + sparse_polynomial_kernel(const scalar_type g, const scalar_type c, const scalar_type d) : gamma(g), coef(c), degree(d) {} + sparse_polynomial_kernel() : gamma(1), coef(0), degree(1) {} + sparse_polynomial_kernel( + const sparse_polynomial_kernel& k + ) : gamma(k.gamma), coef(k.coef), degree(k.degree) {} + + typedef T type; + const scalar_type gamma; + const scalar_type coef; + const scalar_type degree; + + scalar_type operator() ( + const sample_type& a, + const sample_type& b + ) const + { + return std::pow(gamma*(dot(a,b)) + coef, degree); + } + + sparse_polynomial_kernel& operator= ( + const sparse_polynomial_kernel& k + ) + { + const_cast<scalar_type&>(gamma) = k.gamma; + const_cast<scalar_type&>(coef) = k.coef; + const_cast<scalar_type&>(degree) = k.degree; + return *this; + } + + bool operator== ( + const sparse_polynomial_kernel& k + ) const + { + return (gamma == k.gamma) && (coef == k.coef) && (degree == k.degree); + } + }; + + template < + typename T + > + void serialize ( + const sparse_polynomial_kernel<T>& item, + std::ostream& out + ) + { + try + { + serialize(item.gamma, out); + serialize(item.coef, out); + serialize(item.degree, out); + } + catch (serialization_error& e) + { + throw serialization_error(e.info + "\n while serializing object of type sparse_polynomial_kernel"); + } + } + + template < + typename T + > + void deserialize ( + sparse_polynomial_kernel<T>& item, + std::istream& in + ) + { + typedef typename T::value_type::second_type scalar_type; + try + { + deserialize(const_cast<scalar_type&>(item.gamma), in); + deserialize(const_cast<scalar_type&>(item.coef), in); + deserialize(const_cast<scalar_type&>(item.degree), in); + } + catch (serialization_error& e) + { + throw serialization_error(e.info + "\n while deserializing object of type sparse_polynomial_kernel"); + } + } + +// ---------------------------------------------------------------------------------------- + + template < + typename T + > + struct sparse_sigmoid_kernel + { + typedef typename T::value_type::second_type scalar_type; + typedef T sample_type; + typedef default_memory_manager mem_manager_type; + + sparse_sigmoid_kernel(const scalar_type g, const scalar_type c) : gamma(g), coef(c) {} + sparse_sigmoid_kernel() : gamma(0.1), coef(-1.0) {} + sparse_sigmoid_kernel( + const sparse_sigmoid_kernel& k + ) : gamma(k.gamma), coef(k.coef) {} + + typedef T type; + const scalar_type gamma; + const scalar_type coef; + + scalar_type operator() ( + const sample_type& a, + const sample_type& b + ) const + { + return std::tanh(gamma*(dot(a,b)) + coef); + } + + sparse_sigmoid_kernel& operator= ( + const sparse_sigmoid_kernel& k + ) + { + const_cast<scalar_type&>(gamma) = k.gamma; + const_cast<scalar_type&>(coef) = k.coef; + return *this; + } + + bool operator== ( + const sparse_sigmoid_kernel& k + ) const + { + return (gamma == k.gamma) && (coef == k.coef); + } + }; + + template < + typename T + > + void serialize ( + const sparse_sigmoid_kernel<T>& item, + std::ostream& out + ) + { + try + { + serialize(item.gamma, out); + serialize(item.coef, out); + } + catch (serialization_error& e) + { + throw serialization_error(e.info + "\n while serializing object of type sparse_sigmoid_kernel"); + } + } + + template < + typename T + > + void deserialize ( + sparse_sigmoid_kernel<T>& item, + std::istream& in + ) + { + typedef typename T::value_type::second_type scalar_type; + try + { + deserialize(const_cast<scalar_type&>(item.gamma), in); + deserialize(const_cast<scalar_type&>(item.coef), in); + } + catch (serialization_error& e) + { + throw serialization_error(e.info + "\n while deserializing object of type sparse_sigmoid_kernel"); + } + } + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct sparse_linear_kernel + { + typedef typename T::value_type::second_type scalar_type; + typedef T sample_type; + typedef default_memory_manager mem_manager_type; + + scalar_type operator() ( + const sample_type& a, + const sample_type& b + ) const + { + return dot(a,b); + } + + bool operator== ( + const sparse_linear_kernel& + ) const + { + return true; + } + }; + + template < + typename T + > + void serialize ( + const sparse_linear_kernel<T>& , + std::ostream& + ){} + + template < + typename T + > + void deserialize ( + sparse_linear_kernel<T>& , + std::istream& + ){} + +// ---------------------------------------------------------------------------------------- + + template <typename T> + struct sparse_histogram_intersection_kernel + { + typedef typename T::value_type::second_type scalar_type; + typedef T sample_type; + typedef default_memory_manager mem_manager_type; + + scalar_type operator() ( + const sample_type& a, + const sample_type& b + ) const + { + typename sample_type::const_iterator ai = a.begin(); + typename sample_type::const_iterator bi = b.begin(); + + scalar_type sum = 0; + while (ai != a.end() && bi != b.end()) + { + if (ai->first == bi->first) + { + sum += std::min(ai->second , bi->second); + ++ai; + ++bi; + } + else if (ai->first < bi->first) + { + ++ai; + } + else + { + ++bi; + } + } + + return sum; + } + + bool operator== ( + const sparse_histogram_intersection_kernel& + ) const + { + return true; + } + }; + + template < + typename T + > + void serialize ( + const sparse_histogram_intersection_kernel<T>& , + std::ostream& + ){} + + template < + typename T + > + void deserialize ( + sparse_histogram_intersection_kernel<T>& , + std::istream& + ){} + +// ---------------------------------------------------------------------------------------- + +} + +#endif // DLIB_SVm_SPARSE_KERNEL + + + |