Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <shogun/classifier/svm/LibSVMOneClass.h>
00013 #include <shogun/io/SGIO.h>
00014
00015 using namespace shogun;
00016
00017 CLibSVMOneClass::CLibSVMOneClass()
00018 : CSVM(), model(NULL)
00019 {
00020 }
00021
00022 CLibSVMOneClass::CLibSVMOneClass(float64_t C, CKernel* k)
00023 : CSVM(C, k, NULL), model(NULL)
00024 {
00025 }
00026
00027 CLibSVMOneClass::~CLibSVMOneClass()
00028 {
00029 SG_FREE(model);
00030 }
00031
00032 bool CLibSVMOneClass::train_machine(CFeatures* data)
00033 {
00034 ASSERT(kernel);
00035 if (data)
00036 kernel->init(data, data);
00037
00038 problem.l=kernel->get_num_vec_lhs();
00039
00040 struct svm_node* x_space;
00041 SG_INFO("%d train data points\n", problem.l);
00042
00043 problem.y=NULL;
00044 problem.x=SG_MALLOC(struct svm_node*, problem.l);
00045 x_space=SG_MALLOC(struct svm_node, 2*problem.l);
00046
00047 for (int32_t i=0; i<problem.l; i++)
00048 {
00049 problem.x[i]=&x_space[2*i];
00050 x_space[2*i].index=i;
00051 x_space[2*i+1].index=-1;
00052 }
00053
00054 int32_t weights_label[2]={-1,+1};
00055 float64_t weights[2]={1.0,get_C2()/get_C1()};
00056
00057 param.svm_type=ONE_CLASS;
00058 param.kernel_type = LINEAR;
00059 param.degree = 3;
00060 param.gamma = 0;
00061 param.coef0 = 0;
00062 param.nu = get_nu();
00063 param.kernel=kernel;
00064 param.cache_size = kernel->get_cache_size();
00065 param.max_train_time = m_max_train_time;
00066 param.C = get_C1();
00067 param.eps = epsilon;
00068 param.p = 0.1;
00069 param.shrinking = 1;
00070 param.nr_weight = 2;
00071 param.weight_label = weights_label;
00072 param.weight = weights;
00073 param.use_bias = get_bias_enabled();
00074
00075 const char* error_msg = svm_check_parameter(&problem,¶m);
00076
00077 if(error_msg)
00078 SG_ERROR("Error: %s\n",error_msg);
00079
00080 model = svm_train(&problem, ¶m);
00081
00082 if (model)
00083 {
00084 ASSERT(model->nr_class==2);
00085 ASSERT((model->l==0) || (model->l>0 && model->SV && model->sv_coef && model->sv_coef[0]));
00086
00087 int32_t num_sv=model->l;
00088
00089 create_new_model(num_sv);
00090 CSVM::set_objective(model->objective);
00091
00092 set_bias(-model->rho[0]);
00093 for (int32_t i=0; i<num_sv; i++)
00094 {
00095 set_support_vector(i, (model->SV[i])->index);
00096 set_alpha(i, model->sv_coef[0][i]);
00097 }
00098
00099 SG_FREE(problem.x);
00100 SG_FREE(x_space);
00101 svm_destroy_model(model);
00102 model=NULL;
00103
00104 return true;
00105 }
00106 else
00107 return false;
00108 }