SHOGUN
v2.0.0
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Written (W) 1999-2009 Soeren Sonnenburg 00008 * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society 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 //certain setup params 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; // GU: better decrease it ... ?? 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 // in case of LINADD enabled kernels cleanup! 00099 if (kernel->has_property(KP_LINADD) && get_linadd_enabled()) 00100 kernel->clear_normal() ; 00101 00102 // output some info 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 // allocate kernel cache but clean up beforehand 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 // train the svm 00136 svm_learn(); 00137 00138 // brain damaged svm light work around 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 // in case of LINADD enabled kernels cleanup! 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