Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <shogun/lib/config.h>
00012
00013 #ifdef USE_SVMLIGHT
00014
00015 #include <shogun/io/SGIO.h>
00016 #include <shogun/mathematics/lapack.h>
00017 #include <shogun/lib/Signal.h>
00018 #include <shogun/labels/BinaryLabels.h>
00019 #include <shogun/mathematics/Math.h>
00020 #include <shogun/classifier/svm/SVMLightOneClass.h>
00021 #include <shogun/machine/KernelMachine.h>
00022 #include <shogun/kernel/CombinedKernel.h>
00023
00024 #include <unistd.h>
00025
00026 #ifdef USE_CPLEX
00027 extern "C" {
00028 #include <ilcplex/cplex.h>
00029 }
00030 #endif
00031
00032 #include <shogun/base/Parallel.h>
00033
00034 #ifdef HAVE_PTHREAD
00035 #include <pthread.h>
00036 #endif
00037
00038 using namespace shogun;
00039
00040 CSVMLightOneClass::CSVMLightOneClass(float64_t C, CKernel* k)
00041 : CSVMLight()
00042 {
00043 set_C(C,C);
00044 set_kernel(k);
00045 }
00046
00047 CSVMLightOneClass::CSVMLightOneClass()
00048 : CSVMLight()
00049 {
00050 }
00051
00052 bool CSVMLightOneClass::train_machine(CFeatures* data)
00053 {
00054
00055 mkl_converged=false;
00056 verbosity=1 ;
00057 init_margin=0.15;
00058 init_iter=500;
00059 precision_violations=0;
00060 opt_precision=DEF_PRECISION;
00061
00062 strcpy (learn_parm->predfile, "");
00063 learn_parm->biased_hyperplane=0;
00064 learn_parm->sharedslack=0;
00065 learn_parm->remove_inconsistent=0;
00066 learn_parm->skip_final_opt_check=0;
00067 learn_parm->svm_maxqpsize=get_qpsize();
00068 learn_parm->svm_newvarsinqp=learn_parm->svm_maxqpsize-1;
00069 learn_parm->maxiter=100000;
00070 learn_parm->svm_iter_to_shrink=100;
00071 learn_parm->svm_c=C1;
00072 learn_parm->transduction_posratio=0.33;
00073 learn_parm->svm_costratio=C2/C1;
00074 learn_parm->svm_costratio_unlab=1.0;
00075 learn_parm->svm_unlabbound=1E-5;
00076 learn_parm->epsilon_crit=epsilon;
00077 learn_parm->epsilon_a=1E-15;
00078 learn_parm->compute_loo=0;
00079 learn_parm->rho=1.0;
00080 learn_parm->xa_depth=0;
00081
00082 if (!kernel)
00083 SG_ERROR( "SVM_light can not proceed without kernel!\n");
00084
00085 if (data)
00086 kernel->init(data, data);
00087
00088 if (!kernel->has_features())
00089 SG_ERROR( "SVM_light can not proceed without initialized kernel!\n");
00090
00091 int32_t num_vec=kernel->get_num_vec_lhs();
00092 SG_INFO("num_vec=%d\n", num_vec);
00093
00094 SG_UNREF(m_labels);
00095 m_labels=new CBinaryLabels(num_vec);
00096 ((CBinaryLabels*) m_labels)->set_to_one();
00097
00098
00099 if (kernel->has_property(KP_LINADD) && get_linadd_enabled())
00100 kernel->clear_normal() ;
00101
00102
00103 SG_DEBUG( "threads = %i\n", parallel->get_num_threads()) ;
00104 SG_DEBUG( "qpsize = %i\n", learn_parm->svm_maxqpsize) ;
00105 SG_DEBUG( "epsilon = %1.1e\n", learn_parm->epsilon_crit) ;
00106 SG_DEBUG( "kernel->has_property(KP_LINADD) = %i\n", kernel->has_property(KP_LINADD)) ;
00107 SG_DEBUG( "kernel->has_property(KP_KERNCOMBINATION) = %i\n", kernel->has_property(KP_KERNCOMBINATION)) ;
00108 SG_DEBUG( "kernel->has_property(KP_BATCHEVALUATION) = %i\n", kernel->has_property(KP_BATCHEVALUATION)) ;
00109 SG_DEBUG( "kernel->get_optimization_type() = %s\n", kernel->get_optimization_type()==FASTBUTMEMHUNGRY ? "FASTBUTMEMHUNGRY" : "SLOWBUTMEMEFFICIENT" ) ;
00110 SG_DEBUG( "get_solver_type() = %i\n", get_solver_type());
00111 SG_DEBUG( "get_linadd_enabled() = %i\n", get_linadd_enabled()) ;
00112 SG_DEBUG( "get_batch_computation_enabled() = %i\n", get_batch_computation_enabled()) ;
00113 SG_DEBUG( "kernel->get_num_subkernels() = %i\n", kernel->get_num_subkernels()) ;
00114
00115 use_kernel_cache = !((kernel->get_kernel_type() == K_CUSTOM) ||
00116 (get_linadd_enabled() && kernel->has_property(KP_LINADD)));
00117
00118 SG_DEBUG( "use_kernel_cache = %i\n", use_kernel_cache) ;
00119
00120 if (kernel->get_kernel_type() == K_COMBINED)
00121 {
00122 CKernel* kn = ((CCombinedKernel*)kernel)->get_first_kernel();
00123
00124 while (kn)
00125 {
00126
00127 kn->resize_kernel_cache(kn->get_cache_size());
00128 SG_UNREF(kn);
00129 kn = ((CCombinedKernel*) kernel)->get_next_kernel();
00130 }
00131 }
00132
00133 kernel->resize_kernel_cache(kernel->get_cache_size());
00134
00135
00136 svm_learn();
00137
00138
00139 create_new_model(model->sv_num-1);
00140 set_bias(-model->b);
00141 for (int32_t i=0; i<model->sv_num-1; i++)
00142 {
00143 set_alpha(i, model->alpha[i+1]);
00144 set_support_vector(i, model->supvec[i+1]);
00145 }
00146
00147
00148 if (kernel->has_property(KP_LINADD) && get_linadd_enabled())
00149 {
00150 kernel->clear_normal() ;
00151 kernel->delete_optimization() ;
00152 }
00153
00154 if (use_kernel_cache)
00155 kernel->kernel_cache_cleanup();
00156
00157 return true ;
00158 }
00159 #endif //USE_SVMLIGHT