Giter Club home page Giter Club logo

svm's Introduction

Support Vector Machine Library Wrappers

This project provides an alternative, modern C++ interface to the libsvm library. The original libsvm code is redistributed largely unmodified as part of this repository, as is permissible under the terms of its BSD 3-clause license.

For now, not all features of the upstream libsvm are supported; in particular regression is not supported for the time being.

However, these wrappers allow for an easy access to the core features of libsvm, two-class classification and use of the kernel trick. In particular, features include:

  • A svm::dataset data structure which wraps the struct svm_node * of libsvm in a safe way. STL-style bidirectional iterators are provided, converting constructors from STL-style containers exist, the existence of sentinel elements is ensured and transparent to the user, memory is managed.
  • The four built-in kernel functions (linear, polynomial, radial basis functions, sigmoid) provided by libsvm are exposed as types in the svm::kernel namespace.
  • Users may define further "precomputed" kernels in libsvm. In that case, libsvm expects their users to provide the kernel evaluations for all pairs of training samples rather than the actual training data. This wrapper handles this instead, making the use of precomputed kernels very accessible. One only needs to provide a struct which defines the type definition input_container_type that is to be used for training samples as well as an overload of operator() which calculates the kernel evaluation of two samples (of type input_container_type). As an example, a "precomputed" version of the linear kernel is provided in kernel/linear_precomputed.hpp. This is merely for demonstration and testing; in applications, the built-in linear kernel should be used instead.
  • svm::parameters represents the parameters of the SVM optimization and also the parameters of the built-in kernels (due to technical reasons). Thus, it requires the kernel type as a template parameter. Precomputed kernels should inject a template specialization of parameters<Kernel> into the svm namespace.
  • svm::problem represents the training data. For built-in kernels, it stores the samples; for precomputed kernels it does so as well but also stores the kernel evaluation matrix. New samples can be added with add_sample (as a svm::dataset for built-in kernels, or as the input_container_type of your choice for precomputed kernels). svm::problem takes the kernel type as a template parameter to discern the different behaviors; you do not need to provide a template specialization for precomputed kernels, though.
  • svm::model represents the result of the SVM optimization. The actual optimization takes place when calling the constructor. It expects both the problem and the parameters objects as arguments. The problem has to be provided as an rvalue reference (i.e. as a temporary or by invoking std::move) and will be invalidated afterwards. This is because the resulting svm::model will take hold of the sample data in the problem, at least for those samples which become "support vectors". Iterating over the model gives access to its support vectors and their respective coefficients. The svm::model provides an operator() which can be called with a test sample and returns a pair consisting of the label (-1 or +1) and
    • in case of binary classification, the value of the decision function;
    • or in case of multiclassification between M distinct labels, a container of size M(M-1), holding all decision function values for each binary classification between any two labels. Through svm::model::classifiers(), one may alternatively obtain a container of M(M-1) views on the svm::model, each behaving like a binary classification model (i.e. its call operator returns a pair of the predicted label and the decision function value).
  • introspector classes are defined for use with the linear (linear_introspector) and polynomial kernels (tensor_introspector). These in particular calculate contractions of multinomials of support vector components over all support vectors. These are useful when interpreting the resultant model and gaining insight from the learnt decision function. E.g. the linear_introspector gives access to the coefficients of the hyperplane that SVM has learned to separate the two classes as best as possible. The introspector concept is very general and may be used in different ways with custom kernels.
  • The wrapper also define an interface for serialization (saving/loading) of the resulting model and problem. ASCII serialization uses the text file input / output provided by libsvm.
  • Alternatively, when used in conjunction with the ALPSCore library, you can use an HDF5 serializer instead. Storing model and problem in an HDF5 file saves on disk space and I/O bandwidth by using a binary format and enabling on-the-fly gzip compression. ALPSCore is otherwise not a depenency of these wrappers of libsvm. When you want to use HDF5 serialization, you need to include the additional header <svm/serialization/hdf5.hpp> and link against ALPSCore's libalps-hdf5.

Included Third-party Code

License

Copyright ยฉ 2018โ€“2019 Jonas Greitemann

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program, see the file entitled "LICENCE" in the repository's root directory, or see http://www.gnu.org/licenses/.

svm's People

Contributors

jgreitemann avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.