41 #ifndef __OPENCV_ML_HPP__
42 #define __OPENCV_ML_HPP__
46 #pragma warning( disable : 4996 )
54 #if defined WIN32 || defined _WIN32
58 #else // SKIP_INCLUDES
60 #if defined WIN32 || defined _WIN32
61 #define CV_CDECL __cdecl
62 #define CV_STDCALL __stdcall
70 #define CV_EXTERN_C extern "C"
71 #define CV_DEFAULT(val) = val
74 #define CV_DEFAULT(val)
78 #ifndef CV_EXTERN_C_FUNCPTR
80 #define CV_EXTERN_C_FUNCPTR(x) extern "C" { typedef x; }
82 #define CV_EXTERN_C_FUNCPTR(x) typedef x
87 #if defined __cplusplus
88 #define CV_INLINE inline
89 #elif (defined WIN32 || defined _WIN32) && !defined __GNUC__
90 #define CV_INLINE __inline
92 #define CV_INLINE static
96 #if (defined WIN32 || defined _WIN32) && defined CVAPI_EXPORTS
97 #define CV_EXPORTS __declspec(dllexport)
103 #define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL
106 #endif // SKIP_INCLUDES
120 #define CV_LOG2PI (1.8378770664093454835606594728112)
123 #define CV_COL_SAMPLE 0
126 #define CV_ROW_SAMPLE 1
128 #define CV_IS_ROW_SAMPLE(flags) ((flags) & CV_ROW_SAMPLE)
147 typedef struct CvParamLattice
155 CV_INLINE CvParamLattice cvParamLattice(
double min_val,
double max_val,
159 pl.min_val =
MIN( min_val, max_val );
160 pl.max_val =
MAX( min_val, max_val );
161 pl.step =
MAX( log_step, 1. );
165 CV_INLINE CvParamLattice cvDefaultParamLattice(
void )
167 CvParamLattice pl = {0,0,0};
173 #define CV_VAR_NUMERICAL 0
174 #define CV_VAR_ORDERED 0
175 #define CV_VAR_CATEGORICAL 1
177 #define CV_TYPE_NAME_ML_SVM "opencv-ml-svm"
178 #define CV_TYPE_NAME_ML_KNN "opencv-ml-knn"
179 #define CV_TYPE_NAME_ML_NBAYES "opencv-ml-bayesian"
180 #define CV_TYPE_NAME_ML_EM "opencv-ml-em"
181 #define CV_TYPE_NAME_ML_BOOSTING "opencv-ml-boost-tree"
182 #define CV_TYPE_NAME_ML_TREE "opencv-ml-tree"
183 #define CV_TYPE_NAME_ML_ANN_MLP "opencv-ml-ann-mlp"
184 #define CV_TYPE_NAME_ML_CNN "opencv-ml-cnn"
185 #define CV_TYPE_NAME_ML_RTREES "opencv-ml-random-trees"
186 #define CV_TYPE_NAME_ML_GBT "opencv-ml-gradient-boosting-trees"
188 #define CV_TRAIN_ERROR 0
189 #define CV_TEST_ERROR 1
197 virtual void clear();
199 CV_WRAP virtual void save(
const char* filename,
const char* name=0 )
const;
200 CV_WRAP virtual void load(
const char* filename,
const char* name=0 );
223 enum { SVM_C=0, SVM_GAMMA=1, SVM_P=2, SVM_NU=3, SVM_COEF=4, SVM_DEGREE=5 };
227 min_val = max_val = step = 0;
248 virtual ~CvNormalBayesClassifier();
250 CvNormalBayesClassifier(
const CvMat* trainData,
const CvMat* responses,
251 const CvMat* varIdx=0,
const CvMat* sampleIdx=0 );
253 virtual bool train(
const CvMat* trainData,
const CvMat* responses,
254 const CvMat* varIdx = 0,
const CvMat* sampleIdx=0,
bool update=
false );
256 virtual float predict(
const CvMat* samples,
CV_OUT CvMat* results=0 )
const;
295 virtual ~CvKNearest();
297 CvKNearest(
const CvMat* trainData,
const CvMat* responses,
298 const CvMat* sampleIdx=0,
bool isRegression=
false,
int max_k=32 );
300 virtual bool train(
const CvMat* trainData,
const CvMat* responses,
301 const CvMat* sampleIdx=0,
bool is_regression=
false,
302 int maxK=32,
bool updateBase=
false );
304 virtual float find_nearest(
const CvMat* samples,
int k,
CV_OUT CvMat* results=0,
309 const cv::Mat& sampleIdx=
cv::Mat(),
bool isRegression=
false,
int max_k=32 );
313 int maxK=32,
bool updateBase=
false );
315 virtual float find_nearest(
const cv::Mat& samples,
int k,
cv::Mat* results=0,
316 const float** neighbors=0,
cv::Mat* neighborResponses=0,
322 virtual void clear();
323 int get_max_k()
const;
324 int get_var_count()
const;
325 int get_sample_count()
const;
326 bool is_regression()
const;
330 virtual float write_results(
int k,
int k1,
int start,
int end,
331 const float* neighbor_responses,
const float* dist,
CvMat* _results,
334 virtual void find_neighbors_direct(
const CvMat* _samples,
int k,
int start,
int end,
335 float* neighbor_responses,
const float** neighbors,
float* dist )
const;
352 CvSVMParams(
int _svm_type,
int _kernel_type,
353 double _degree,
double _gamma,
double _coef0,
354 double Cvalue,
double _nu,
double _p,
374 const float* another,
float* results );
377 virtual bool create(
const CvSVMParams* params, Calc _calc_func );
380 virtual void clear();
381 virtual void calc(
int vcount,
int n,
const float** vecs,
const float* another,
float* results );
386 virtual void calc_non_rbf_base(
int vec_count,
int vec_size,
const float** vecs,
387 const float* another,
float* results,
388 double alpha,
double beta );
390 virtual void calc_linear(
int vec_count,
int vec_size,
const float** vecs,
391 const float* another,
float* results );
392 virtual void calc_rbf(
int vec_count,
int vec_size,
const float** vecs,
393 const float* another,
float* results );
394 virtual void calc_poly(
int vec_count,
int vec_size,
const float** vecs,
395 const float* another,
float* results );
396 virtual void calc_sigmoid(
int vec_count,
int vec_size,
const float** vecs,
397 const float* another,
float* results );
428 int alpha_count,
double* alpha,
double Cp,
double Cn,
430 SelectWorkingSet select_working_set, CalcRho calc_rho );
431 virtual bool create(
int count,
int var_count,
const float** samples,
schar*
y,
432 int alpha_count,
double* alpha,
double Cp,
double Cn,
434 SelectWorkingSet select_working_set, CalcRho calc_rho );
437 virtual void clear();
440 virtual bool solve_c_svc(
int count,
int var_count,
const float** samples,
schar*
y,
443 virtual bool solve_nu_svc(
int count,
int var_count,
const float** samples,
schar*
y,
446 virtual bool solve_one_class(
int count,
int var_count,
const float** samples,
450 virtual bool solve_eps_svr(
int count,
int var_count,
const float** samples,
const float*
y,
454 virtual bool solve_nu_svr(
int count,
int var_count,
const float** samples,
const float*
y,
458 virtual float* get_row_base(
int i,
bool* _existed );
459 virtual float* get_row(
int i,
float*
dst );
491 virtual bool select_working_set(
int& i,
int& j );
492 virtual bool select_working_set_nu_svm(
int& i,
int& j );
493 virtual void calc_rho(
double&
rho,
double& r );
494 virtual void calc_rho_nu_svm(
double&
rho,
double& r );
496 virtual float* get_row_svc(
int i,
float* row,
float*
dst,
bool existed );
497 virtual float* get_row_one_class(
int i,
float* row,
float*
dst,
bool existed );
498 virtual float* get_row_svr(
int i,
float* row,
float*
dst,
bool existed );
516 enum { C_SVC=100, NU_SVC=101, ONE_CLASS=102, EPS_SVR=103, NU_SVR=104 };
519 enum { LINEAR=0, POLY=1, RBF=2, SIGMOID=3 };
522 enum { C=0, GAMMA=1, P=2, NU=3, COEF=4, DEGREE=5 };
528 const CvMat* varIdx=0,
const CvMat* sampleIdx=0,
531 virtual bool train(
const CvMat* trainData,
const CvMat* responses,
532 const CvMat* varIdx=0,
const CvMat* sampleIdx=0,
535 virtual bool train_auto(
const CvMat* trainData,
const CvMat* responses,
544 bool balanced=
false );
546 virtual float predict(
const CvMat* sample,
bool returnDFVal=
false )
const;
566 bool balanced=
false);
567 CV_WRAP virtual float predict(
const cv::Mat& sample,
bool returnDFVal=
false )
const;
570 CV_WRAP virtual int get_support_vector_count()
const;
571 virtual const float* get_support_vector(
int i)
const;
575 static CvParamGrid get_default_grid(
int param_id );
583 virtual bool set_params(
const CvSVMParams& params );
584 virtual bool train1(
int sample_count,
int var_count,
const float** samples,
585 const void* responses,
double Cp,
double Cn,
587 virtual bool do_train(
int svm_type,
int sample_count,
int var_count,
const float** samples,
589 virtual void create_kernel();
590 virtual void create_solver();
592 virtual float predict(
const float* row_sample,
int row_len,
bool returnDFVal=
false )
const;
618 start_step(0), probs(0), weights(0), means(0), covs(0)
626 const CvMat* _probs=0,
const CvMat* _weights=0,
const CvMat* _means=0,
const CvMat** _covs=0 ) :
627 nclusters(_nclusters), cov_mat_type(_cov_mat_type), start_step(_start_step),
628 probs(_probs), weights(_weights), means(_means), covs(_covs), term_crit(_term_crit)
646 enum { COV_MAT_SPHERICAL=0, COV_MAT_DIAGONAL=1, COV_MAT_GENERIC=2 };
649 enum { START_E_STEP=1, START_M_STEP=2, START_AUTO_STEP=0 };
659 virtual bool train(
const CvMat* samples,
const CvMat* sampleIdx=0,
675 CV_WRAP int getNClusters()
const;
677 CV_WRAP void getCovs(
CV_OUT std::vector<cv::Mat>& covs)
const;
686 int get_nclusters()
const;
687 const CvMat* get_means()
const;
688 const CvMat** get_covs()
const;
689 const CvMat* get_weights()
const;
690 const CvMat* get_probs()
const;
700 virtual void set_params(
const CvEMParams& params,
702 virtual void init_em(
const CvVectors& train_data );
703 virtual double run_em(
const CvVectors& train_data );
704 virtual void init_auto(
const CvVectors& samples );
707 const CvMat* means );
731 #define CV_DTREE_CAT_DIR(idx,subset) \
732 (2*((subset[(idx)>>5]&(1 << ((idx) & 31)))==0)-1)
799 CvDTreeParams() : max_categories(10), max_depth(INT_MAX), min_sample_count(10),
800 cv_folds(10), use_surrogates(true), use_1se_rule(true),
801 truncate_pruned_tree(true), regression_accuracy(0.01f), priors(0)
805 float _regression_accuracy,
bool _use_surrogates,
806 int _max_categories,
int _cv_folds,
807 bool _use_1se_rule,
bool _truncate_pruned_tree,
808 const float* _priors ) :
809 max_categories(_max_categories), max_depth(_max_depth),
810 min_sample_count(_min_sample_count), cv_folds (_cv_folds),
811 use_surrogates(_use_surrogates), use_1se_rule(_use_1se_rule),
812 truncate_pruned_tree(_truncate_pruned_tree),
813 regression_accuracy(_regression_accuracy),
822 CvDTreeTrainData(
const CvMat* trainData,
int tflag,
823 const CvMat* responses,
const CvMat* varIdx=0,
824 const CvMat* sampleIdx=0,
const CvMat* varType=0,
825 const CvMat* missingDataMask=0,
827 bool _shared=
false,
bool _add_labels=
false );
828 virtual ~CvDTreeTrainData();
830 virtual void set_data(
const CvMat* trainData,
int tflag,
831 const CvMat* responses,
const CvMat* varIdx=0,
832 const CvMat* sampleIdx=0,
const CvMat* varType=0,
833 const CvMat* missingDataMask=0,
835 bool _shared=
false,
bool _add_labels=
false,
836 bool _update_data=
false );
837 virtual void do_responses_copy();
839 virtual void get_vectors(
const CvMat* _subsample_idx,
840 float* values,
uchar* missing,
float* responses,
bool get_class_idx=
false );
848 virtual void clear();
850 int get_num_classes()
const;
851 int get_var_type(
int vi)
const;
854 virtual const float* get_ord_responses(
CvDTreeNode* n,
float* values_buf,
int* sample_indices_buf );
855 virtual const int* get_class_labels(
CvDTreeNode* n,
int* labels_buf );
856 virtual const int* get_cv_labels(
CvDTreeNode* n,
int* labels_buf );
857 virtual const int* get_sample_indices(
CvDTreeNode* n,
int* indices_buf );
858 virtual const int* get_cat_var_data(
CvDTreeNode* n,
int vi,
int* cat_values_buf );
859 virtual void get_ord_var_data(
CvDTreeNode* n,
int vi,
float* ord_values_buf,
int* sorted_indices_buf,
860 const float** ord_values,
const int** sorted_indices,
int* sample_indices_buf );
867 int storage_idx,
int offset );
869 virtual CvDTreeSplit* new_split_ord(
int vi,
float cmp_val,
870 int split_point,
int inversed,
float quality );
871 virtual CvDTreeSplit* new_split_cat(
int vi,
float quality );
873 virtual void free_train_data();
926 struct DTreeBestSplitFinder;
927 struct ForestTreeBestSplitFinder;
936 virtual bool train(
const CvMat* trainData,
int tflag,
937 const CvMat* responses,
const CvMat* varIdx=0,
938 const CvMat* sampleIdx=0,
const CvMat* varType=0,
939 const CvMat* missingDataMask=0,
945 virtual float calc_error(
CvMLData* trainData,
int type, std::vector<float> *resp = 0 );
950 bool preprocessedInput=
false )
const;
960 bool preprocessedInput=
false )
const;
964 virtual const CvMat* get_var_importance();
976 int get_pruned_tree_idx()
const;
980 friend struct cv::DTreeBestSplitFinder;
982 virtual bool do_train(
const CvMat* _subsample_idx );
998 virtual void complete_node_dir(
CvDTreeNode* node );
999 virtual void cluster_categories(
const int* vectors,
int vector_count,
1000 int var_count,
int* sums,
int k,
int* cluster_labels );
1002 virtual void calc_node_value(
CvDTreeNode* node );
1004 virtual void prune_cv();
1005 virtual double update_tree_rnc(
int T,
int fold );
1006 virtual int cut_tree(
int T,
int fold,
double min_alpha );
1007 virtual void free_prune_data(
bool cut_tree);
1008 virtual void free_tree();
1044 virtual bool train(
const CvMat* trainData,
int tflag,
1045 const CvMat* responses,
const CvMat* varIdx=0,
1046 const CvMat* sampleIdx=0,
const CvMat* varType=0,
1047 const CvMat* missingDataMask=0,
1057 friend struct cv::ForestTreeBestSplitFinder;
1072 calc_var_importance(false), nactive_vars(0)
1078 float _regression_accuracy,
bool _use_surrogates,
1079 int _max_categories,
const float* _priors,
bool _calc_var_importance,
1080 int _nactive_vars,
int max_num_of_trees_in_the_forest,
1081 float forest_accuracy,
int termcrit_type ) :
1082 CvDTreeParams( _max_depth, _min_sample_count, _regression_accuracy,
1083 _use_surrogates, _max_categories, 0,
1084 false, false, _priors ),
1085 calc_var_importance(_calc_var_importance),
1086 nactive_vars(_nactive_vars)
1089 max_num_of_trees_in_the_forest, forest_accuracy);
1098 virtual ~CvRTrees();
1099 virtual bool train(
const CvMat* trainData,
int tflag,
1100 const CvMat* responses,
const CvMat* varIdx=0,
1101 const CvMat* sampleIdx=0,
const CvMat* varType=0,
1102 const CvMat* missingDataMask=0,
1106 virtual float predict(
const CvMat* sample,
const CvMat* missing = 0 )
const;
1107 virtual float predict_prob(
const CvMat* sample,
const CvMat* missing = 0 )
const;
1122 virtual const CvMat* get_var_importance();
1123 virtual float get_proximity(
const CvMat* sample1,
const CvMat* sample2,
1124 const CvMat* missing1 = 0,
const CvMat* missing2 = 0 )
const;
1126 virtual float calc_error(
CvMLData* _data,
int type , std::vector<float> *resp = 0 );
1128 virtual float get_train_error();
1133 CvMat* get_active_var_mask();
1136 int get_tree_count()
const;
1162 const CvMat* responses,
const CvMat* varIdx=0,
1163 const CvMat* sampleIdx=0,
const CvMat* varType=0,
1164 const CvMat* missingDataMask=0,
1166 bool _shared=
false,
bool _add_labels=
false,
1167 bool _update_data=
false );
1169 const float** ord_values,
const int** missing,
int* sample_buf = 0 );
1174 float* responses,
bool get_class_idx=
false );
1198 virtual ~CvERTrees();
1199 virtual bool train(
const CvMat* trainData,
int tflag,
1200 const CvMat* responses,
const CvMat* varIdx=0,
1201 const CvMat* sampleIdx=0,
const CvMat* varType=0,
1202 const CvMat* missingDataMask=0,
1229 CvBoostParams(
int boost_type,
int weak_count,
double weight_trim_rate,
1230 int max_depth,
bool use_surrogates,
const float* priors );
1245 virtual void scale(
double s );
1248 virtual void clear();
1251 virtual bool train(
const CvMat* trainData,
int tflag,
1252 const CvMat* responses,
const CvMat* varIdx=0,
1253 const CvMat* sampleIdx=0,
const CvMat* varType=0,
1254 const CvMat* missingDataMask=0,
1287 enum { DISCRETE=0, REAL=1, LOGIT=2, GENTLE=3 };
1290 enum { DEFAULT=0, GINI=1, MISCLASS=3, SQERR=4 };
1296 const CvMat* responses,
const CvMat* varIdx=0,
1297 const CvMat* sampleIdx=0,
const CvMat* varType=0,
1298 const CvMat* missingDataMask=0,
1301 virtual bool train(
const CvMat* trainData,
int tflag,
1302 const CvMat* responses,
const CvMat* varIdx=0,
1303 const CvMat* sampleIdx=0,
const CvMat* varType=0,
1304 const CvMat* missingDataMask=0,
1306 bool update=
false );
1308 virtual bool train(
CvMLData* data,
1310 bool update=
false );
1312 virtual float predict(
const CvMat* sample,
const CvMat* missing=0,
1314 bool raw_mode=
false,
bool return_sum=
false )
const;
1328 bool update=
false );
1332 bool returnSum=
false )
const;
1335 virtual float calc_error(
CvMLData* _data,
int type , std::vector<float> *resp = 0 );
1343 virtual const CvMat* get_active_vars(
bool absolute_idx=
true);
1345 CvSeq* get_weak_predictors();
1347 CvMat* get_weights();
1348 CvMat* get_subtree_weights();
1349 CvMat* get_weak_response();
1357 virtual void trim_weights();
1408 CvGBTreesParams(
int loss_function_type,
int weak_count,
float shrinkage,
1409 float subsample_portion,
int max_depth,
bool use_surrogates );
1487 enum {SQUARED_LOSS=0, ABSOLUTE_LOSS, HUBER_LOSS=3, DEVIANCE_LOSS};
1542 const CvMat* responses,
const CvMat* varIdx=0,
1543 const CvMat* sampleIdx=0,
const CvMat* varType=0,
1544 const CvMat* missingDataMask=0,
1593 virtual bool train(
const CvMat* trainData,
int tflag,
1594 const CvMat* responses,
const CvMat* varIdx=0,
1595 const CvMat* sampleIdx=0,
const CvMat* varType=0,
1596 const CvMat* missingDataMask=0,
1598 bool update=
false );
1617 virtual bool train(
CvMLData* data,
1619 bool update=
false );
1649 virtual float predict(
const CvMat* sample,
const CvMat* missing=0,
1685 virtual float calc_error(
CvMLData* _data,
int type,
1686 std::vector<float> *resp = 0 );
1733 bool update=
false );
1756 virtual void find_gradient(
const int k = 0);
1775 virtual void change_values(
CvDTree* tree,
const int k = 0);
1794 virtual float find_optimal_value(
const CvMat* _Idx );
1811 virtual void do_subsample();
1861 virtual bool problem_type()
const;
1932 CvANN_MLP_TrainParams(
CvTermCriteria term_crit,
int train_method,
1934 ~CvANN_MLP_TrainParams();
1936 enum { BACKPROP=0, RPROP=1 };
1953 CvANN_MLP(
const CvMat* layerSizes,
1955 double fparam1=0,
double fparam2=0 );
1957 virtual ~CvANN_MLP();
1959 virtual void create(
const CvMat* layerSizes,
1961 double fparam1=0,
double fparam2=0 );
1963 virtual int train(
const CvMat* inputs,
const CvMat* outputs,
1964 const CvMat* sampleWeights,
const CvMat* sampleIdx=0,
1972 double fparam1=0,
double fparam2=0 );
1976 double fparam1=0,
double fparam2=0 );
1989 enum { IDENTITY = 0, SIGMOID_SYM = 1, GAUSSIAN = 2 };
1992 enum { UPDATE_WEIGHTS = 1, NO_INPUT_SCALE = 2, NO_OUTPUT_SCALE = 4 };
1999 double* get_weights(
int layer)
2001 return layer_sizes && weights &&
2002 (unsigned)layer <= (
unsigned)layer_sizes->
cols ? weights[layer] : 0;
2007 virtual bool prepare_to_train(
const CvMat* _inputs,
const CvMat* _outputs,
2008 const CvMat* _sample_weights,
const CvMat* sampleIdx,
2017 virtual void calc_activ_func(
CvMat* xf,
const double* bias )
const;
2018 virtual void calc_activ_func_deriv(
CvMat* xf,
CvMat* deriv,
const double* bias )
const;
2019 virtual void set_activ_func(
int _activ_func=SIGMOID_SYM,
2020 double _f_param1=0,
double _f_param2=0 );
2021 virtual void init_weights();
2022 virtual void scale_input(
const CvMat* _src,
CvMat* _dst )
const;
2023 virtual void scale_output(
const CvMat* _src,
CvMat* _dst )
const;
2024 virtual void calc_input_scale(
const CvVectors* vecs,
int flags );
2025 virtual void calc_output_scale(
const CvVectors* vecs,
int flags );
2057 CvMat* sampClasses CV_DEFAULT(0) );
2059 #define CV_TS_CONCENTRIC_SPHERES 0
2066 int num_classes, ... );
2080 #define CV_PORTION 1
2093 } train_sample_part;
2115 int read_csv(
const char* filename);
2119 const CvMat* get_responses();
2123 void set_response_idx(
int idx );
2129 void mix_train_and_test_idx();
2132 const CvMat* get_var_idx();
2133 void chahge_var_idx(
int vi,
bool state );
2135 const CvMat* get_var_types();
2140 void set_var_types(
const char* str );
2143 void change_var_type(
int var_idx,
int type);
2145 void set_delimiter(
char ch );
2148 void set_miss_ch(
char ch );
2152 virtual void clear();
2154 void str_to_flt_elem(
const char* token,
float& flt_elem,
int& type);
2155 void free_train_test_idx();