machine learning - Trying to link my program (libsvm.c and libsvm.h) with libsvm.cpp to do a simple prediction -
i trying use libsvm perform binary-class machine learning (2 class only) using c on eclipse. before started using training data, tried running simple xor problem see if libsvm predict correct output value (which supposed +1).
however, after built project, got errors such "undefined reference '_heap_begin'" , "undefined reference '_heap_limit'" , "undefined reference 'svm_train'" , "undefined reference 'svm_predict'" , "undefined reference 'svm_destroy_param'". seems libsvm.c file not linked libsvm.cpp file, though #include "libsvm.h" in both libsvm.c , libsvm.cpp. can please me solve issue? in advance!
libsvm.h:
#ifndef _libsvm_h #define _libsvm_h #define libsvm_version 322 #ifdef __cplusplus extern "c" { #endif extern int libsvm_version; struct svm_node { int index; double value; }; struct svm_problem { int l; double *y; struct svm_node **x; }; enum { c_svc, nu_svc, one_class, epsilon_svr, nu_svr }; /* svm_type */ enum { linear, poly, rbf, sigmoid, precomputed }; /* kernel_type */ struct svm_parameter { int svm_type; int kernel_type; int degree; /* poly */ double gamma; /* poly/rbf/sigmoid */ double coef0; /* poly/sigmoid */ /* these training */ double cache_size; /* in mb */ double eps; /* stopping criteria */ double c; /* c_svc, epsilon_svr , nu_svr */ int nr_weight; /* c_svc */ int *weight_label; /* c_svc */ double* weight; /* c_svc */ double nu; /* nu_svc, one_class, , nu_svr */ double p; /* epsilon_svr */ int shrinking; /* use shrinking heuristics */ int probability; /* probability estimates */ }; // // svm_model // struct svm_model { struct svm_parameter param; /* parameter */ int nr_class; /* number of classes, = 2 in regression/one class svm */ int l; /* total #sv */ struct svm_node **sv; /* svs (sv[l]) */ double **sv_coef; /* coefficients svs in decision functions (sv_coef[k-1][l]) */ double *rho; /* constants in decision functions (rho[k*(k-1)/2]) */ double *proba; /* pariwise probability information */ double *probb; int *sv_indices; /* sv_indices[0,...,nsv-1] values in [1,...,num_traning_data] indicate svs in training set */ /* classification */ int *label; /* label of each class (label[k]) */ int *nsv; /* number of svs each class (nsv[k]) */ /* nsv[0] + nsv[1] + ... + nsv[k-1] = l */ /* xxx */ int free_sv; /* 1 if svm_model created svm_load_model*/ /* 0 if svm_model created svm_train */ }; struct svm_model *svm_train(const struct svm_problem *prob, const struct svm_parameter *param); void svm_cross_validation(const struct svm_problem *prob, const struct svm_parameter *param, int nr_fold, double *target); int svm_save_model(const char *model_file_name, const struct svm_model *model); struct svm_model *svm_load_model(const char *model_file_name); int svm_get_svm_type(const struct svm_model *model); int svm_get_nr_class(const struct svm_model *model); void svm_get_labels(const struct svm_model *model, int *label); void svm_get_sv_indices(const struct svm_model *model, int *sv_indices); int svm_get_nr_sv(const struct svm_model *model); double svm_get_svr_probability(const struct svm_model *model); double svm_predict_values(const struct svm_model *model, const struct svm_node *x, double* dec_values); double svm_predict(const struct svm_model *model, const struct svm_node *x); double svm_predict_probability(const struct svm_model *model, const struct svm_node *x, double* prob_estimates); void svm_free_model_content(struct svm_model *model_ptr); void svm_free_and_destroy_model(struct svm_model **model_ptr_ptr); void svm_destroy_param(struct svm_parameter *param); const char *svm_check_parameter(const struct svm_problem *prob, const struct svm_parameter *param); int svm_check_probability_model(const struct svm_model *model); void svm_set_print_string_function(void (*print_func)(const char *)); #ifdef __cplusplus } #endif #endif /* _libsvm_h */ libsvm.c:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include "libsvm.h" #include "main.h" #define malloc(type,n) (type *)malloc((n)*sizeof(type)) struct svm_parameter param; // set parse_command_line struct svm_problem prob; // set read_problem struct svm_model *model; struct svm_node *x_space; struct svm_node ** x; struct svm_node *testnode; void makemodel2(void) { param.svm_type = c_svc; param.kernel_type = rbf; param.degree = 3; param.gamma = 0.5; param.coef0 = 0; param.nu = 0.5; param.cache_size = 100; param.c = 1; param.eps = 1e-3; param.p = 0.1; param.shrinking = 1; param.probability = 0; param.nr_weight = 0; param.weight_label = null; param.weight = null; //problem definition------------------------------------------------------------- prob.l = 4; //x values matrix of xor values (training data) double matrix[prob.l][2]; matrix[0][0] = 1; matrix[0][1] = 1; matrix[1][0] = 1; matrix[1][1] = 0; matrix[2][0] = 0; matrix[2][1] = 1; matrix[3][0] = 0; matrix[3][1] = 0; // part not understand struct svm_node** x = (struct svm_node * *)malloc((prob.l)*sizeof(struct svm_node *)); //trying assign matrix svm_node training examples (int row = 0;row <prob.l; row++){ struct svm_node* x_space = malloc(struct svm_node,3); (int col = 0;col < 2;col++){ x_space[col].index = col; x_space[col].value = matrix[row][col]; } x_space[2].index = -1; //each row of properties should terminated -1 according readme x[row] = x_space; } prob.x = x; //yvalues prob.y = (double *)malloc((prob.l)*sizeof(double)); prob.y[0] = -1; prob.y[1] = 1; prob.y[2] = 1; prob.y[3] = -1; //train model--------------------------------------------------------------------- struct svm_model *model = svm_train(&prob,¶m); //test model---------------------------------------------------------------------- struct svm_node *testnode = (struct svm_node *) malloc((3)*sizeof(struct svm_node)); testnode[0].index = 0; testnode[0].value = 1; testnode[1].index = 1; testnode[1].value = 0; testnode[2].index = -1; double retval = svm_predict(model,testnode); svm_destroy_param(¶m); free(prob.y); free(prob.x); free(x_space); }
Comments
Post a Comment