You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
7.8 KiB
196 lines
7.8 KiB
/** @file svm.h
|
|
** @brief Support Vector Machines (@ref svm)
|
|
** @author Milan Sulc
|
|
** @author Daniele Perrone
|
|
** @author Andrea Vedaldi
|
|
**/
|
|
|
|
/*
|
|
Copyright (C) 2013 Milan Sulc.
|
|
Copyright (C) 2012 Daniele Perrone.
|
|
Copyright (C) 2011-13 Andrea Vedaldi.
|
|
|
|
All rights reserved.
|
|
|
|
This file is part of the VLFeat library and is made available under
|
|
the terms of the BSD license (see the COPYING file).
|
|
*/
|
|
|
|
#ifndef VL_SVM_H
|
|
#define VL_SVM_H
|
|
|
|
#include "generic.h"
|
|
#include "svmdataset.h"
|
|
|
|
/** @typedef VlSvm
|
|
** @brief SVM solver.
|
|
** This object implements VLFeat SVM solvers (see @ref svm.h).
|
|
**/
|
|
|
|
#ifndef __DOXYGEN__
|
|
struct VlSvm_ ;
|
|
typedef struct VlSvm_ VlSvm ;
|
|
#else
|
|
typedef OPAQUE VlSvm ;
|
|
#endif
|
|
|
|
/** @brief Type of SVM solver */
|
|
typedef enum
|
|
{
|
|
VlSvmSolverNone = 0, /**< No solver (used to evaluate an SVM). */
|
|
VlSvmSolverSgd = 1, /**< SGD algorithm (@ref svm-sgd). */
|
|
VlSvmSolverSdca /**< SDCA algorithm (@ref svm-sdca). */
|
|
} VlSvmSolverType ;
|
|
|
|
/** @brief Type of SVM loss
|
|
**
|
|
** Default SVM loss types. The loss can be set by using ::vl_svm_set_loss.
|
|
** Note that custom losses can be used too by using ::vl_svm_set_loss_function,
|
|
** ::vl_svm_set_loss_derivative_function, etc.
|
|
**
|
|
** @sa svm-loss-functions
|
|
**/
|
|
typedef enum
|
|
{
|
|
VlSvmLossHinge = 0, /**< Standard hinge loss. */
|
|
VlSvmLossHinge2 = 1, /**< Hinge loss squared. */
|
|
VlSvmLossL1, /**< L1 loss. */
|
|
VlSvmLossL2, /**< L2 loss. */
|
|
VlSvmLossLogistic /**< Logistic loss. */
|
|
} VlSvmLossType ;
|
|
|
|
/** @brief Solver status */
|
|
typedef enum
|
|
{
|
|
VlSvmStatusTraining = 1, /**< Optimization in progress. */
|
|
VlSvmStatusConverged, /**< Optimization finished because the convergence criterion was met. */
|
|
VlSvmStatusMaxNumIterationsReached /**< Optimization finished without convergence. */
|
|
} VlSvmSolverStatus ;
|
|
|
|
/** @brief SVM statistics
|
|
** This structure contains statistics characterising the state of
|
|
** the SVM solver, such as the current value of the objective function.
|
|
**
|
|
** Not all fields are used by all solvers.
|
|
**/
|
|
typedef struct VlSvmStatistics_ {
|
|
VlSvmSolverStatus status ; /**< Solver status. */
|
|
vl_size iteration ; /**< Solver iteration. */
|
|
vl_size epoch ; /**< Solver epoch (iteration / num samples). */
|
|
double objective ; /**< Objective function value. */
|
|
double regularizer ; /**< Regularizer value. */
|
|
double loss ; /**< Loss value. */
|
|
double dualObjective ; /**< Dual objective value. */
|
|
double dualLoss ; /**< Dual loss value. */
|
|
double dualityGap ; /**< Duality gap = objective - dualObjective. */
|
|
double scoresVariation ; /**< Variance of the score updates. */
|
|
double elapsedTime ; /**< Time elapsed from the start of training. */
|
|
} VlSvmStatistics ;
|
|
|
|
/** @name Create and destroy
|
|
** @{ */
|
|
VL_EXPORT VlSvm * vl_svm_new (VlSvmSolverType type,
|
|
double const * data,
|
|
vl_size dimension,
|
|
vl_size numData,
|
|
double const * labels,
|
|
double lambda) ;
|
|
|
|
VL_EXPORT VlSvm * vl_svm_new_with_dataset (VlSvmSolverType type,
|
|
VlSvmDataset * dataset,
|
|
double const * labels,
|
|
double lambda) ;
|
|
|
|
VL_EXPORT VlSvm * vl_svm_new_with_abstract_data (VlSvmSolverType type,
|
|
void * data,
|
|
vl_size dimension,
|
|
vl_size numData,
|
|
double const * labels,
|
|
double lambda) ;
|
|
|
|
VL_EXPORT void vl_svm_delete (VlSvm * self) ;
|
|
/** @} */
|
|
|
|
/** @name Retrieve parameters and data
|
|
** @{ */
|
|
VL_EXPORT VlSvmStatistics const * vl_svm_get_statistics (VlSvm const *self) ;
|
|
VL_EXPORT double const * vl_svm_get_model (VlSvm const *self) ;
|
|
VL_EXPORT double vl_svm_get_bias (VlSvm const *self) ;
|
|
VL_EXPORT vl_size vl_svm_get_dimension (VlSvm *self) ;
|
|
VL_EXPORT vl_size vl_svm_get_num_data (VlSvm *self) ;
|
|
VL_EXPORT double vl_svm_get_epsilon (VlSvm const *self) ;
|
|
VL_EXPORT double vl_svm_get_bias_learning_rate (VlSvm const *self) ;
|
|
VL_EXPORT vl_size vl_svm_get_max_num_iterations (VlSvm const *self) ;
|
|
VL_EXPORT vl_size vl_svm_get_diagnostic_frequency (VlSvm const *self) ;
|
|
VL_EXPORT VlSvmSolverType vl_svm_get_solver (VlSvm const *self) ;
|
|
VL_EXPORT double vl_svm_get_bias_multiplier (VlSvm const *self) ;
|
|
VL_EXPORT double vl_svm_get_lambda (VlSvm const *self) ;
|
|
VL_EXPORT vl_size vl_svm_get_iteration_number (VlSvm const *self) ;
|
|
VL_EXPORT double const * vl_svm_get_scores (VlSvm const *self) ;
|
|
VL_EXPORT double const * vl_svm_get_weights (VlSvm const *self) ;
|
|
/** @} */
|
|
|
|
/** @name Set parameters
|
|
** @{ */
|
|
VL_EXPORT void vl_svm_set_epsilon (VlSvm *self, double epsilon) ;
|
|
VL_EXPORT void vl_svm_set_bias_learning_rate (VlSvm *self, double rate) ;
|
|
VL_EXPORT void vl_svm_set_max_num_iterations (VlSvm *self, vl_size maxNumIterations) ;
|
|
VL_EXPORT void vl_svm_set_diagnostic_frequency (VlSvm *self, vl_size f) ;
|
|
VL_EXPORT void vl_svm_set_bias_multiplier (VlSvm *self, double b) ;
|
|
VL_EXPORT void vl_svm_set_model (VlSvm *self, double const *model) ;
|
|
VL_EXPORT void vl_svm_set_bias (VlSvm *self, double b) ;
|
|
VL_EXPORT void vl_svm_set_iteration_number (VlSvm *self, vl_uindex n) ;
|
|
VL_EXPORT void vl_svm_set_weights (VlSvm *self, double const *weights) ;
|
|
|
|
VL_EXPORT void vl_svm_set_diagnostic_function (VlSvm *self, VlSvmDiagnosticFunction f, void *data) ;
|
|
VL_EXPORT void vl_svm_set_loss_function (VlSvm *self, VlSvmLossFunction f) ;
|
|
VL_EXPORT void vl_svm_set_loss_derivative_function (VlSvm *self, VlSvmLossFunction f) ;
|
|
VL_EXPORT void vl_svm_set_conjugate_loss_function (VlSvm *self, VlSvmLossFunction f) ;
|
|
VL_EXPORT void vl_svm_set_dca_update_function (VlSvm *self, VlSvmDcaUpdateFunction f) ;
|
|
VL_EXPORT void vl_svm_set_data_functions (VlSvm *self, VlSvmInnerProductFunction inner, VlSvmAccumulateFunction acc) ;
|
|
VL_EXPORT void vl_svm_set_loss (VlSvm *self, VlSvmLossType loss) ;
|
|
/** @} */
|
|
|
|
/** @name Process data
|
|
** @{ */
|
|
VL_EXPORT void vl_svm_train (VlSvm * self) ;
|
|
/** @} */
|
|
|
|
/** @name Loss functions
|
|
** @sa @ref svm-advanced
|
|
** @{ */
|
|
|
|
/* hinge */
|
|
VL_EXPORT double vl_svm_hinge_loss (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_hinge_loss_derivative (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_hinge_conjugate_loss (double label, double u) ;
|
|
VL_EXPORT double vl_svm_hinge_dca_update (double alpha, double inner, double norm2, double label) ;
|
|
|
|
/* square hinge */
|
|
VL_EXPORT double vl_svm_hinge2_loss (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_hinge2_loss_derivative (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_hinge2_conjugate_loss (double label, double u) ;
|
|
VL_EXPORT double vl_svm_hinge2_dca_update (double alpha, double inner, double norm2, double label) ;
|
|
|
|
/* l1 */
|
|
VL_EXPORT double vl_svm_l1_loss (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_l1_loss_derivative (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_l1_conjugate_loss (double label, double u) ;
|
|
VL_EXPORT double vl_svm_l1_dca_update (double alpha, double inner, double norm2, double label) ;
|
|
|
|
/* l2 */
|
|
VL_EXPORT double vl_svm_l2_loss (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_l2_loss_derivative (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_l2_conjugate_loss (double label, double u) ;
|
|
VL_EXPORT double vl_svm_l2_dca_update (double alpha, double inner, double norm2, double label) ;
|
|
|
|
/* logistic */
|
|
VL_EXPORT double vl_svm_logistic_loss (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_logistic_loss_derivative (double label, double inner) ;
|
|
VL_EXPORT double vl_svm_logistic_conjugate_loss (double label, double u) ;
|
|
VL_EXPORT double vl_svm_logistic_dca_update (double alpha, double inner, double norm2, double label) ;
|
|
/** } */
|
|
|
|
/* VL_SVM_H */
|
|
#endif
|