2017-08-24 11 views
0

EclipseでCを使用してバイナリクラスの機械学習(2クラスのみ)を実行するためにLIBSVMを使用しようとしています。トレーニングデータを使用する前に、単純なXOR問題を実行して、LIBSVMが正しい出力値(+1とする予定)を予測できるかどうかを確認しました。Eclipse IDEのCでLIBSVMを使用しているエラー

私はプロジェクトを作成した後、undefined reference to '_Heap_Begin'undefined reference to '_Heap_Limit'undefined reference to '__reset_hardware'などのエラーが発生しました。

私はLIBSVMでREADMEファイルから続く命令である、「SRC」フォルダとI私のソースファイル内に既に#include 'svm.h'にフォルダとsvm_train.csvm.cppファイル「を含める」にsvm.hファイルを追加しました。 !?。私は

おかげ

誰もが私がここで間違ってやっているものを説明していただけます `" "You need to #include "svm.h" in your C/C++ source files and link your program with svm.cpp」を述べているREADMEファイルからのすべての指示に従っsvm.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; /* for poly */ 
    double gamma; /* for poly/rbf/sigmoid */ 
    double coef0; /* for poly/sigmoid */ 

    /* these are for training only */ 
    double cache_size; /* in MB */ 
    double eps; /* stopping criteria */ 
    double C; /* for C_SVC, EPSILON_SVR and NU_SVR */ 
    int nr_weight;  /* for C_SVC */ 
    int *weight_label; /* for C_SVC */ 
    double* weight;  /* for C_SVC */ 
    double nu; /* for NU_SVC, ONE_CLASS, and NU_SVR */ 
    double p; /* for EPSILON_SVR */ 
    int shrinking; /* use the shrinking heuristics */ 
    int probability; /* do 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 for 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] are values in [1,...,num_traning_data] to indicate SVs in the training set */ 

    /* for classification only */ 

    int *label;  /* label of each class (label[k]) */ 
    int *nSV;  /* number of SVs for each class (nSV[k]) */ 
       /* nSV[0] + nSV[1] + ... + nSV[k-1] = l */ 
    /* XXX */ 
    int free_sv;  /* 1 if svm_model is created by svm_load_model*/ 
       /* 0 if svm_model is created by 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 */ 

svm_train.c:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include <errno.h> 
#include "svm.h" 
#define Malloc(type,n) (type *)malloc((n)*sizeof(type)) 

struct svm_parameter param;  // set by parse_command_line 
struct svm_problem prob;  // set by read_problem 
struct svm_model *model; 
struct svm_node *x_space; 
struct svm_node ** x; 
struct svm_node *testnode; 

void main(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; 

    // this part i do not understand 
    struct svm_node** x = (struct svm_node * *)malloc((prob.l)*sizeof(struct svm_node *)); 

    //Trying to assign from matrix to svm_node training examples 
    for (int row = 0;row <prob.l; row++){ 
     struct svm_node* x_space = Malloc(struct svm_node,3); 
     for (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 be terminated with a -1 according to the 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,&param); 


    //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(&param); 
    free(prob.y); 
    free(prob.x); 
    free(x_space); 

} 
+0

ライブラリとリンクする必要があります。参照を見つけることができないので、それが苦情の理由です。 – LethalProgrammer

+0

@LethalProgrammerライブラリをプログラムにリンクするにはどうすればよいですか?すでに私のソースコードに追加してあり、 "svm_train.c"の関数は "svm.cpp"ファイルにあります。説明していただけますか? –

+0

これは、あなたがライブラリをリンクする方法を知るのに役立ちますが、eclipseではライブラリパスを追加し、プロパティにヘッダファイルの場所を含める必要があります。 https://stackoverflow.com/questions/6016815/how-to-include-needed-c-library-using-gcc – LethalProgrammer

答えて

0

これらの未定義シンボルはSVMに、しかし、あなたのツールチェーンに関連していないようです、あなたの開発環境の標準ライブラリが存在する必要があります。あなたがリンクしていないこと(あなたが開発しているプラ​​ットフォームを知らないので推測できない)

+0

しかし、エラーは、svm-train.cファイルとsvm.cppファイルを追加した場合にのみ発生します。これらのファイルを両方削除すると、エラーはなくなり、プロジェクトの残りの部分をビルドすることができました(これはLIBSVMとは関係ありません)。エラーはヒープメモリとは何か関係がありますか、scm.cppファイルを正しくリンクしていないためですか? –

+0

あなたのプロジェクトにはすべてのsvmコードがあります。ご覧のとおり、これらのシンボルはソースにありません。たぶん、ファイルのcpp拡張子が、他のCファイルとは異なるコンパイラー・オプションをトリガーしているのでしょうか? – bartoli

+0

私は参照してください。しかし、どうすればこの問題を解決できますか?私は私のCプログラムの残りの部分と私のcppファイルをリンクする方法がわかりません。 –