Mercurial > hg > camir-aes2014
comparison toolboxes/SVM-light/src/svm_common.h @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e9a9cd732c1e |
---|---|
1 /************************************************************************/ | |
2 /* */ | |
3 /* svm_common.h */ | |
4 /* */ | |
5 /* Definitions and functions used in both svm_learn and svm_classify. */ | |
6 /* */ | |
7 /* Author: Thorsten Joachims */ | |
8 /* Date: 02.07.02 */ | |
9 /* */ | |
10 /* Copyright (c) 2002 Thorsten Joachims - All rights reserved */ | |
11 /* */ | |
12 /* This software is available for non-commercial use only. It must */ | |
13 /* not be modified and distributed without prior permission of the */ | |
14 /* author. The author is not responsible for implications from the */ | |
15 /* use of this software. */ | |
16 /* */ | |
17 /************************************************************************/ | |
18 | |
19 #ifndef SVM_COMMON | |
20 #define SVM_COMMON | |
21 | |
22 # define MAXSHRINK 50000 /* maximum number of shrinking rounds */ | |
23 # define MAXFEATNUM 99999999 /* maximum feature number (must be in | |
24 valid range of long int type!) */ | |
25 | |
26 # include <stdio.h> | |
27 # include <ctype.h> | |
28 # include <math.h> | |
29 # include <string.h> | |
30 # include <stdlib.h> | |
31 # include <time.h> | |
32 # include <float.h> | |
33 | |
34 # define VERSION "V6.01" | |
35 # define VERSION_DATE "01.09.04" | |
36 | |
37 # define CFLOAT float /* the type of float to use for caching */ | |
38 /* kernel evaluations. Using float saves */ | |
39 /* us some memory, but you can use double, too */ | |
40 # define FNUM long /* the type used for storing feature ids */ | |
41 # define FVAL float /* the type used for storing feature values */ | |
42 | |
43 # define LINEAR 0 /* linear kernel type */ | |
44 # define POLY 1 /* polynoial kernel type */ | |
45 # define RBF 2 /* rbf kernel type */ | |
46 # define SIGMOID 3 /* sigmoid kernel type */ | |
47 | |
48 # define CLASSIFICATION 1 /* train classification model */ | |
49 # define REGRESSION 2 /* train regression model */ | |
50 # define RANKING 3 /* train ranking model */ | |
51 # define OPTIMIZATION 4 /* train on general set of constraints */ | |
52 | |
53 typedef struct word { | |
54 FNUM wnum; /* word number */ | |
55 FVAL weight; /* word weight */ | |
56 } WORD; | |
57 | |
58 typedef struct svector { | |
59 WORD *words; /* The features/values in the vector by | |
60 increasing feature-number. Feature | |
61 numbers that are skipped are | |
62 interpreted as having value zero. */ | |
63 double twonorm_sq; /* The squared euclidian length of the | |
64 vector. Used to speed up the RBF kernel. */ | |
65 char *userdefined; /* You can put additional information | |
66 here. This can be useful, if you are | |
67 implementing your own kernel that | |
68 does not work with feature/values | |
69 representations (for example a | |
70 string kernel). By default, | |
71 svm-light will put here the string | |
72 after the # sign from each line of | |
73 the input file. */ | |
74 long kernel_id; /* Feature vectors with different | |
75 kernel_id's are orthogonal (ie. the | |
76 feature number do not match). This | |
77 is used for computing component | |
78 kernels for linear constraints which | |
79 are a sum of several different | |
80 weight vectors. (currently not | |
81 implemented). */ | |
82 struct svector *next; /* Let's you set up a list of SVECTOR's | |
83 for linear constraints which are a | |
84 sum of multiple feature | |
85 vectors. List is terminated by | |
86 NULL. */ | |
87 double factor; /* Factor by which this feature vector | |
88 is multiplied in the sum. */ | |
89 } SVECTOR; | |
90 | |
91 typedef struct doc { | |
92 long docnum; /* Document ID. This has to be the position of | |
93 the document in the training set array. */ | |
94 long queryid; /* for learning rankings, constraints are | |
95 generated for documents with the same | |
96 queryID. */ | |
97 double costfactor; /* Scales the cost of misclassifying this | |
98 document by this factor. The effect of this | |
99 value is, that the upper bound on the alpha | |
100 for this example is scaled by this factor. | |
101 The factors are set by the feature | |
102 'cost:<val>' in the training data. */ | |
103 long slackid; /* Index of the slack variable | |
104 corresponding to this | |
105 constraint. All constraints with the | |
106 same slackid share the same slack | |
107 variable. This can only be used for | |
108 svm_learn_optimization. */ | |
109 SVECTOR *fvec; /* Feature vector of the example. The | |
110 feature vector can actually be a | |
111 list of feature vectors. For | |
112 example, the list will have two | |
113 elements, if this DOC is a | |
114 preference constraint. The one | |
115 vector that is supposed to be ranked | |
116 higher, will have a factor of +1, | |
117 the lower ranked one should have a | |
118 factor of -1. */ | |
119 } DOC; | |
120 | |
121 typedef struct learn_parm { | |
122 long type; /* selects between regression and | |
123 classification */ | |
124 double svm_c; /* upper bound C on alphas */ | |
125 double eps; /* regression epsilon (eps=1.0 for | |
126 classification */ | |
127 double svm_costratio; /* factor to multiply C for positive examples */ | |
128 double transduction_posratio;/* fraction of unlabeled examples to be */ | |
129 /* classified as positives */ | |
130 long biased_hyperplane; /* if nonzero, use hyperplane w*x+b=0 | |
131 otherwise w*x=0 */ | |
132 long sharedslack; /* if nonzero, it will use the shared | |
133 slack variable mode in | |
134 svm_learn_optimization. It requires | |
135 that the slackid is set for every | |
136 training example */ | |
137 long svm_maxqpsize; /* size q of working set */ | |
138 long svm_newvarsinqp; /* new variables to enter the working set | |
139 in each iteration */ | |
140 long kernel_cache_size; /* size of kernel cache in megabytes */ | |
141 double epsilon_crit; /* tolerable error for distances used | |
142 in stopping criterion */ | |
143 double epsilon_shrink; /* how much a multiplier should be above | |
144 zero for shrinking */ | |
145 long svm_iter_to_shrink; /* iterations h after which an example can | |
146 be removed by shrinking */ | |
147 long maxiter; /* number of iterations after which the | |
148 optimizer terminates, if there was | |
149 no progress in maxdiff */ | |
150 long remove_inconsistent; /* exclude examples with alpha at C and | |
151 retrain */ | |
152 long skip_final_opt_check; /* do not check KT-Conditions at the end of | |
153 optimization for examples removed by | |
154 shrinking. WARNING: This might lead to | |
155 sub-optimal solutions! */ | |
156 long compute_loo; /* if nonzero, computes leave-one-out | |
157 estimates */ | |
158 double rho; /* parameter in xi/alpha-estimates and for | |
159 pruning leave-one-out range [1..2] */ | |
160 long xa_depth; /* parameter in xi/alpha-estimates upper | |
161 bounding the number of SV the current | |
162 alpha_t is distributed over */ | |
163 char predfile[200]; /* file for predicitions on unlabeled examples | |
164 in transduction */ | |
165 char alphafile[200]; /* file to store optimal alphas in. use | |
166 empty string if alphas should not be | |
167 output */ | |
168 | |
169 /* you probably do not want to touch the following */ | |
170 double epsilon_const; /* tolerable error on eq-constraint */ | |
171 double epsilon_a; /* tolerable error on alphas at bounds */ | |
172 double opt_precision; /* precision of solver, set to e.g. 1e-21 | |
173 if you get convergence problems */ | |
174 | |
175 /* the following are only for internal use */ | |
176 long svm_c_steps; /* do so many steps for finding optimal C */ | |
177 double svm_c_factor; /* increase C by this factor every step */ | |
178 double svm_costratio_unlab; | |
179 double svm_unlabbound; | |
180 double *svm_cost; /* individual upper bounds for each var */ | |
181 long totwords; /* number of features */ | |
182 } LEARN_PARM; | |
183 | |
184 typedef struct kernel_parm { | |
185 long kernel_type; /* 0=linear, 1=poly, 2=rbf, 3=sigmoid, 4=custom */ | |
186 long poly_degree; | |
187 double rbf_gamma; | |
188 double coef_lin; | |
189 double coef_const; | |
190 char custom[50]; /* for user supplied kernel */ | |
191 } KERNEL_PARM; | |
192 | |
193 typedef struct model { | |
194 long sv_num; | |
195 long at_upper_bound; | |
196 double b; | |
197 DOC **supvec; | |
198 double *alpha; | |
199 long *index; /* index from docnum to position in model */ | |
200 long totwords; /* number of features */ | |
201 long totdoc; /* number of training documents */ | |
202 KERNEL_PARM kernel_parm; /* kernel */ | |
203 | |
204 /* the following values are not written to file */ | |
205 double loo_error,loo_recall,loo_precision; /* leave-one-out estimates */ | |
206 double xa_error,xa_recall,xa_precision; /* xi/alpha estimates */ | |
207 double *lin_weights; /* weights for linear case using | |
208 folding */ | |
209 double maxdiff; /* precision, up to which this | |
210 model is accurate */ | |
211 } MODEL; | |
212 | |
213 typedef struct quadratic_program { | |
214 long opt_n; /* number of variables */ | |
215 long opt_m; /* number of linear equality constraints */ | |
216 double *opt_ce,*opt_ce0; /* linear equality constraints */ | |
217 double *opt_g; /* hessian of objective */ | |
218 double *opt_g0; /* linear part of objective */ | |
219 double *opt_xinit; /* initial value for variables */ | |
220 double *opt_low,*opt_up; /* box constraints */ | |
221 } QP; | |
222 | |
223 typedef struct kernel_cache { | |
224 long *index; /* cache some kernel evalutations */ | |
225 CFLOAT *buffer; /* to improve speed */ | |
226 long *invindex; | |
227 long *active2totdoc; | |
228 long *totdoc2active; | |
229 long *lru; | |
230 long *occu; | |
231 long elems; | |
232 long max_elems; | |
233 long time; | |
234 long activenum; | |
235 long buffsize; | |
236 } KERNEL_CACHE; | |
237 | |
238 | |
239 typedef struct timing_profile { | |
240 long time_kernel; | |
241 long time_opti; | |
242 long time_shrink; | |
243 long time_update; | |
244 long time_model; | |
245 long time_check; | |
246 long time_select; | |
247 } TIMING; | |
248 | |
249 typedef struct shrink_state { | |
250 long *active; | |
251 long *inactive_since; | |
252 long deactnum; | |
253 double **a_history; /* for shrinking with non-linear kernel */ | |
254 long maxhistory; | |
255 double *last_a; /* for shrinking with linear kernel */ | |
256 double *last_lin; /* for shrinking with linear kernel */ | |
257 } SHRINK_STATE; | |
258 | |
259 double classify_example(MODEL *, DOC *); | |
260 double classify_example_linear(MODEL *, DOC *); | |
261 CFLOAT kernel(KERNEL_PARM *, DOC *, DOC *); | |
262 CFLOAT single_kernel(KERNEL_PARM *, SVECTOR *, SVECTOR *); | |
263 double custom_kernel(KERNEL_PARM *, SVECTOR *, SVECTOR *); | |
264 SVECTOR *create_svector(WORD *, char *, double); | |
265 SVECTOR *copy_svector(SVECTOR *); | |
266 void free_svector(SVECTOR *); | |
267 double sprod_ss(SVECTOR *, SVECTOR *); | |
268 SVECTOR* sub_ss(SVECTOR *, SVECTOR *); | |
269 SVECTOR* add_ss(SVECTOR *, SVECTOR *); | |
270 SVECTOR* add_list_ss(SVECTOR *); | |
271 void append_svector_list(SVECTOR *a, SVECTOR *b); | |
272 SVECTOR* smult_s(SVECTOR *, double); | |
273 int featvec_eq(SVECTOR *, SVECTOR *); | |
274 double model_length_s(MODEL *, KERNEL_PARM *); | |
275 void clear_vector_n(double *, long); | |
276 void add_vector_ns(double *, SVECTOR *, double); | |
277 double sprod_ns(double *, SVECTOR *); | |
278 void add_weight_vector_to_linear_model(MODEL *); | |
279 DOC *create_example(long, long, long, double, SVECTOR *); | |
280 void free_example(DOC *, long); | |
281 MODEL *read_model(char *); | |
282 MODEL *copy_model(MODEL *); | |
283 void free_model(MODEL *, int); | |
284 void read_documents(char *, DOC ***, double **, long *, long *); | |
285 int parse_document(char *, WORD *, double *, long *, long *, double *, long *, long, char **); | |
286 double *read_alphas(char *,long); | |
287 void nol_ll(char *, long *, long *, long *); | |
288 long minl(long, long); | |
289 long maxl(long, long); | |
290 long get_runtime(void); | |
291 int space_or_null(int); | |
292 void *my_malloc(size_t); | |
293 void copyright_notice(void); | |
294 # ifdef _MSC_VER | |
295 int isnan(double); | |
296 # endif | |
297 | |
298 extern long verbosity; /* verbosity level (0-4) */ | |
299 extern long kernel_cache_statistic; | |
300 | |
301 #endif |