Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
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
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