svm_c.h
上传用户:xgw_05
上传日期:2014-12-08
资源大小:2726k
文件大小:5k
源码类别:

.net编程

开发平台:

Java

  1. #ifndef svm_c_h
  2. #define svm_c_h 1
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include "parameters.h"
  6. #include "kernel.h"
  7. #include "example_set.h"
  8. #include "globals.h"
  9. #include "smo.h"
  10. /**
  11.  * base class for SVMs
  12.  *
  13.  * @author Stefan Rueping <rueping@ls8.cs.uni-dortmund.de>
  14.  * @version 0.1
  15.  **/
  16. class svm_c {
  17.  protected:
  18.   smo_c smo;
  19.   SVMFLOAT* all_alphas;
  20.   SVMFLOAT* all_ys;
  21.   SVMINT examples_total;
  22.   SVMINT working_set_size;
  23.   SVMINT shrink_const; // a lagrangian multiplier is fixed if it is at bound more than this number of times
  24.   SVMINT to_shrink;
  25.   SVMFLOAT is_zero;
  26.   SVMFLOAT Cpos, Cneg; // C and C*
  27.   SVMFLOAT epsilon_pos, epsilon_neg;
  28.   SVMFLOAT lambda_eq; // lagrangian multiplier of equality contraint
  29.   SVMFLOAT lambda_WS; // lagrangian multiplier on working set
  30.   SVMINT target_count; // how long no descend in WS?
  31.   SVMFLOAT sum_alpha;
  32.   int biased; // biased hyperplane (w*x+b) or unbiased (w*x)
  33.   example_set_c* examples;
  34.   example_set_c* test_set;
  35.   kernel_c* kernel;
  36.   parameters_c* parameters;
  37.   // ex_i, op_i and ws_i are used as indices.
  38.   // ex_i: index in examples, ex_i = index[op_i], ws_i
  39.   // op_i: index of sorted examples
  40.   // ws_i: index in working set, i.e. index in op_i if fixed values are omitted
  41.   // The following arrays range over the example set
  42.   SVMFLOAT* sum; // sum_i = sum_{j=1}^n (alpha_j^*-alpha_j) K(i,j)
  43.                  // i=ex_i= 1..examples_total
  44.   SVMINT* which_alpha; // -1 if alpha_i in WS, 1 if alpha_i^*, 0 otherwise
  45.                        // i.e. which_alpha[i]*alpha[i] = examples->get_alpha(i)
  46.                        // i=ex_i= 1..examples_total
  47.   SVMINT* at_bound; // how many it. has var been at bound
  48.   quadratic_program qp;
  49.   SVMFLOAT* primal; // workspace for primal variables
  50.   SVMINT* working_set;
  51.   SVMFLOAT* working_set_values;
  52.   // LOQO-parameters:
  53.   SVMFLOAT init_margin;
  54.   SVMFLOAT init_bound;
  55.   SVMFLOAT sigfig_max;
  56.   int init_counter_max;
  57.   int is_pattern;
  58.   SVMFLOAT convergence_epsilon;
  59.   SVMFLOAT feasible_epsilon;
  60.   /*
  61.    * check time usage
  62.    */
  63.   long time_init;
  64.   long time_optimize;
  65.   long time_convergence;
  66.   long time_update;
  67.   long time_calc;
  68.   long time_all;
  69.   virtual int feasible(const SVMINT i, SVMFLOAT* the_nabla, SVMFLOAT* the_lambda, int* atbound); // feasible variable?
  70.   virtual SVMFLOAT nabla(const SVMINT i); // gradient
  71.   virtual SVMFLOAT lambda(const SVMINT i); // lagrangian multiplier
  72.   virtual int is_alpha_neg(const SVMINT i); // alpha or alpha* ?
  73.   virtual void calculate_working_set();
  74.   void minheap_heapify(const SVMINT start, const SVMINT size);
  75.   void maxheap_heapify(const SVMINT start, const SVMINT size);
  76.   SVMINT minheap_add(SVMINT size, const SVMINT element, const SVMFLOAT value);
  77.   SVMINT maxheap_add(SVMINT size, const SVMINT element, const SVMFLOAT value);
  78.   /**
  79.    * Call actual optimizer
  80.    **/
  81.   virtual void optimize();
  82.   void exit_optimizer();
  83.   virtual int convergence();
  84.   virtual void init_working_set();
  85.   virtual void update_working_set();
  86.   void put_optimizer_values();
  87.   virtual void shrink();
  88.   virtual void reset_shrinked();
  89.   virtual void project_to_constraint();
  90.   SVMFLOAT svm_c::avg_norm2(); // avg_examples(K(x,x))
  91.   SVMFLOAT loss(SVMFLOAT prediction, SVMFLOAT value); // the actual loss-function
  92.   SVMFLOAT loss(SVMINT i); // loss of example i
  93.   SVMFLOAT predict(svm_example example); // calculate (regression-)prediction for one example
  94.   SVMFLOAT predict(SVMINT i); // predict example i
  95.   virtual void print_special_statistics();  // print statistics related to some subtype of SVM
  96.  protected:
  97.   virtual void init_optimizer();
  98.  public:
  99.   svm_c();
  100.   /**
  101.    * initialise kernel and parameters
  102.    */
  103.   virtual void init(kernel_c* new_kernel, parameters_c* new_parameters);
  104.   /**
  105.    * Train the SVM 
  106.    **/
  107.   svm_result train(example_set_c* training_examples);
  108.   /**
  109.    * Test svm on test set
  110.    */
  111.   svm_result test(example_set_c* training_examples, int verbose);
  112.   /*
  113.    * Predict values for exmaples in test set
  114.    **/
  115.   void predict(example_set_c* training_examples);
  116.   /**
  117.    * Init examples for testing or predicting
  118.    **/
  119.   void set_svs(example_set_c* training_examples);
  120.   /*
  121.    * print information about test set
  122.    **/
  123.   svm_result print_statistics();
  124. };
  125. class svm_pattern_c : public svm_c {
  126.  public:
  127.   svm_pattern_c() : svm_c() {};
  128.   virtual int feasible(const SVMINT i, SVMFLOAT* the_nabla, SVMFLOAT* the_lambda, int* atbound); // feasible variable?
  129.   virtual SVMFLOAT nabla(const SVMINT i); // gradient
  130.   virtual SVMFLOAT lambda(const SVMINT i); // lagrangian multiplier
  131.   virtual int is_alpha_neg(const SVMINT i); // alpha or alpha* ?
  132.  protected:
  133.   virtual void init_optimizer();
  134. };
  135. class svm_regression_c : public svm_c {
  136.  public:
  137.   svm_regression_c() : svm_c() {};
  138.   virtual int feasible(const SVMINT i, SVMFLOAT* the_nabla, SVMFLOAT* the_lambda, int* atbound); // feasible variable?
  139.   virtual SVMFLOAT nabla(const SVMINT i); // gradient
  140.   virtual SVMFLOAT lambda(const SVMINT i); // lagrangian multiplier
  141.   virtual int is_alpha_neg(const SVMINT i); // alpha or alpha* ?
  142. };
  143. #endif