SVM_linear.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2007-2009 The LIBLINEAR Project.
00003  * All rights reserved.
00004  * 
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 
00009  * 1. Redistributions of source code must retain the above copyright
00010  * notice, this list of conditions and the following disclaimer.
00011  * 
00012  * 2. Redistributions in binary form must reproduce the above copyright
00013  * notice, this list of conditions and the following disclaimer in the
00014  * documentation and/or other materials provided with the distribution.
00015  * 
00016  * 3. Neither name of copyright holders nor the names of its contributors
00017  * may be used to endorse or promote products derived from this software
00018  * without specific prior written permission.
00019  * 
00020  * 
00021  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00022  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00023  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00024  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR
00025  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00026  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00027  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00028  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00029  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00030  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00031  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00032  */
00033 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00034 
00035 #ifndef _LIBLINEAR_H
00036 #define _LIBLINEAR_H
00037 
00038 #include <shogun/lib/config.h>
00039 
00040 #ifdef HAVE_LAPACK
00041 #include <shogun/classifier/svm/Tron.h>
00042 #include <shogun/features/DotFeatures.h>
00043 #include <vector>
00044 
00045 namespace shogun
00046 {
00047 
00048 #ifdef __cplusplus
00049 extern "C" {
00050 #endif
00051 
00053 struct problem
00054 {
00056     int32_t l;
00058     int32_t n;
00060     int32_t *y;
00062     CDotFeatures* x;
00064     bool use_bias;
00065 };
00066 
00068 struct parameter
00069 {
00071     int32_t solver_type;
00072 
00073     /* these are for training only */
00075     float64_t eps;
00077     float64_t C;
00079     int32_t nr_weight;
00081     int32_t *weight_label;
00083     float64_t* weight;
00084 };
00085 
00087 struct model
00088 {
00090     struct parameter param;
00092     int32_t nr_class;
00094     int32_t nr_feature;
00096     float64_t *w;
00098     int32_t *label;
00100     float64_t bias;
00101 };
00102 
00103 void destroy_model(struct model *model_);
00104 void destroy_param(struct parameter *param);
00105 #ifdef __cplusplus
00106 }
00107 #endif
00108 
00110 class l2loss_svm_fun : public function
00111 {
00112 public:
00119     l2loss_svm_fun(const problem *prob, float64_t Cp, float64_t Cn);
00120     ~l2loss_svm_fun();
00121     
00127     float64_t fun(float64_t *w);
00128     
00134     void grad(float64_t *w, float64_t *g);
00135 
00141     void Hv(float64_t *s, float64_t *Hs);
00142 
00147     int32_t get_nr_variable(void);
00148 
00149 private:
00150     void Xv(float64_t *v, float64_t *Xv);
00151     void subXv(float64_t *v, float64_t *Xv);
00152     void subXTv(float64_t *v, float64_t *XTv);
00153 
00154     float64_t *C;
00155     float64_t *z;
00156     float64_t *D;
00157     int32_t *I;
00158     int32_t sizeI;
00159     const problem *prob;
00160 };
00161 
00163 class l2r_lr_fun : public function
00164 {
00165 public:
00172     l2r_lr_fun(const problem *prob, float64_t Cp, float64_t Cn);
00173     ~l2r_lr_fun();
00174 
00180     float64_t fun(float64_t *w);
00181     
00187     void grad(float64_t *w, float64_t *g);
00188 
00194     void Hv(float64_t *s, float64_t *Hs);
00195 
00196     int32_t get_nr_variable(void);
00197 
00198 private:
00199     void Xv(float64_t *v, float64_t *Xv);
00200     void XTv(float64_t *v, float64_t *XTv);
00201 
00202     float64_t *C;
00203     float64_t *z;
00204     float64_t *D;
00205     const problem *prob;
00206 };
00207 
00208 class l2r_l2_svc_fun : public function
00209 {
00210 public:
00211     l2r_l2_svc_fun(const problem *prob, double Cp, double Cn);
00212     ~l2r_l2_svc_fun();
00213 
00214     double fun(double *w);
00215     void grad(double *w, double *g);
00216     void Hv(double *s, double *Hs);
00217 
00218     int get_nr_variable(void);
00219 
00220 private:
00221     void Xv(double *v, double *Xv);
00222     void subXv(double *v, double *Xv);
00223     void subXTv(double *v, double *XTv);
00224 
00225     double *C;
00226     double *z;
00227     double *D;
00228     int *I;
00229     int sizeI;
00230     const problem *prob;
00231 };
00232 
00233 class Solver_MCSVM_CS
00234 {
00235     public:
00236         Solver_MCSVM_CS(const problem *prob, int nr_class, double *C, double eps=0.1, int max_iter=100000);
00237         ~Solver_MCSVM_CS();
00238         void Solve(double *w);
00239     private:
00240         void solve_sub_problem(double A_i, int yi, double C_yi, int active_i, double *alpha_new);
00241         bool be_shrunk(int i, int m, int yi, double alpha_i, double minG);
00242         double *B, *C, *G;
00243         int w_size, l;
00244         int nr_class;
00245         int max_iter;
00246         double eps;
00247         const problem *prob;
00248 };
00249 
00250 
00251 }
00252 #endif //HAVE_LAPACK
00253 #endif //_LIBLINEAR_H
00254 
00255 #endif // DOXYGEN_SHOULD_SKIP_THIS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

SHOGUN Machine Learning Toolbox - Documentation