summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/svm/empirical_kernel_map_abstract.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/svm/empirical_kernel_map_abstract.h')
-rw-r--r--ml/dlib/dlib/svm/empirical_kernel_map_abstract.h430
1 files changed, 0 insertions, 430 deletions
diff --git a/ml/dlib/dlib/svm/empirical_kernel_map_abstract.h b/ml/dlib/dlib/svm/empirical_kernel_map_abstract.h
deleted file mode 100644
index 8fc413447..000000000
--- a/ml/dlib/dlib/svm/empirical_kernel_map_abstract.h
+++ /dev/null
@@ -1,430 +0,0 @@
-// Copyright (C) 2009 Davis E. King (davis@dlib.net)
-// License: Boost Software License See LICENSE.txt for the full license.
-#undef DLIB_EMPIRICAL_KERNEl_MAP_ABSTRACT_H_
-#ifdef DLIB_EMPIRICAL_KERNEl_MAP_ABSTRACT_H_
-
-#include <vector>
-#include "../matrix.h"
-#include "kernel_abstract.h"
-#include "function_abstract.h"
-#include "linearly_independent_subset_finder_abstract.h"
-#include <vector>
-
-namespace dlib
-{
-
-// ----------------------------------------------------------------------------------------
-
- template <
- typename kernel_type,
- typename EXP
- >
- const decision_function<kernel_type> convert_to_decision_function (
- const projection_function<kernel_type>& project_funct,
- const matrix_exp<EXP>& vect
- );
- /*!
- requires
- - is_vector(vect) == true
- - vect.size() == project_funct.out_vector_size()
- - project_funct.out_vector_size() > 0
- - project_funct.weights.nc() == project_funct.basis_vectors.size()
- ensures
- - This function interprets the given vector as a point in the kernel feature space defined
- by the given projection function. The return value of this function is a decision
- function, DF, that represents the given vector in the following sense:
- - for all possible sample_type objects, S, it is the case that DF(S) == dot(project_funct(S), vect)
- (i.e. the returned decision function computes dot products, in kernel feature space,
- between vect and any argument you give it. Note also that this equality is exact, even
- for sample_type objects not in the span of the basis_vectors.)
- - DF.kernel_function == project_funct.kernel_function
- - DF.b == 0
- - DF.basis_vectors == project_funct.basis_vectors.
- !*/
-
-// ----------------------------------------------------------------------------------------
-
- template <
- typename kern_type
- >
- class empirical_kernel_map
- {
- /*!
- REQUIREMENTS ON kern_type
- - must be a kernel function object as defined in dlib/svm/kernel_abstract.h
-
- INITIAL VALUE
- - out_vector_size() == 0
- - basis_size() == 0
-
- WHAT THIS OBJECT REPRESENTS
- This object represents a map from objects of sample_type (the kind of object
- a kernel function operates on) to finite dimensional column vectors which
- represent points in the kernel feature space defined by whatever kernel
- is used with this object.
-
- To use the empirical_kernel_map you supply it with a particular kernel and a set of
- basis samples. After that you can present it with new samples and it will project
- them into the part of kernel feature space spanned by your basis samples.
-
- This means the empirical_kernel_map is a tool you can use to very easily kernelize
- any algorithm that operates on column vectors. All you have to do is select a
- set of basis samples and then use the empirical_kernel_map to project all your
- data points into the part of kernel feature space spanned by those basis samples.
- Then just run your normal algorithm on the output vectors and it will be effectively
- kernelized.
-
- Regarding methods to select a set of basis samples, if you are working with only a
- few thousand samples then you can just use all of them as basis samples.
- Alternatively, the linearly_independent_subset_finder often works well for
- selecting a basis set. I also find that picking a random subset typically works
- well.
-
-
- The empirical kernel map is something that has been around in the kernel methods
- literature for a long time but is seemingly not well known. Anyway, one of the
- best books on the subject is the following:
- Learning with Kernels: Support Vector Machines, Regularization, Optimization,
- and Beyond by Bernhard Schlkopf, Alexander J. Smola
- The authors discuss the empirical kernel map as well as many other interesting
- topics.
- !*/
-
- public:
-
- typedef kern_type kernel_type;
- typedef typename kernel_type::sample_type sample_type;
- typedef typename kernel_type::scalar_type scalar_type;
- typedef typename kernel_type::mem_manager_type mem_manager_type;
-
- struct empirical_kernel_map_error : public error;
- /*!
- This is an exception class used to indicate a failure to create a
- kernel map from data given by the user.
- !*/
-
- empirical_kernel_map (
- );
- /*!
- ensures
- - this object is properly initialized
- !*/
-
- void clear (
- );
- /*!
- ensures
- - this object has its initial value
- !*/
-
- template <typename T>
- void load(
- const kernel_type& kernel,
- const T& basis_samples
- );
- /*!
- requires
- - T must be a dlib::matrix type or something convertible to a matrix via mat()
- (e.g. a std::vector)
- - is_vector(basis_samples) == true
- - basis_samples.size() > 0
- - kernel must be capable of operating on the elements of basis_samples. That is,
- expressions such as kernel(basis_samples(0), basis_samples(0)) should make sense.
- ensures
- - 0 < #out_vector_size() <= basis_samples.size()
- - #basis_size() == basis_samples.size()
- - #get_kernel() == kernel
- - This function constructs a map between normal sample_type objects and the
- subspace of the kernel feature space defined by the given kernel and the
- given set of basis samples. So after this function has been called you
- will be able to project sample_type objects into kernel feature space
- and obtain the resulting vector as a regular column matrix.
- - The basis samples are loaded into this object in the order in which they
- are stored in basis_samples. That is:
- - for all valid i: (*this)[i] == basis_samples(i)
- throws
- - empirical_kernel_map_error
- This exception is thrown if we are unable to create a kernel map.
- If this happens then this object will revert back to its initial value.
- !*/
-
- void load(
- const linearly_independent_subset_finder<kernel_type>& lisf
- );
- /*!
- ensures
- - #out_vector_size() == lisf.dictionary_size()
- - #basis_size() == lisf.dictionary_size()
- - #get_kernel() == lisf.get_kernel()
- - Uses the dictionary vectors from lisf as a basis set. Thus, this function
- constructs a map between normal sample_type objects and the subspace of
- the kernel feature space defined by the given kernel and the given set
- of basis samples. So after this function has been called you will be
- able to project sample_type objects into kernel feature space and obtain
- the resulting vector as a regular column matrix.
- - The basis samples are loaded into this object in the order in which they
- are stored in lisf. That is:
- - for all valid i: (*this)[i] == lisf[i]
- throws
- - empirical_kernel_map_error
- This exception is thrown if we are unable to create a kernel map.
- E.g. if the lisf.size() == 0.
- If this happens then this object will revert back to its initial value.
- !*/
-
- const kernel_type get_kernel (
- ) const;
- /*!
- requires
- - out_vector_size() != 0
- ensures
- - returns a copy of the kernel used by this object
- !*/
-
- long out_vector_size (
- ) const;
- /*!
- ensures
- - if (this object has been loaded with basis samples) then
- - returns the dimensionality of the vectors output by the project() function.
- - else
- - returns 0
- !*/
-
- unsigned long basis_size (
- ) const;
- /*!
- ensures
- - returns the number of basis vectors in projection_functions created
- by this object. This is also equal to the number of basis vectors
- given to the load() function.
- !*/
-
- const sample_type& operator[] (
- unsigned long idx
- ) const;
- /*!
- requires
- - idx < basis_size()
- ensures
- - returns a const reference to the idx'th basis vector contained inside
- this object.
- !*/
-
- const matrix<scalar_type,0,1,mem_manager_type>& project (
- const sample_type& sample
- ) const;
- /*!
- requires
- - out_vector_size() != 0
- ensures
- - takes the given sample and projects it into the kernel feature space
- of out_vector_size() dimensions defined by this kernel map and
- returns the resulting vector.
- - in more precise terms, this function returns a vector such that:
- - The returned vector will contain out_vector_size() elements.
- - for any sample_type object S, the following equality is approximately true:
- - get_kernel()(sample,S) == dot(project(sample), project(S)).
- - The approximation error in the above equality will be zero (within rounding error)
- if both sample_type objects involved are within the span of the set of basis
- samples given to the load() function. If they are not then there will be some
- approximation error. Note that all the basis samples are always within their
- own span. So the equality is always exact for the samples given to the load()
- function.
- !*/
-
- const matrix<scalar_type,0,1,mem_manager_type>& project (
- const sample_type& samp,
- scalar_type& projection_error
- ) const;
- /*!
- requires
- - out_vector_size() != 0
- ensures
- - This function returns project(samp)
- (i.e. it returns the same thing as the above project() function)
- - #projection_error == the square of the distance between the point samp
- gets projected onto and samp's true image in kernel feature space.
- That is, this value is equal to:
- pow(convert_to_distance_function(project(samp))(samp),2)
- !*/
-
- template <typename EXP>
- const decision_function<kernel_type> convert_to_decision_function (
- const matrix_exp<EXP>& vect
- ) const;
- /*!
- requires
- - is_vector(vect) == true
- - vect.size() == out_vector_size()
- - out_vector_size() != 0
- ensures
- - This function interprets the given vector as a point in the kernel feature space defined
- by this empirical_kernel_map. The return value of this function is a decision
- function, DF, that represents the given vector in the following sense:
- - for all possible sample_type objects, S, it is the case that DF(S) == dot(project(S), vect)
- (i.e. the returned decision function computes dot products, in kernel feature space,
- between vect and any argument you give it. Note also that this equality is exact, even
- for sample_type objects not in the span of the basis samples.)
- - DF.kernel_function == get_kernel()
- - DF.b == 0
- - DF.basis_vectors == these will be the basis samples given to the previous call to load(). Note
- that it is possible for there to be fewer basis_vectors than basis samples given to load().
- - DF.basis_vectors.size() == basis_size()
- !*/
-
- template <typename EXP>
- const distance_function<kernel_type> convert_to_distance_function (
- const matrix_exp<EXP>& vect
- ) const
- /*!
- requires
- - is_vector(vect) == true
- - vect.size() == out_vector_size()
- - out_vector_size() != 0
- ensures
- - This function interprets the given vector as a point in the kernel feature space defined
- by this empirical_kernel_map. The return value of this function is a distance
- function, DF, that represents the given vector in the following sense:
- - for any sample_type object S, the following equality is approximately true:
- - DF(S) == length(project(S) - vect)
- (i.e. the returned distance function computes distances, in kernel feature space,
- between vect and any argument you give it. )
- - The approximation error in the above equality will be zero (within rounding error)
- if S is within the span of the set of basis samples given to the load() function.
- If it is not then there will be some approximation error. Note that all the basis
- samples are always within their own span. So the equality is always exact for the
- samples given to the load() function. Note further that the distance computed
- by DF(S) is always the correct distance in kernel feature space between vect and
- the true projection of S. That is, the above equality is approximate only because
- of potential error in the project() function, not in DF(S).
- - DF.kernel_function == get_kernel()
- - DF.b == dot(vect,vect)
- - DF.basis_vectors == these will be the basis samples given to the previous call to load(). Note
- that it is possible for there to be fewer basis_vectors than basis samples given to load().
- - DF.basis_vectors.size() == basis_size()
- !*/
-
- const projection_function<kernel_type> get_projection_function (
- ) const;
- /*!
- requires
- - out_vector_size() != 0
- ensures
- - returns a projection_function, PF, that computes the same projection as project().
- That is, calling PF() on any sample will produce the same output vector as calling
- this->project() on that sample.
- - PF.basis_vectors.size() == basis_size()
- !*/
-
- const matrix<scalar_type,0,0,mem_manager_type> get_transformation_to (
- const empirical_kernel_map& target
- ) const;
- /*!
- requires
- - get_kernel() == target.get_kernel()
- - out_vector_size() != 0
- - target.out_vector_size() != 0
- ensures
- - A point in the kernel feature space defined by the kernel get_kernel() typically
- has different representations with respect to different empirical_kernel_maps.
- This function lets you obtain a transformation matrix that will allow you
- to project between these different representations. That is, this function returns
- a matrix M with the following properties:
- - M maps vectors represented according to *this into the representation used by target.
- - M.nr() == target.out_vector_size()
- - M.nc() == this->out_vector_size()
- - Let V be a vector of this->out_vector_size() length. Then define two distance_functions
- DF1 = this->convert_to_distance_function(V)
- DF2 = target.convert_to_distance_function(M*V)
-
- Then DF1(DF2) == 0 // i.e. the distance between these two points should be 0
-
- That is, DF1 and DF2 both represent the same point in kernel feature space. Note
- that the above equality is only approximate. If the vector V represents a point in
- kernel space that isn't in the span of the basis samples used by target then the
- equality is approximate. However, if it is in their span then the equality will
- be exact. For example, if target's basis samples are a superset of the basis samples
- used by *this then the equality will always be exact (within rounding error).
- !*/
-
- void get_transformation_to (
- const empirical_kernel_map& target,
- matrix<scalar_type, 0, 0, mem_manager_type>& tmat,
- projection_function<kernel_type>& partial_projection
- ) const;
- /*!
- requires
- - get_kernel() == target.get_kernel()
- - out_vector_size() != 0
- - target.out_vector_size() != 0
- - basis_size() < target.basis_size()
- - for all i < basis_size(): (*this)[i] == target[i]
- i.e. target must contain a superset of the basis vectors contained in *this. Moreover,
- it must contain them in the same order.
- ensures
- - The single argument version of get_transformation_to() allows you to project
- vectors from one empirical_kernel_map representation to another. This version
- provides a somewhat different capability. Assuming target's basis vectors form a
- superset of *this's basis vectors then this form of get_transformation_to() allows
- you to reuse a vector from *this ekm to speed up the projection performed by target.
- The defining relation is given below.
- - for any sample S:
- - target.project(S) == #tmat * this->project(S) + #partial_projection(S)
- (this is always true to within rounding error for any S)
- - #partial_projection.basis_vectors.size() == target.basis_vectors.size() - this->basis_vectors.size()
- - #tmat.nr() == target.out_vector_size()
- - #tmat.nc() == this->out_vector_size()
- !*/
-
- void swap (
- empirical_kernel_map& item
- );
- /*!
- ensures
- - swaps the state of *this and item
- !*/
-
- };
-
-// ----------------------------------------------------------------------------------------
-
- template <
- typename kernel_type
- >
- void swap (
- empirical_kernel_map<kernel_type>& a,
- empirical_kernel_map<kernel_type>& b
- ) { a.swap(b); }
- /*!
- provides a global swap function
- !*/
-
- template <
- typename kernel_type
- >
- void serialize (
- const empirical_kernel_map<kernel_type>& item,
- std::ostream& out
- );
- /*!
- provides serialization support for empirical_kernel_map objects
- !*/
-
- template <
- typename kernel_type
- >
- void deserialize (
- empirical_kernel_map<kernel_type>& item,
- std::istream& in
- );
- /*!
- provides serialization support for empirical_kernel_map objects
- !*/
-
-// ----------------------------------------------------------------------------------------
-
-}
-
-#endif // DLIB_EMPIRICAL_KERNEl_MAP_ABSTRACT_H_
-