Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/ml/include/opencv2/ml.hpp
16337 views
1
/*M///////////////////////////////////////////////////////////////////////////////////////
2
//
3
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4
//
5
// By downloading, copying, installing or using the software you agree to this license.
6
// If you do not agree to this license, do not download, install,
7
// copy or use the software.
8
//
9
//
10
// License Agreement
11
// For Open Source Computer Vision Library
12
//
13
// Copyright (C) 2000, Intel Corporation, all rights reserved.
14
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
15
// Copyright (C) 2014, Itseez Inc, all rights reserved.
16
// Third party copyrights are property of their respective owners.
17
//
18
// Redistribution and use in source and binary forms, with or without modification,
19
// are permitted provided that the following conditions are met:
20
//
21
// * Redistribution's of source code must retain the above copyright notice,
22
// this list of conditions and the following disclaimer.
23
//
24
// * Redistribution's in binary form must reproduce the above copyright notice,
25
// this list of conditions and the following disclaimer in the documentation
26
// and/or other materials provided with the distribution.
27
//
28
// * The name of the copyright holders may not be used to endorse or promote products
29
// derived from this software without specific prior written permission.
30
//
31
// This software is provided by the copyright holders and contributors "as is" and
32
// any express or implied warranties, including, but not limited to, the implied
33
// warranties of merchantability and fitness for a particular purpose are disclaimed.
34
// In no event shall the Intel Corporation or contributors be liable for any direct,
35
// indirect, incidental, special, exemplary, or consequential damages
36
// (including, but not limited to, procurement of substitute goods or services;
37
// loss of use, data, or profits; or business interruption) however caused
38
// and on any theory of liability, whether in contract, strict liability,
39
// or tort (including negligence or otherwise) arising in any way out of
40
// the use of this software, even if advised of the possibility of such damage.
41
//
42
//M*/
43
44
#ifndef OPENCV_ML_HPP
45
#define OPENCV_ML_HPP
46
47
#ifdef __cplusplus
48
# include "opencv2/core.hpp"
49
#endif
50
51
#ifdef __cplusplus
52
53
#include <float.h>
54
#include <map>
55
#include <iostream>
56
57
/**
58
@defgroup ml Machine Learning
59
60
The Machine Learning Library (MLL) is a set of classes and functions for statistical
61
classification, regression, and clustering of data.
62
63
Most of the classification and regression algorithms are implemented as C++ classes. As the
64
algorithms have different sets of features (like an ability to handle missing measurements or
65
categorical input variables), there is a little common ground between the classes. This common
66
ground is defined by the class cv::ml::StatModel that all the other ML classes are derived from.
67
68
See detailed overview here: @ref ml_intro.
69
*/
70
71
namespace cv
72
{
73
74
namespace ml
75
{
76
77
//! @addtogroup ml
78
//! @{
79
80
/** @brief Variable types */
81
enum VariableTypes
82
{
83
VAR_NUMERICAL =0, //!< same as VAR_ORDERED
84
VAR_ORDERED =0, //!< ordered variables
85
VAR_CATEGORICAL =1 //!< categorical variables
86
};
87
88
/** @brief %Error types */
89
enum ErrorTypes
90
{
91
TEST_ERROR = 0,
92
TRAIN_ERROR = 1
93
};
94
95
/** @brief Sample types */
96
enum SampleTypes
97
{
98
ROW_SAMPLE = 0, //!< each training sample is a row of samples
99
COL_SAMPLE = 1 //!< each training sample occupies a column of samples
100
};
101
102
/** @brief The structure represents the logarithmic grid range of statmodel parameters.
103
104
It is used for optimizing statmodel accuracy by varying model parameters, the accuracy estimate
105
being computed by cross-validation.
106
*/
107
class CV_EXPORTS_W ParamGrid
108
{
109
public:
110
/** @brief Default constructor */
111
ParamGrid();
112
/** @brief Constructor with parameters */
113
ParamGrid(double _minVal, double _maxVal, double _logStep);
114
115
CV_PROP_RW double minVal; //!< Minimum value of the statmodel parameter. Default value is 0.
116
CV_PROP_RW double maxVal; //!< Maximum value of the statmodel parameter. Default value is 0.
117
/** @brief Logarithmic step for iterating the statmodel parameter.
118
119
The grid determines the following iteration sequence of the statmodel parameter values:
120
\f[(minVal, minVal*step, minVal*{step}^2, \dots, minVal*{logStep}^n),\f]
121
where \f$n\f$ is the maximal index satisfying
122
\f[\texttt{minVal} * \texttt{logStep} ^n < \texttt{maxVal}\f]
123
The grid is logarithmic, so logStep must always be greater then 1. Default value is 1.
124
*/
125
CV_PROP_RW double logStep;
126
127
/** @brief Creates a ParamGrid Ptr that can be given to the %SVM::trainAuto method
128
129
@param minVal minimum value of the parameter grid
130
@param maxVal maximum value of the parameter grid
131
@param logstep Logarithmic step for iterating the statmodel parameter
132
*/
133
CV_WRAP static Ptr<ParamGrid> create(double minVal=0., double maxVal=0., double logstep=1.);
134
};
135
136
/** @brief Class encapsulating training data.
137
138
Please note that the class only specifies the interface of training data, but not implementation.
139
All the statistical model classes in _ml_ module accepts Ptr\<TrainData\> as parameter. In other
140
words, you can create your own class derived from TrainData and pass smart pointer to the instance
141
of this class into StatModel::train.
142
143
@sa @ref ml_intro_data
144
*/
145
class CV_EXPORTS_W TrainData
146
{
147
public:
148
static inline float missingValue() { return FLT_MAX; }
149
virtual ~TrainData();
150
151
CV_WRAP virtual int getLayout() const = 0;
152
CV_WRAP virtual int getNTrainSamples() const = 0;
153
CV_WRAP virtual int getNTestSamples() const = 0;
154
CV_WRAP virtual int getNSamples() const = 0;
155
CV_WRAP virtual int getNVars() const = 0;
156
CV_WRAP virtual int getNAllVars() const = 0;
157
158
CV_WRAP virtual void getSample(InputArray varIdx, int sidx, float* buf) const = 0;
159
CV_WRAP virtual Mat getSamples() const = 0;
160
CV_WRAP virtual Mat getMissing() const = 0;
161
162
/** @brief Returns matrix of train samples
163
164
@param layout The requested layout. If it's different from the initial one, the matrix is
165
transposed. See ml::SampleTypes.
166
@param compressSamples if true, the function returns only the training samples (specified by
167
sampleIdx)
168
@param compressVars if true, the function returns the shorter training samples, containing only
169
the active variables.
170
171
In current implementation the function tries to avoid physical data copying and returns the
172
matrix stored inside TrainData (unless the transposition or compression is needed).
173
*/
174
CV_WRAP virtual Mat getTrainSamples(int layout=ROW_SAMPLE,
175
bool compressSamples=true,
176
bool compressVars=true) const = 0;
177
178
/** @brief Returns the vector of responses
179
180
The function returns ordered or the original categorical responses. Usually it's used in
181
regression algorithms.
182
*/
183
CV_WRAP virtual Mat getTrainResponses() const = 0;
184
185
/** @brief Returns the vector of normalized categorical responses
186
187
The function returns vector of responses. Each response is integer from `0` to `<number of
188
classes>-1`. The actual label value can be retrieved then from the class label vector, see
189
TrainData::getClassLabels.
190
*/
191
CV_WRAP virtual Mat getTrainNormCatResponses() const = 0;
192
CV_WRAP virtual Mat getTestResponses() const = 0;
193
CV_WRAP virtual Mat getTestNormCatResponses() const = 0;
194
CV_WRAP virtual Mat getResponses() const = 0;
195
CV_WRAP virtual Mat getNormCatResponses() const = 0;
196
CV_WRAP virtual Mat getSampleWeights() const = 0;
197
CV_WRAP virtual Mat getTrainSampleWeights() const = 0;
198
CV_WRAP virtual Mat getTestSampleWeights() const = 0;
199
CV_WRAP virtual Mat getVarIdx() const = 0;
200
CV_WRAP virtual Mat getVarType() const = 0;
201
CV_WRAP virtual Mat getVarSymbolFlags() const = 0;
202
CV_WRAP virtual int getResponseType() const = 0;
203
CV_WRAP virtual Mat getTrainSampleIdx() const = 0;
204
CV_WRAP virtual Mat getTestSampleIdx() const = 0;
205
CV_WRAP virtual void getValues(int vi, InputArray sidx, float* values) const = 0;
206
virtual void getNormCatValues(int vi, InputArray sidx, int* values) const = 0;
207
CV_WRAP virtual Mat getDefaultSubstValues() const = 0;
208
209
CV_WRAP virtual int getCatCount(int vi) const = 0;
210
211
/** @brief Returns the vector of class labels
212
213
The function returns vector of unique labels occurred in the responses.
214
*/
215
CV_WRAP virtual Mat getClassLabels() const = 0;
216
217
CV_WRAP virtual Mat getCatOfs() const = 0;
218
CV_WRAP virtual Mat getCatMap() const = 0;
219
220
/** @brief Splits the training data into the training and test parts
221
@sa TrainData::setTrainTestSplitRatio
222
*/
223
CV_WRAP virtual void setTrainTestSplit(int count, bool shuffle=true) = 0;
224
225
/** @brief Splits the training data into the training and test parts
226
227
The function selects a subset of specified relative size and then returns it as the training
228
set. If the function is not called, all the data is used for training. Please, note that for
229
each of TrainData::getTrain\* there is corresponding TrainData::getTest\*, so that the test
230
subset can be retrieved and processed as well.
231
@sa TrainData::setTrainTestSplit
232
*/
233
CV_WRAP virtual void setTrainTestSplitRatio(double ratio, bool shuffle=true) = 0;
234
CV_WRAP virtual void shuffleTrainTest() = 0;
235
236
/** @brief Returns matrix of test samples */
237
CV_WRAP virtual Mat getTestSamples() const = 0;
238
239
/** @brief Returns vector of symbolic names captured in loadFromCSV() */
240
CV_WRAP virtual void getNames(std::vector<String>& names) const = 0;
241
242
/** @brief Extract from 1D vector elements specified by passed indexes.
243
@param vec input vector (supported types: CV_32S, CV_32F, CV_64F)
244
@param idx 1D index vector
245
*/
246
static CV_WRAP Mat getSubVector(const Mat& vec, const Mat& idx);
247
248
/** @brief Extract from matrix rows/cols specified by passed indexes.
249
@param matrix input matrix (supported types: CV_32S, CV_32F, CV_64F)
250
@param idx 1D index vector
251
@param layout specifies to extract rows (cv::ml::ROW_SAMPLES) or to extract columns (cv::ml::COL_SAMPLES)
252
*/
253
static CV_WRAP Mat getSubMatrix(const Mat& matrix, const Mat& idx, int layout);
254
255
/** @brief Reads the dataset from a .csv file and returns the ready-to-use training data.
256
257
@param filename The input file name
258
@param headerLineCount The number of lines in the beginning to skip; besides the header, the
259
function also skips empty lines and lines staring with `#`
260
@param responseStartIdx Index of the first output variable. If -1, the function considers the
261
last variable as the response
262
@param responseEndIdx Index of the last output variable + 1. If -1, then there is single
263
response variable at responseStartIdx.
264
@param varTypeSpec The optional text string that specifies the variables' types. It has the
265
format `ord[n1-n2,n3,n4-n5,...]cat[n6,n7-n8,...]`. That is, variables from `n1 to n2`
266
(inclusive range), `n3`, `n4 to n5` ... are considered ordered and `n6`, `n7 to n8` ... are
267
considered as categorical. The range `[n1..n2] + [n3] + [n4..n5] + ... + [n6] + [n7..n8]`
268
should cover all the variables. If varTypeSpec is not specified, then algorithm uses the
269
following rules:
270
- all input variables are considered ordered by default. If some column contains has non-
271
numerical values, e.g. 'apple', 'pear', 'apple', 'apple', 'mango', the corresponding
272
variable is considered categorical.
273
- if there are several output variables, they are all considered as ordered. Error is
274
reported when non-numerical values are used.
275
- if there is a single output variable, then if its values are non-numerical or are all
276
integers, then it's considered categorical. Otherwise, it's considered ordered.
277
@param delimiter The character used to separate values in each line.
278
@param missch The character used to specify missing measurements. It should not be a digit.
279
Although it's a non-numerical value, it surely does not affect the decision of whether the
280
variable ordered or categorical.
281
@note If the dataset only contains input variables and no responses, use responseStartIdx = -2
282
and responseEndIdx = 0. The output variables vector will just contain zeros.
283
*/
284
static Ptr<TrainData> loadFromCSV(const String& filename,
285
int headerLineCount,
286
int responseStartIdx=-1,
287
int responseEndIdx=-1,
288
const String& varTypeSpec=String(),
289
char delimiter=',',
290
char missch='?');
291
292
/** @brief Creates training data from in-memory arrays.
293
294
@param samples matrix of samples. It should have CV_32F type.
295
@param layout see ml::SampleTypes.
296
@param responses matrix of responses. If the responses are scalar, they should be stored as a
297
single row or as a single column. The matrix should have type CV_32F or CV_32S (in the
298
former case the responses are considered as ordered by default; in the latter case - as
299
categorical)
300
@param varIdx vector specifying which variables to use for training. It can be an integer vector
301
(CV_32S) containing 0-based variable indices or byte vector (CV_8U) containing a mask of
302
active variables.
303
@param sampleIdx vector specifying which samples to use for training. It can be an integer
304
vector (CV_32S) containing 0-based sample indices or byte vector (CV_8U) containing a mask
305
of training samples.
306
@param sampleWeights optional vector with weights for each sample. It should have CV_32F type.
307
@param varType optional vector of type CV_8U and size `<number_of_variables_in_samples> +
308
<number_of_variables_in_responses>`, containing types of each input and output variable. See
309
ml::VariableTypes.
310
*/
311
CV_WRAP static Ptr<TrainData> create(InputArray samples, int layout, InputArray responses,
312
InputArray varIdx=noArray(), InputArray sampleIdx=noArray(),
313
InputArray sampleWeights=noArray(), InputArray varType=noArray());
314
};
315
316
/** @brief Base class for statistical models in OpenCV ML.
317
*/
318
class CV_EXPORTS_W StatModel : public Algorithm
319
{
320
public:
321
/** Predict options */
322
enum Flags {
323
UPDATE_MODEL = 1,
324
RAW_OUTPUT=1, //!< makes the method return the raw results (the sum), not the class label
325
COMPRESSED_INPUT=2,
326
PREPROCESSED_INPUT=4
327
};
328
329
/** @brief Returns the number of variables in training samples */
330
CV_WRAP virtual int getVarCount() const = 0;
331
332
CV_WRAP virtual bool empty() const CV_OVERRIDE;
333
334
/** @brief Returns true if the model is trained */
335
CV_WRAP virtual bool isTrained() const = 0;
336
/** @brief Returns true if the model is classifier */
337
CV_WRAP virtual bool isClassifier() const = 0;
338
339
/** @brief Trains the statistical model
340
341
@param trainData training data that can be loaded from file using TrainData::loadFromCSV or
342
created with TrainData::create.
343
@param flags optional flags, depending on the model. Some of the models can be updated with the
344
new training samples, not completely overwritten (such as NormalBayesClassifier or ANN_MLP).
345
*/
346
CV_WRAP virtual bool train( const Ptr<TrainData>& trainData, int flags=0 );
347
348
/** @brief Trains the statistical model
349
350
@param samples training samples
351
@param layout See ml::SampleTypes.
352
@param responses vector of responses associated with the training samples.
353
*/
354
CV_WRAP virtual bool train( InputArray samples, int layout, InputArray responses );
355
356
/** @brief Computes error on the training or test dataset
357
358
@param data the training data
359
@param test if true, the error is computed over the test subset of the data, otherwise it's
360
computed over the training subset of the data. Please note that if you loaded a completely
361
different dataset to evaluate already trained classifier, you will probably want not to set
362
the test subset at all with TrainData::setTrainTestSplitRatio and specify test=false, so
363
that the error is computed for the whole new set. Yes, this sounds a bit confusing.
364
@param resp the optional output responses.
365
366
The method uses StatModel::predict to compute the error. For regression models the error is
367
computed as RMS, for classifiers - as a percent of missclassified samples (0%-100%).
368
*/
369
CV_WRAP virtual float calcError( const Ptr<TrainData>& data, bool test, OutputArray resp ) const;
370
371
/** @brief Predicts response(s) for the provided sample(s)
372
373
@param samples The input samples, floating-point matrix
374
@param results The optional output matrix of results.
375
@param flags The optional flags, model-dependent. See cv::ml::StatModel::Flags.
376
*/
377
CV_WRAP virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const = 0;
378
379
/** @brief Create and train model with default parameters
380
381
The class must implement static `create()` method with no parameters or with all default parameter values
382
*/
383
template<typename _Tp> static Ptr<_Tp> train(const Ptr<TrainData>& data, int flags=0)
384
{
385
Ptr<_Tp> model = _Tp::create();
386
return !model.empty() && model->train(data, flags) ? model : Ptr<_Tp>();
387
}
388
};
389
390
/****************************************************************************************\
391
* Normal Bayes Classifier *
392
\****************************************************************************************/
393
394
/** @brief Bayes classifier for normally distributed data.
395
396
@sa @ref ml_intro_bayes
397
*/
398
class CV_EXPORTS_W NormalBayesClassifier : public StatModel
399
{
400
public:
401
/** @brief Predicts the response for sample(s).
402
403
The method estimates the most probable classes for input vectors. Input vectors (one or more)
404
are stored as rows of the matrix inputs. In case of multiple input vectors, there should be one
405
output vector outputs. The predicted class for a single input vector is returned by the method.
406
The vector outputProbs contains the output probabilities corresponding to each element of
407
result.
408
*/
409
CV_WRAP virtual float predictProb( InputArray inputs, OutputArray outputs,
410
OutputArray outputProbs, int flags=0 ) const = 0;
411
412
/** Creates empty model
413
Use StatModel::train to train the model after creation. */
414
CV_WRAP static Ptr<NormalBayesClassifier> create();
415
416
/** @brief Loads and creates a serialized NormalBayesClassifier from a file
417
*
418
* Use NormalBayesClassifier::save to serialize and store an NormalBayesClassifier to disk.
419
* Load the NormalBayesClassifier from this file again, by calling this function with the path to the file.
420
* Optionally specify the node for the file containing the classifier
421
*
422
* @param filepath path to serialized NormalBayesClassifier
423
* @param nodeName name of node containing the classifier
424
*/
425
CV_WRAP static Ptr<NormalBayesClassifier> load(const String& filepath , const String& nodeName = String());
426
};
427
428
/****************************************************************************************\
429
* K-Nearest Neighbour Classifier *
430
\****************************************************************************************/
431
432
/** @brief The class implements K-Nearest Neighbors model
433
434
@sa @ref ml_intro_knn
435
*/
436
class CV_EXPORTS_W KNearest : public StatModel
437
{
438
public:
439
440
/** Default number of neighbors to use in predict method. */
441
/** @see setDefaultK */
442
CV_WRAP virtual int getDefaultK() const = 0;
443
/** @copybrief getDefaultK @see getDefaultK */
444
CV_WRAP virtual void setDefaultK(int val) = 0;
445
446
/** Whether classification or regression model should be trained. */
447
/** @see setIsClassifier */
448
CV_WRAP virtual bool getIsClassifier() const = 0;
449
/** @copybrief getIsClassifier @see getIsClassifier */
450
CV_WRAP virtual void setIsClassifier(bool val) = 0;
451
452
/** Parameter for KDTree implementation. */
453
/** @see setEmax */
454
CV_WRAP virtual int getEmax() const = 0;
455
/** @copybrief getEmax @see getEmax */
456
CV_WRAP virtual void setEmax(int val) = 0;
457
458
/** %Algorithm type, one of KNearest::Types. */
459
/** @see setAlgorithmType */
460
CV_WRAP virtual int getAlgorithmType() const = 0;
461
/** @copybrief getAlgorithmType @see getAlgorithmType */
462
CV_WRAP virtual void setAlgorithmType(int val) = 0;
463
464
/** @brief Finds the neighbors and predicts responses for input vectors.
465
466
@param samples Input samples stored by rows. It is a single-precision floating-point matrix of
467
`<number_of_samples> * k` size.
468
@param k Number of used nearest neighbors. Should be greater than 1.
469
@param results Vector with results of prediction (regression or classification) for each input
470
sample. It is a single-precision floating-point vector with `<number_of_samples>` elements.
471
@param neighborResponses Optional output values for corresponding neighbors. It is a single-
472
precision floating-point matrix of `<number_of_samples> * k` size.
473
@param dist Optional output distances from the input vectors to the corresponding neighbors. It
474
is a single-precision floating-point matrix of `<number_of_samples> * k` size.
475
476
For each input vector (a row of the matrix samples), the method finds the k nearest neighbors.
477
In case of regression, the predicted result is a mean value of the particular vector's neighbor
478
responses. In case of classification, the class is determined by voting.
479
480
For each input vector, the neighbors are sorted by their distances to the vector.
481
482
In case of C++ interface you can use output pointers to empty matrices and the function will
483
allocate memory itself.
484
485
If only a single input vector is passed, all output matrices are optional and the predicted
486
value is returned by the method.
487
488
The function is parallelized with the TBB library.
489
*/
490
CV_WRAP virtual float findNearest( InputArray samples, int k,
491
OutputArray results,
492
OutputArray neighborResponses=noArray(),
493
OutputArray dist=noArray() ) const = 0;
494
495
/** @brief Implementations of KNearest algorithm
496
*/
497
enum Types
498
{
499
BRUTE_FORCE=1,
500
KDTREE=2
501
};
502
503
/** @brief Creates the empty model
504
505
The static method creates empty %KNearest classifier. It should be then trained using StatModel::train method.
506
*/
507
CV_WRAP static Ptr<KNearest> create();
508
};
509
510
/****************************************************************************************\
511
* Support Vector Machines *
512
\****************************************************************************************/
513
514
/** @brief Support Vector Machines.
515
516
@sa @ref ml_intro_svm
517
*/
518
class CV_EXPORTS_W SVM : public StatModel
519
{
520
public:
521
522
class CV_EXPORTS Kernel : public Algorithm
523
{
524
public:
525
virtual int getType() const = 0;
526
virtual void calc( int vcount, int n, const float* vecs, const float* another, float* results ) = 0;
527
};
528
529
/** Type of a %SVM formulation.
530
See SVM::Types. Default value is SVM::C_SVC. */
531
/** @see setType */
532
CV_WRAP virtual int getType() const = 0;
533
/** @copybrief getType @see getType */
534
CV_WRAP virtual void setType(int val) = 0;
535
536
/** Parameter \f$\gamma\f$ of a kernel function.
537
For SVM::POLY, SVM::RBF, SVM::SIGMOID or SVM::CHI2. Default value is 1. */
538
/** @see setGamma */
539
CV_WRAP virtual double getGamma() const = 0;
540
/** @copybrief getGamma @see getGamma */
541
CV_WRAP virtual void setGamma(double val) = 0;
542
543
/** Parameter _coef0_ of a kernel function.
544
For SVM::POLY or SVM::SIGMOID. Default value is 0.*/
545
/** @see setCoef0 */
546
CV_WRAP virtual double getCoef0() const = 0;
547
/** @copybrief getCoef0 @see getCoef0 */
548
CV_WRAP virtual void setCoef0(double val) = 0;
549
550
/** Parameter _degree_ of a kernel function.
551
For SVM::POLY. Default value is 0. */
552
/** @see setDegree */
553
CV_WRAP virtual double getDegree() const = 0;
554
/** @copybrief getDegree @see getDegree */
555
CV_WRAP virtual void setDegree(double val) = 0;
556
557
/** Parameter _C_ of a %SVM optimization problem.
558
For SVM::C_SVC, SVM::EPS_SVR or SVM::NU_SVR. Default value is 0. */
559
/** @see setC */
560
CV_WRAP virtual double getC() const = 0;
561
/** @copybrief getC @see getC */
562
CV_WRAP virtual void setC(double val) = 0;
563
564
/** Parameter \f$\nu\f$ of a %SVM optimization problem.
565
For SVM::NU_SVC, SVM::ONE_CLASS or SVM::NU_SVR. Default value is 0. */
566
/** @see setNu */
567
CV_WRAP virtual double getNu() const = 0;
568
/** @copybrief getNu @see getNu */
569
CV_WRAP virtual void setNu(double val) = 0;
570
571
/** Parameter \f$\epsilon\f$ of a %SVM optimization problem.
572
For SVM::EPS_SVR. Default value is 0. */
573
/** @see setP */
574
CV_WRAP virtual double getP() const = 0;
575
/** @copybrief getP @see getP */
576
CV_WRAP virtual void setP(double val) = 0;
577
578
/** Optional weights in the SVM::C_SVC problem, assigned to particular classes.
579
They are multiplied by _C_ so the parameter _C_ of class _i_ becomes `classWeights(i) * C`. Thus
580
these weights affect the misclassification penalty for different classes. The larger weight,
581
the larger penalty on misclassification of data from the corresponding class. Default value is
582
empty Mat. */
583
/** @see setClassWeights */
584
CV_WRAP virtual cv::Mat getClassWeights() const = 0;
585
/** @copybrief getClassWeights @see getClassWeights */
586
CV_WRAP virtual void setClassWeights(const cv::Mat &val) = 0;
587
588
/** Termination criteria of the iterative %SVM training procedure which solves a partial
589
case of constrained quadratic optimization problem.
590
You can specify tolerance and/or the maximum number of iterations. Default value is
591
`TermCriteria( TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, FLT_EPSILON )`; */
592
/** @see setTermCriteria */
593
CV_WRAP virtual cv::TermCriteria getTermCriteria() const = 0;
594
/** @copybrief getTermCriteria @see getTermCriteria */
595
CV_WRAP virtual void setTermCriteria(const cv::TermCriteria &val) = 0;
596
597
/** Type of a %SVM kernel.
598
See SVM::KernelTypes. Default value is SVM::RBF. */
599
CV_WRAP virtual int getKernelType() const = 0;
600
601
/** Initialize with one of predefined kernels.
602
See SVM::KernelTypes. */
603
CV_WRAP virtual void setKernel(int kernelType) = 0;
604
605
/** Initialize with custom kernel.
606
See SVM::Kernel class for implementation details */
607
virtual void setCustomKernel(const Ptr<Kernel> &_kernel) = 0;
608
609
//! %SVM type
610
enum Types {
611
/** C-Support Vector Classification. n-class classification (n \f$\geq\f$ 2), allows
612
imperfect separation of classes with penalty multiplier C for outliers. */
613
C_SVC=100,
614
/** \f$\nu\f$-Support Vector Classification. n-class classification with possible
615
imperfect separation. Parameter \f$\nu\f$ (in the range 0..1, the larger the value, the smoother
616
the decision boundary) is used instead of C. */
617
NU_SVC=101,
618
/** Distribution Estimation (One-class %SVM). All the training data are from
619
the same class, %SVM builds a boundary that separates the class from the rest of the feature
620
space. */
621
ONE_CLASS=102,
622
/** \f$\epsilon\f$-Support Vector Regression. The distance between feature vectors
623
from the training set and the fitting hyper-plane must be less than p. For outliers the
624
penalty multiplier C is used. */
625
EPS_SVR=103,
626
/** \f$\nu\f$-Support Vector Regression. \f$\nu\f$ is used instead of p.
627
See @cite LibSVM for details. */
628
NU_SVR=104
629
};
630
631
/** @brief %SVM kernel type
632
633
A comparison of different kernels on the following 2D test case with four classes. Four
634
SVM::C_SVC SVMs have been trained (one against rest) with auto_train. Evaluation on three
635
different kernels (SVM::CHI2, SVM::INTER, SVM::RBF). The color depicts the class with max score.
636
Bright means max-score \> 0, dark means max-score \< 0.
637
![image](pics/SVM_Comparison.png)
638
*/
639
enum KernelTypes {
640
/** Returned by SVM::getKernelType in case when custom kernel has been set */
641
CUSTOM=-1,
642
/** Linear kernel. No mapping is done, linear discrimination (or regression) is
643
done in the original feature space. It is the fastest option. \f$K(x_i, x_j) = x_i^T x_j\f$. */
644
LINEAR=0,
645
/** Polynomial kernel:
646
\f$K(x_i, x_j) = (\gamma x_i^T x_j + coef0)^{degree}, \gamma > 0\f$. */
647
POLY=1,
648
/** Radial basis function (RBF), a good choice in most cases.
649
\f$K(x_i, x_j) = e^{-\gamma ||x_i - x_j||^2}, \gamma > 0\f$. */
650
RBF=2,
651
/** Sigmoid kernel: \f$K(x_i, x_j) = \tanh(\gamma x_i^T x_j + coef0)\f$. */
652
SIGMOID=3,
653
/** Exponential Chi2 kernel, similar to the RBF kernel:
654
\f$K(x_i, x_j) = e^{-\gamma \chi^2(x_i,x_j)}, \chi^2(x_i,x_j) = (x_i-x_j)^2/(x_i+x_j), \gamma > 0\f$. */
655
CHI2=4,
656
/** Histogram intersection kernel. A fast kernel. \f$K(x_i, x_j) = min(x_i,x_j)\f$. */
657
INTER=5
658
};
659
660
//! %SVM params type
661
enum ParamTypes {
662
C=0,
663
GAMMA=1,
664
P=2,
665
NU=3,
666
COEF=4,
667
DEGREE=5
668
};
669
670
/** @brief Trains an %SVM with optimal parameters.
671
672
@param data the training data that can be constructed using TrainData::create or
673
TrainData::loadFromCSV.
674
@param kFold Cross-validation parameter. The training set is divided into kFold subsets. One
675
subset is used to test the model, the others form the train set. So, the %SVM algorithm is
676
executed kFold times.
677
@param Cgrid grid for C
678
@param gammaGrid grid for gamma
679
@param pGrid grid for p
680
@param nuGrid grid for nu
681
@param coeffGrid grid for coeff
682
@param degreeGrid grid for degree
683
@param balanced If true and the problem is 2-class classification then the method creates more
684
balanced cross-validation subsets that is proportions between classes in subsets are close
685
to such proportion in the whole train dataset.
686
687
The method trains the %SVM model automatically by choosing the optimal parameters C, gamma, p,
688
nu, coef0, degree. Parameters are considered optimal when the cross-validation
689
estimate of the test set error is minimal.
690
691
If there is no need to optimize a parameter, the corresponding grid step should be set to any
692
value less than or equal to 1. For example, to avoid optimization in gamma, set `gammaGrid.step
693
= 0`, `gammaGrid.minVal`, `gamma_grid.maxVal` as arbitrary numbers. In this case, the value
694
`Gamma` is taken for gamma.
695
696
And, finally, if the optimization in a parameter is required but the corresponding grid is
697
unknown, you may call the function SVM::getDefaultGrid. To generate a grid, for example, for
698
gamma, call `SVM::getDefaultGrid(SVM::GAMMA)`.
699
700
This function works for the classification (SVM::C_SVC or SVM::NU_SVC) as well as for the
701
regression (SVM::EPS_SVR or SVM::NU_SVR). If it is SVM::ONE_CLASS, no optimization is made and
702
the usual %SVM with parameters specified in params is executed.
703
*/
704
virtual bool trainAuto( const Ptr<TrainData>& data, int kFold = 10,
705
ParamGrid Cgrid = getDefaultGrid(C),
706
ParamGrid gammaGrid = getDefaultGrid(GAMMA),
707
ParamGrid pGrid = getDefaultGrid(P),
708
ParamGrid nuGrid = getDefaultGrid(NU),
709
ParamGrid coeffGrid = getDefaultGrid(COEF),
710
ParamGrid degreeGrid = getDefaultGrid(DEGREE),
711
bool balanced=false) = 0;
712
713
/** @brief Trains an %SVM with optimal parameters
714
715
@param samples training samples
716
@param layout See ml::SampleTypes.
717
@param responses vector of responses associated with the training samples.
718
@param kFold Cross-validation parameter. The training set is divided into kFold subsets. One
719
subset is used to test the model, the others form the train set. So, the %SVM algorithm is
720
@param Cgrid grid for C
721
@param gammaGrid grid for gamma
722
@param pGrid grid for p
723
@param nuGrid grid for nu
724
@param coeffGrid grid for coeff
725
@param degreeGrid grid for degree
726
@param balanced If true and the problem is 2-class classification then the method creates more
727
balanced cross-validation subsets that is proportions between classes in subsets are close
728
to such proportion in the whole train dataset.
729
730
The method trains the %SVM model automatically by choosing the optimal parameters C, gamma, p,
731
nu, coef0, degree. Parameters are considered optimal when the cross-validation
732
estimate of the test set error is minimal.
733
734
This function only makes use of SVM::getDefaultGrid for parameter optimization and thus only
735
offers rudimentary parameter options.
736
737
This function works for the classification (SVM::C_SVC or SVM::NU_SVC) as well as for the
738
regression (SVM::EPS_SVR or SVM::NU_SVR). If it is SVM::ONE_CLASS, no optimization is made and
739
the usual %SVM with parameters specified in params is executed.
740
*/
741
CV_WRAP virtual bool trainAuto(InputArray samples,
742
int layout,
743
InputArray responses,
744
int kFold = 10,
745
Ptr<ParamGrid> Cgrid = SVM::getDefaultGridPtr(SVM::C),
746
Ptr<ParamGrid> gammaGrid = SVM::getDefaultGridPtr(SVM::GAMMA),
747
Ptr<ParamGrid> pGrid = SVM::getDefaultGridPtr(SVM::P),
748
Ptr<ParamGrid> nuGrid = SVM::getDefaultGridPtr(SVM::NU),
749
Ptr<ParamGrid> coeffGrid = SVM::getDefaultGridPtr(SVM::COEF),
750
Ptr<ParamGrid> degreeGrid = SVM::getDefaultGridPtr(SVM::DEGREE),
751
bool balanced=false) = 0;
752
753
/** @brief Retrieves all the support vectors
754
755
The method returns all the support vectors as a floating-point matrix, where support vectors are
756
stored as matrix rows.
757
*/
758
CV_WRAP virtual Mat getSupportVectors() const = 0;
759
760
/** @brief Retrieves all the uncompressed support vectors of a linear %SVM
761
762
The method returns all the uncompressed support vectors of a linear %SVM that the compressed
763
support vector, used for prediction, was derived from. They are returned in a floating-point
764
matrix, where the support vectors are stored as matrix rows.
765
*/
766
CV_WRAP virtual Mat getUncompressedSupportVectors() const = 0;
767
768
/** @brief Retrieves the decision function
769
770
@param i the index of the decision function. If the problem solved is regression, 1-class or
771
2-class classification, then there will be just one decision function and the index should
772
always be 0. Otherwise, in the case of N-class classification, there will be \f$N(N-1)/2\f$
773
decision functions.
774
@param alpha the optional output vector for weights, corresponding to different support vectors.
775
In the case of linear %SVM all the alpha's will be 1's.
776
@param svidx the optional output vector of indices of support vectors within the matrix of
777
support vectors (which can be retrieved by SVM::getSupportVectors). In the case of linear
778
%SVM each decision function consists of a single "compressed" support vector.
779
780
The method returns rho parameter of the decision function, a scalar subtracted from the weighted
781
sum of kernel responses.
782
*/
783
CV_WRAP virtual double getDecisionFunction(int i, OutputArray alpha, OutputArray svidx) const = 0;
784
785
/** @brief Generates a grid for %SVM parameters.
786
787
@param param_id %SVM parameters IDs that must be one of the SVM::ParamTypes. The grid is
788
generated for the parameter with this ID.
789
790
The function generates a grid for the specified parameter of the %SVM algorithm. The grid may be
791
passed to the function SVM::trainAuto.
792
*/
793
static ParamGrid getDefaultGrid( int param_id );
794
795
/** @brief Generates a grid for %SVM parameters.
796
797
@param param_id %SVM parameters IDs that must be one of the SVM::ParamTypes. The grid is
798
generated for the parameter with this ID.
799
800
The function generates a grid pointer for the specified parameter of the %SVM algorithm.
801
The grid may be passed to the function SVM::trainAuto.
802
*/
803
CV_WRAP static Ptr<ParamGrid> getDefaultGridPtr( int param_id );
804
805
/** Creates empty model.
806
Use StatModel::train to train the model. Since %SVM has several parameters, you may want to
807
find the best parameters for your problem, it can be done with SVM::trainAuto. */
808
CV_WRAP static Ptr<SVM> create();
809
810
/** @brief Loads and creates a serialized svm from a file
811
*
812
* Use SVM::save to serialize and store an SVM to disk.
813
* Load the SVM from this file again, by calling this function with the path to the file.
814
*
815
* @param filepath path to serialized svm
816
*/
817
CV_WRAP static Ptr<SVM> load(const String& filepath);
818
};
819
820
/****************************************************************************************\
821
* Expectation - Maximization *
822
\****************************************************************************************/
823
824
/** @brief The class implements the Expectation Maximization algorithm.
825
826
@sa @ref ml_intro_em
827
*/
828
class CV_EXPORTS_W EM : public StatModel
829
{
830
public:
831
//! Type of covariation matrices
832
enum Types {
833
/** A scaled identity matrix \f$\mu_k * I\f$. There is the only
834
parameter \f$\mu_k\f$ to be estimated for each matrix. The option may be used in special cases,
835
when the constraint is relevant, or as a first step in the optimization (for example in case
836
when the data is preprocessed with PCA). The results of such preliminary estimation may be
837
passed again to the optimization procedure, this time with
838
covMatType=EM::COV_MAT_DIAGONAL. */
839
COV_MAT_SPHERICAL=0,
840
/** A diagonal matrix with positive diagonal elements. The number of
841
free parameters is d for each matrix. This is most commonly used option yielding good
842
estimation results. */
843
COV_MAT_DIAGONAL=1,
844
/** A symmetric positively defined matrix. The number of free
845
parameters in each matrix is about \f$d^2/2\f$. It is not recommended to use this option, unless
846
there is pretty accurate initial estimation of the parameters and/or a huge number of
847
training samples. */
848
COV_MAT_GENERIC=2,
849
COV_MAT_DEFAULT=COV_MAT_DIAGONAL
850
};
851
852
//! Default parameters
853
enum {DEFAULT_NCLUSTERS=5, DEFAULT_MAX_ITERS=100};
854
855
//! The initial step
856
enum {START_E_STEP=1, START_M_STEP=2, START_AUTO_STEP=0};
857
858
/** The number of mixture components in the Gaussian mixture model.
859
Default value of the parameter is EM::DEFAULT_NCLUSTERS=5. Some of %EM implementation could
860
determine the optimal number of mixtures within a specified value range, but that is not the
861
case in ML yet. */
862
/** @see setClustersNumber */
863
CV_WRAP virtual int getClustersNumber() const = 0;
864
/** @copybrief getClustersNumber @see getClustersNumber */
865
CV_WRAP virtual void setClustersNumber(int val) = 0;
866
867
/** Constraint on covariance matrices which defines type of matrices.
868
See EM::Types. */
869
/** @see setCovarianceMatrixType */
870
CV_WRAP virtual int getCovarianceMatrixType() const = 0;
871
/** @copybrief getCovarianceMatrixType @see getCovarianceMatrixType */
872
CV_WRAP virtual void setCovarianceMatrixType(int val) = 0;
873
874
/** The termination criteria of the %EM algorithm.
875
The %EM algorithm can be terminated by the number of iterations termCrit.maxCount (number of
876
M-steps) or when relative change of likelihood logarithm is less than termCrit.epsilon. Default
877
maximum number of iterations is EM::DEFAULT_MAX_ITERS=100. */
878
/** @see setTermCriteria */
879
CV_WRAP virtual TermCriteria getTermCriteria() const = 0;
880
/** @copybrief getTermCriteria @see getTermCriteria */
881
CV_WRAP virtual void setTermCriteria(const TermCriteria &val) = 0;
882
883
/** @brief Returns weights of the mixtures
884
885
Returns vector with the number of elements equal to the number of mixtures.
886
*/
887
CV_WRAP virtual Mat getWeights() const = 0;
888
/** @brief Returns the cluster centers (means of the Gaussian mixture)
889
890
Returns matrix with the number of rows equal to the number of mixtures and number of columns
891
equal to the space dimensionality.
892
*/
893
CV_WRAP virtual Mat getMeans() const = 0;
894
/** @brief Returns covariation matrices
895
896
Returns vector of covariation matrices. Number of matrices is the number of gaussian mixtures,
897
each matrix is a square floating-point matrix NxN, where N is the space dimensionality.
898
*/
899
CV_WRAP virtual void getCovs(CV_OUT std::vector<Mat>& covs) const = 0;
900
901
/** @brief Returns posterior probabilities for the provided samples
902
903
@param samples The input samples, floating-point matrix
904
@param results The optional output \f$ nSamples \times nClusters\f$ matrix of results. It contains
905
posterior probabilities for each sample from the input
906
@param flags This parameter will be ignored
907
*/
908
CV_WRAP virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const CV_OVERRIDE = 0;
909
910
/** @brief Returns a likelihood logarithm value and an index of the most probable mixture component
911
for the given sample.
912
913
@param sample A sample for classification. It should be a one-channel matrix of
914
\f$1 \times dims\f$ or \f$dims \times 1\f$ size.
915
@param probs Optional output matrix that contains posterior probabilities of each component
916
given the sample. It has \f$1 \times nclusters\f$ size and CV_64FC1 type.
917
918
The method returns a two-element double vector. Zero element is a likelihood logarithm value for
919
the sample. First element is an index of the most probable mixture component for the given
920
sample.
921
*/
922
CV_WRAP virtual Vec2d predict2(InputArray sample, OutputArray probs) const = 0;
923
924
/** @brief Estimate the Gaussian mixture parameters from a samples set.
925
926
This variation starts with Expectation step. Initial values of the model parameters will be
927
estimated by the k-means algorithm.
928
929
Unlike many of the ML models, %EM is an unsupervised learning algorithm and it does not take
930
responses (class labels or function values) as input. Instead, it computes the *Maximum
931
Likelihood Estimate* of the Gaussian mixture parameters from an input sample set, stores all the
932
parameters inside the structure: \f$p_{i,k}\f$ in probs, \f$a_k\f$ in means , \f$S_k\f$ in
933
covs[k], \f$\pi_k\f$ in weights , and optionally computes the output "class label" for each
934
sample: \f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most
935
probable mixture component for each sample).
936
937
The trained model can be used further for prediction, just like any other classifier. The
938
trained model is similar to the NormalBayesClassifier.
939
940
@param samples Samples from which the Gaussian mixture model will be estimated. It should be a
941
one-channel matrix, each row of which is a sample. If the matrix does not have CV_64F type
942
it will be converted to the inner matrix of such type for the further computing.
943
@param logLikelihoods The optional output matrix that contains a likelihood logarithm value for
944
each sample. It has \f$nsamples \times 1\f$ size and CV_64FC1 type.
945
@param labels The optional output "class label" for each sample:
946
\f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most probable
947
mixture component for each sample). It has \f$nsamples \times 1\f$ size and CV_32SC1 type.
948
@param probs The optional output matrix that contains posterior probabilities of each Gaussian
949
mixture component given the each sample. It has \f$nsamples \times nclusters\f$ size and
950
CV_64FC1 type.
951
*/
952
CV_WRAP virtual bool trainEM(InputArray samples,
953
OutputArray logLikelihoods=noArray(),
954
OutputArray labels=noArray(),
955
OutputArray probs=noArray()) = 0;
956
957
/** @brief Estimate the Gaussian mixture parameters from a samples set.
958
959
This variation starts with Expectation step. You need to provide initial means \f$a_k\f$ of
960
mixture components. Optionally you can pass initial weights \f$\pi_k\f$ and covariance matrices
961
\f$S_k\f$ of mixture components.
962
963
@param samples Samples from which the Gaussian mixture model will be estimated. It should be a
964
one-channel matrix, each row of which is a sample. If the matrix does not have CV_64F type
965
it will be converted to the inner matrix of such type for the further computing.
966
@param means0 Initial means \f$a_k\f$ of mixture components. It is a one-channel matrix of
967
\f$nclusters \times dims\f$ size. If the matrix does not have CV_64F type it will be
968
converted to the inner matrix of such type for the further computing.
969
@param covs0 The vector of initial covariance matrices \f$S_k\f$ of mixture components. Each of
970
covariance matrices is a one-channel matrix of \f$dims \times dims\f$ size. If the matrices
971
do not have CV_64F type they will be converted to the inner matrices of such type for the
972
further computing.
973
@param weights0 Initial weights \f$\pi_k\f$ of mixture components. It should be a one-channel
974
floating-point matrix with \f$1 \times nclusters\f$ or \f$nclusters \times 1\f$ size.
975
@param logLikelihoods The optional output matrix that contains a likelihood logarithm value for
976
each sample. It has \f$nsamples \times 1\f$ size and CV_64FC1 type.
977
@param labels The optional output "class label" for each sample:
978
\f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most probable
979
mixture component for each sample). It has \f$nsamples \times 1\f$ size and CV_32SC1 type.
980
@param probs The optional output matrix that contains posterior probabilities of each Gaussian
981
mixture component given the each sample. It has \f$nsamples \times nclusters\f$ size and
982
CV_64FC1 type.
983
*/
984
CV_WRAP virtual bool trainE(InputArray samples, InputArray means0,
985
InputArray covs0=noArray(),
986
InputArray weights0=noArray(),
987
OutputArray logLikelihoods=noArray(),
988
OutputArray labels=noArray(),
989
OutputArray probs=noArray()) = 0;
990
991
/** @brief Estimate the Gaussian mixture parameters from a samples set.
992
993
This variation starts with Maximization step. You need to provide initial probabilities
994
\f$p_{i,k}\f$ to use this option.
995
996
@param samples Samples from which the Gaussian mixture model will be estimated. It should be a
997
one-channel matrix, each row of which is a sample. If the matrix does not have CV_64F type
998
it will be converted to the inner matrix of such type for the further computing.
999
@param probs0
1000
@param logLikelihoods The optional output matrix that contains a likelihood logarithm value for
1001
each sample. It has \f$nsamples \times 1\f$ size and CV_64FC1 type.
1002
@param labels The optional output "class label" for each sample:
1003
\f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most probable
1004
mixture component for each sample). It has \f$nsamples \times 1\f$ size and CV_32SC1 type.
1005
@param probs The optional output matrix that contains posterior probabilities of each Gaussian
1006
mixture component given the each sample. It has \f$nsamples \times nclusters\f$ size and
1007
CV_64FC1 type.
1008
*/
1009
CV_WRAP virtual bool trainM(InputArray samples, InputArray probs0,
1010
OutputArray logLikelihoods=noArray(),
1011
OutputArray labels=noArray(),
1012
OutputArray probs=noArray()) = 0;
1013
1014
/** Creates empty %EM model.
1015
The model should be trained then using StatModel::train(traindata, flags) method. Alternatively, you
1016
can use one of the EM::train\* methods or load it from file using Algorithm::load\<EM\>(filename).
1017
*/
1018
CV_WRAP static Ptr<EM> create();
1019
1020
/** @brief Loads and creates a serialized EM from a file
1021
*
1022
* Use EM::save to serialize and store an EM to disk.
1023
* Load the EM from this file again, by calling this function with the path to the file.
1024
* Optionally specify the node for the file containing the classifier
1025
*
1026
* @param filepath path to serialized EM
1027
* @param nodeName name of node containing the classifier
1028
*/
1029
CV_WRAP static Ptr<EM> load(const String& filepath , const String& nodeName = String());
1030
};
1031
1032
/****************************************************************************************\
1033
* Decision Tree *
1034
\****************************************************************************************/
1035
1036
/** @brief The class represents a single decision tree or a collection of decision trees.
1037
1038
The current public interface of the class allows user to train only a single decision tree, however
1039
the class is capable of storing multiple decision trees and using them for prediction (by summing
1040
responses or using a voting schemes), and the derived from DTrees classes (such as RTrees and Boost)
1041
use this capability to implement decision tree ensembles.
1042
1043
@sa @ref ml_intro_trees
1044
*/
1045
class CV_EXPORTS_W DTrees : public StatModel
1046
{
1047
public:
1048
/** Predict options */
1049
enum Flags { PREDICT_AUTO=0, PREDICT_SUM=(1<<8), PREDICT_MAX_VOTE=(2<<8), PREDICT_MASK=(3<<8) };
1050
1051
/** Cluster possible values of a categorical variable into K\<=maxCategories clusters to
1052
find a suboptimal split.
1053
If a discrete variable, on which the training procedure tries to make a split, takes more than
1054
maxCategories values, the precise best subset estimation may take a very long time because the
1055
algorithm is exponential. Instead, many decision trees engines (including our implementation)
1056
try to find sub-optimal split in this case by clustering all the samples into maxCategories
1057
clusters that is some categories are merged together. The clustering is applied only in n \>
1058
2-class classification problems for categorical variables with N \> max_categories possible
1059
values. In case of regression and 2-class classification the optimal split can be found
1060
efficiently without employing clustering, thus the parameter is not used in these cases.
1061
Default value is 10.*/
1062
/** @see setMaxCategories */
1063
CV_WRAP virtual int getMaxCategories() const = 0;
1064
/** @copybrief getMaxCategories @see getMaxCategories */
1065
CV_WRAP virtual void setMaxCategories(int val) = 0;
1066
1067
/** The maximum possible depth of the tree.
1068
That is the training algorithms attempts to split a node while its depth is less than maxDepth.
1069
The root node has zero depth. The actual depth may be smaller if the other termination criteria
1070
are met (see the outline of the training procedure @ref ml_intro_trees "here"), and/or if the
1071
tree is pruned. Default value is INT_MAX.*/
1072
/** @see setMaxDepth */
1073
CV_WRAP virtual int getMaxDepth() const = 0;
1074
/** @copybrief getMaxDepth @see getMaxDepth */
1075
CV_WRAP virtual void setMaxDepth(int val) = 0;
1076
1077
/** If the number of samples in a node is less than this parameter then the node will not be split.
1078
1079
Default value is 10.*/
1080
/** @see setMinSampleCount */
1081
CV_WRAP virtual int getMinSampleCount() const = 0;
1082
/** @copybrief getMinSampleCount @see getMinSampleCount */
1083
CV_WRAP virtual void setMinSampleCount(int val) = 0;
1084
1085
/** If CVFolds \> 1 then algorithms prunes the built decision tree using K-fold
1086
cross-validation procedure where K is equal to CVFolds.
1087
Default value is 10.*/
1088
/** @see setCVFolds */
1089
CV_WRAP virtual int getCVFolds() const = 0;
1090
/** @copybrief getCVFolds @see getCVFolds */
1091
CV_WRAP virtual void setCVFolds(int val) = 0;
1092
1093
/** If true then surrogate splits will be built.
1094
These splits allow to work with missing data and compute variable importance correctly.
1095
Default value is false.
1096
@note currently it's not implemented.*/
1097
/** @see setUseSurrogates */
1098
CV_WRAP virtual bool getUseSurrogates() const = 0;
1099
/** @copybrief getUseSurrogates @see getUseSurrogates */
1100
CV_WRAP virtual void setUseSurrogates(bool val) = 0;
1101
1102
/** If true then a pruning will be harsher.
1103
This will make a tree more compact and more resistant to the training data noise but a bit less
1104
accurate. Default value is true.*/
1105
/** @see setUse1SERule */
1106
CV_WRAP virtual bool getUse1SERule() const = 0;
1107
/** @copybrief getUse1SERule @see getUse1SERule */
1108
CV_WRAP virtual void setUse1SERule(bool val) = 0;
1109
1110
/** If true then pruned branches are physically removed from the tree.
1111
Otherwise they are retained and it is possible to get results from the original unpruned (or
1112
pruned less aggressively) tree. Default value is true.*/
1113
/** @see setTruncatePrunedTree */
1114
CV_WRAP virtual bool getTruncatePrunedTree() const = 0;
1115
/** @copybrief getTruncatePrunedTree @see getTruncatePrunedTree */
1116
CV_WRAP virtual void setTruncatePrunedTree(bool val) = 0;
1117
1118
/** Termination criteria for regression trees.
1119
If all absolute differences between an estimated value in a node and values of train samples
1120
in this node are less than this parameter then the node will not be split further. Default
1121
value is 0.01f*/
1122
/** @see setRegressionAccuracy */
1123
CV_WRAP virtual float getRegressionAccuracy() const = 0;
1124
/** @copybrief getRegressionAccuracy @see getRegressionAccuracy */
1125
CV_WRAP virtual void setRegressionAccuracy(float val) = 0;
1126
1127
/** @brief The array of a priori class probabilities, sorted by the class label value.
1128
1129
The parameter can be used to tune the decision tree preferences toward a certain class. For
1130
example, if you want to detect some rare anomaly occurrence, the training base will likely
1131
contain much more normal cases than anomalies, so a very good classification performance
1132
will be achieved just by considering every case as normal. To avoid this, the priors can be
1133
specified, where the anomaly probability is artificially increased (up to 0.5 or even
1134
greater), so the weight of the misclassified anomalies becomes much bigger, and the tree is
1135
adjusted properly.
1136
1137
You can also think about this parameter as weights of prediction categories which determine
1138
relative weights that you give to misclassification. That is, if the weight of the first
1139
category is 1 and the weight of the second category is 10, then each mistake in predicting
1140
the second category is equivalent to making 10 mistakes in predicting the first category.
1141
Default value is empty Mat.*/
1142
/** @see setPriors */
1143
CV_WRAP virtual cv::Mat getPriors() const = 0;
1144
/** @copybrief getPriors @see getPriors */
1145
CV_WRAP virtual void setPriors(const cv::Mat &val) = 0;
1146
1147
/** @brief The class represents a decision tree node.
1148
*/
1149
class CV_EXPORTS Node
1150
{
1151
public:
1152
Node();
1153
double value; //!< Value at the node: a class label in case of classification or estimated
1154
//!< function value in case of regression.
1155
int classIdx; //!< Class index normalized to 0..class_count-1 range and assigned to the
1156
//!< node. It is used internally in classification trees and tree ensembles.
1157
int parent; //!< Index of the parent node
1158
int left; //!< Index of the left child node
1159
int right; //!< Index of right child node
1160
int defaultDir; //!< Default direction where to go (-1: left or +1: right). It helps in the
1161
//!< case of missing values.
1162
int split; //!< Index of the first split
1163
};
1164
1165
/** @brief The class represents split in a decision tree.
1166
*/
1167
class CV_EXPORTS Split
1168
{
1169
public:
1170
Split();
1171
int varIdx; //!< Index of variable on which the split is created.
1172
bool inversed; //!< If true, then the inverse split rule is used (i.e. left and right
1173
//!< branches are exchanged in the rule expressions below).
1174
float quality; //!< The split quality, a positive number. It is used to choose the best split.
1175
int next; //!< Index of the next split in the list of splits for the node
1176
float c; /**< The threshold value in case of split on an ordered variable.
1177
The rule is:
1178
@code{.none}
1179
if var_value < c
1180
then next_node <- left
1181
else next_node <- right
1182
@endcode */
1183
int subsetOfs; /**< Offset of the bitset used by the split on a categorical variable.
1184
The rule is:
1185
@code{.none}
1186
if bitset[var_value] == 1
1187
then next_node <- left
1188
else next_node <- right
1189
@endcode */
1190
};
1191
1192
/** @brief Returns indices of root nodes
1193
*/
1194
virtual const std::vector<int>& getRoots() const = 0;
1195
/** @brief Returns all the nodes
1196
1197
all the node indices are indices in the returned vector
1198
*/
1199
virtual const std::vector<Node>& getNodes() const = 0;
1200
/** @brief Returns all the splits
1201
1202
all the split indices are indices in the returned vector
1203
*/
1204
virtual const std::vector<Split>& getSplits() const = 0;
1205
/** @brief Returns all the bitsets for categorical splits
1206
1207
Split::subsetOfs is an offset in the returned vector
1208
*/
1209
virtual const std::vector<int>& getSubsets() const = 0;
1210
1211
/** @brief Creates the empty model
1212
1213
The static method creates empty decision tree with the specified parameters. It should be then
1214
trained using train method (see StatModel::train). Alternatively, you can load the model from
1215
file using Algorithm::load\<DTrees\>(filename).
1216
*/
1217
CV_WRAP static Ptr<DTrees> create();
1218
1219
/** @brief Loads and creates a serialized DTrees from a file
1220
*
1221
* Use DTree::save to serialize and store an DTree to disk.
1222
* Load the DTree from this file again, by calling this function with the path to the file.
1223
* Optionally specify the node for the file containing the classifier
1224
*
1225
* @param filepath path to serialized DTree
1226
* @param nodeName name of node containing the classifier
1227
*/
1228
CV_WRAP static Ptr<DTrees> load(const String& filepath , const String& nodeName = String());
1229
};
1230
1231
/****************************************************************************************\
1232
* Random Trees Classifier *
1233
\****************************************************************************************/
1234
1235
/** @brief The class implements the random forest predictor.
1236
1237
@sa @ref ml_intro_rtrees
1238
*/
1239
class CV_EXPORTS_W RTrees : public DTrees
1240
{
1241
public:
1242
1243
/** If true then variable importance will be calculated and then it can be retrieved by RTrees::getVarImportance.
1244
Default value is false.*/
1245
/** @see setCalculateVarImportance */
1246
CV_WRAP virtual bool getCalculateVarImportance() const = 0;
1247
/** @copybrief getCalculateVarImportance @see getCalculateVarImportance */
1248
CV_WRAP virtual void setCalculateVarImportance(bool val) = 0;
1249
1250
/** The size of the randomly selected subset of features at each tree node and that are used
1251
to find the best split(s).
1252
If you set it to 0 then the size will be set to the square root of the total number of
1253
features. Default value is 0.*/
1254
/** @see setActiveVarCount */
1255
CV_WRAP virtual int getActiveVarCount() const = 0;
1256
/** @copybrief getActiveVarCount @see getActiveVarCount */
1257
CV_WRAP virtual void setActiveVarCount(int val) = 0;
1258
1259
/** The termination criteria that specifies when the training algorithm stops.
1260
Either when the specified number of trees is trained and added to the ensemble or when
1261
sufficient accuracy (measured as OOB error) is achieved. Typically the more trees you have the
1262
better the accuracy. However, the improvement in accuracy generally diminishes and asymptotes
1263
pass a certain number of trees. Also to keep in mind, the number of tree increases the
1264
prediction time linearly. Default value is TermCriteria(TermCriteria::MAX_ITERS +
1265
TermCriteria::EPS, 50, 0.1)*/
1266
/** @see setTermCriteria */
1267
CV_WRAP virtual TermCriteria getTermCriteria() const = 0;
1268
/** @copybrief getTermCriteria @see getTermCriteria */
1269
CV_WRAP virtual void setTermCriteria(const TermCriteria &val) = 0;
1270
1271
/** Returns the variable importance array.
1272
The method returns the variable importance vector, computed at the training stage when
1273
CalculateVarImportance is set to true. If this flag was set to false, the empty matrix is
1274
returned.
1275
*/
1276
CV_WRAP virtual Mat getVarImportance() const = 0;
1277
1278
/** Returns the result of each individual tree in the forest.
1279
In case the model is a regression problem, the method will return each of the trees'
1280
results for each of the sample cases. If the model is a classifier, it will return
1281
a Mat with samples + 1 rows, where the first row gives the class number and the
1282
following rows return the votes each class had for each sample.
1283
@param samples Array containing the samples for which votes will be calculated.
1284
@param results Array where the result of the calculation will be written.
1285
@param flags Flags for defining the type of RTrees.
1286
*/
1287
CV_WRAP virtual void getVotes(InputArray samples, OutputArray results, int flags) const = 0;
1288
1289
/** Creates the empty model.
1290
Use StatModel::train to train the model, StatModel::train to create and train the model,
1291
Algorithm::load to load the pre-trained model.
1292
*/
1293
CV_WRAP static Ptr<RTrees> create();
1294
1295
/** @brief Loads and creates a serialized RTree from a file
1296
*
1297
* Use RTree::save to serialize and store an RTree to disk.
1298
* Load the RTree from this file again, by calling this function with the path to the file.
1299
* Optionally specify the node for the file containing the classifier
1300
*
1301
* @param filepath path to serialized RTree
1302
* @param nodeName name of node containing the classifier
1303
*/
1304
CV_WRAP static Ptr<RTrees> load(const String& filepath , const String& nodeName = String());
1305
};
1306
1307
/****************************************************************************************\
1308
* Boosted tree classifier *
1309
\****************************************************************************************/
1310
1311
/** @brief Boosted tree classifier derived from DTrees
1312
1313
@sa @ref ml_intro_boost
1314
*/
1315
class CV_EXPORTS_W Boost : public DTrees
1316
{
1317
public:
1318
/** Type of the boosting algorithm.
1319
See Boost::Types. Default value is Boost::REAL. */
1320
/** @see setBoostType */
1321
CV_WRAP virtual int getBoostType() const = 0;
1322
/** @copybrief getBoostType @see getBoostType */
1323
CV_WRAP virtual void setBoostType(int val) = 0;
1324
1325
/** The number of weak classifiers.
1326
Default value is 100. */
1327
/** @see setWeakCount */
1328
CV_WRAP virtual int getWeakCount() const = 0;
1329
/** @copybrief getWeakCount @see getWeakCount */
1330
CV_WRAP virtual void setWeakCount(int val) = 0;
1331
1332
/** A threshold between 0 and 1 used to save computational time.
1333
Samples with summary weight \f$\leq 1 - weight_trim_rate\f$ do not participate in the *next*
1334
iteration of training. Set this parameter to 0 to turn off this functionality. Default value is 0.95.*/
1335
/** @see setWeightTrimRate */
1336
CV_WRAP virtual double getWeightTrimRate() const = 0;
1337
/** @copybrief getWeightTrimRate @see getWeightTrimRate */
1338
CV_WRAP virtual void setWeightTrimRate(double val) = 0;
1339
1340
/** Boosting type.
1341
Gentle AdaBoost and Real AdaBoost are often the preferable choices. */
1342
enum Types {
1343
DISCRETE=0, //!< Discrete AdaBoost.
1344
REAL=1, //!< Real AdaBoost. It is a technique that utilizes confidence-rated predictions
1345
//!< and works well with categorical data.
1346
LOGIT=2, //!< LogitBoost. It can produce good regression fits.
1347
GENTLE=3 //!< Gentle AdaBoost. It puts less weight on outlier data points and for that
1348
//!<reason is often good with regression data.
1349
};
1350
1351
/** Creates the empty model.
1352
Use StatModel::train to train the model, Algorithm::load\<Boost\>(filename) to load the pre-trained model. */
1353
CV_WRAP static Ptr<Boost> create();
1354
1355
/** @brief Loads and creates a serialized Boost from a file
1356
*
1357
* Use Boost::save to serialize and store an RTree to disk.
1358
* Load the Boost from this file again, by calling this function with the path to the file.
1359
* Optionally specify the node for the file containing the classifier
1360
*
1361
* @param filepath path to serialized Boost
1362
* @param nodeName name of node containing the classifier
1363
*/
1364
CV_WRAP static Ptr<Boost> load(const String& filepath , const String& nodeName = String());
1365
};
1366
1367
/****************************************************************************************\
1368
* Gradient Boosted Trees *
1369
\****************************************************************************************/
1370
1371
/*class CV_EXPORTS_W GBTrees : public DTrees
1372
{
1373
public:
1374
struct CV_EXPORTS_W_MAP Params : public DTrees::Params
1375
{
1376
CV_PROP_RW int weakCount;
1377
CV_PROP_RW int lossFunctionType;
1378
CV_PROP_RW float subsamplePortion;
1379
CV_PROP_RW float shrinkage;
1380
1381
Params();
1382
Params( int lossFunctionType, int weakCount, float shrinkage,
1383
float subsamplePortion, int maxDepth, bool useSurrogates );
1384
};
1385
1386
enum {SQUARED_LOSS=0, ABSOLUTE_LOSS, HUBER_LOSS=3, DEVIANCE_LOSS};
1387
1388
virtual void setK(int k) = 0;
1389
1390
virtual float predictSerial( InputArray samples,
1391
OutputArray weakResponses, int flags) const = 0;
1392
1393
static Ptr<GBTrees> create(const Params& p);
1394
};*/
1395
1396
/****************************************************************************************\
1397
* Artificial Neural Networks (ANN) *
1398
\****************************************************************************************/
1399
1400
/////////////////////////////////// Multi-Layer Perceptrons //////////////////////////////
1401
1402
/** @brief Artificial Neural Networks - Multi-Layer Perceptrons.
1403
1404
Unlike many other models in ML that are constructed and trained at once, in the MLP model these
1405
steps are separated. First, a network with the specified topology is created using the non-default
1406
constructor or the method ANN_MLP::create. All the weights are set to zeros. Then, the network is
1407
trained using a set of input and output vectors. The training procedure can be repeated more than
1408
once, that is, the weights can be adjusted based on the new training data.
1409
1410
Additional flags for StatModel::train are available: ANN_MLP::TrainFlags.
1411
1412
@sa @ref ml_intro_ann
1413
*/
1414
class CV_EXPORTS_W ANN_MLP : public StatModel
1415
{
1416
public:
1417
/** Available training methods */
1418
enum TrainingMethods {
1419
BACKPROP=0, //!< The back-propagation algorithm.
1420
RPROP = 1, //!< The RPROP algorithm. See @cite RPROP93 for details.
1421
ANNEAL = 2 //!< The simulated annealing algorithm. See @cite Kirkpatrick83 for details.
1422
};
1423
1424
/** Sets training method and common parameters.
1425
@param method Default value is ANN_MLP::RPROP. See ANN_MLP::TrainingMethods.
1426
@param param1 passed to setRpropDW0 for ANN_MLP::RPROP and to setBackpropWeightScale for ANN_MLP::BACKPROP and to initialT for ANN_MLP::ANNEAL.
1427
@param param2 passed to setRpropDWMin for ANN_MLP::RPROP and to setBackpropMomentumScale for ANN_MLP::BACKPROP and to finalT for ANN_MLP::ANNEAL.
1428
*/
1429
CV_WRAP virtual void setTrainMethod(int method, double param1 = 0, double param2 = 0) = 0;
1430
1431
/** Returns current training method */
1432
CV_WRAP virtual int getTrainMethod() const = 0;
1433
1434
/** Initialize the activation function for each neuron.
1435
Currently the default and the only fully supported activation function is ANN_MLP::SIGMOID_SYM.
1436
@param type The type of activation function. See ANN_MLP::ActivationFunctions.
1437
@param param1 The first parameter of the activation function, \f$\alpha\f$. Default value is 0.
1438
@param param2 The second parameter of the activation function, \f$\beta\f$. Default value is 0.
1439
*/
1440
CV_WRAP virtual void setActivationFunction(int type, double param1 = 0, double param2 = 0) = 0;
1441
1442
/** Integer vector specifying the number of neurons in each layer including the input and output layers.
1443
The very first element specifies the number of elements in the input layer.
1444
The last element - number of elements in the output layer. Default value is empty Mat.
1445
@sa getLayerSizes */
1446
CV_WRAP virtual void setLayerSizes(InputArray _layer_sizes) = 0;
1447
1448
/** Integer vector specifying the number of neurons in each layer including the input and output layers.
1449
The very first element specifies the number of elements in the input layer.
1450
The last element - number of elements in the output layer.
1451
@sa setLayerSizes */
1452
CV_WRAP virtual cv::Mat getLayerSizes() const = 0;
1453
1454
/** Termination criteria of the training algorithm.
1455
You can specify the maximum number of iterations (maxCount) and/or how much the error could
1456
change between the iterations to make the algorithm continue (epsilon). Default value is
1457
TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, 0.01).*/
1458
/** @see setTermCriteria */
1459
CV_WRAP virtual TermCriteria getTermCriteria() const = 0;
1460
/** @copybrief getTermCriteria @see getTermCriteria */
1461
CV_WRAP virtual void setTermCriteria(TermCriteria val) = 0;
1462
1463
/** BPROP: Strength of the weight gradient term.
1464
The recommended value is about 0.1. Default value is 0.1.*/
1465
/** @see setBackpropWeightScale */
1466
CV_WRAP virtual double getBackpropWeightScale() const = 0;
1467
/** @copybrief getBackpropWeightScale @see getBackpropWeightScale */
1468
CV_WRAP virtual void setBackpropWeightScale(double val) = 0;
1469
1470
/** BPROP: Strength of the momentum term (the difference between weights on the 2 previous iterations).
1471
This parameter provides some inertia to smooth the random fluctuations of the weights. It can
1472
vary from 0 (the feature is disabled) to 1 and beyond. The value 0.1 or so is good enough.
1473
Default value is 0.1.*/
1474
/** @see setBackpropMomentumScale */
1475
CV_WRAP virtual double getBackpropMomentumScale() const = 0;
1476
/** @copybrief getBackpropMomentumScale @see getBackpropMomentumScale */
1477
CV_WRAP virtual void setBackpropMomentumScale(double val) = 0;
1478
1479
/** RPROP: Initial value \f$\Delta_0\f$ of update-values \f$\Delta_{ij}\f$.
1480
Default value is 0.1.*/
1481
/** @see setRpropDW0 */
1482
CV_WRAP virtual double getRpropDW0() const = 0;
1483
/** @copybrief getRpropDW0 @see getRpropDW0 */
1484
CV_WRAP virtual void setRpropDW0(double val) = 0;
1485
1486
/** RPROP: Increase factor \f$\eta^+\f$.
1487
It must be \>1. Default value is 1.2.*/
1488
/** @see setRpropDWPlus */
1489
CV_WRAP virtual double getRpropDWPlus() const = 0;
1490
/** @copybrief getRpropDWPlus @see getRpropDWPlus */
1491
CV_WRAP virtual void setRpropDWPlus(double val) = 0;
1492
1493
/** RPROP: Decrease factor \f$\eta^-\f$.
1494
It must be \<1. Default value is 0.5.*/
1495
/** @see setRpropDWMinus */
1496
CV_WRAP virtual double getRpropDWMinus() const = 0;
1497
/** @copybrief getRpropDWMinus @see getRpropDWMinus */
1498
CV_WRAP virtual void setRpropDWMinus(double val) = 0;
1499
1500
/** RPROP: Update-values lower limit \f$\Delta_{min}\f$.
1501
It must be positive. Default value is FLT_EPSILON.*/
1502
/** @see setRpropDWMin */
1503
CV_WRAP virtual double getRpropDWMin() const = 0;
1504
/** @copybrief getRpropDWMin @see getRpropDWMin */
1505
CV_WRAP virtual void setRpropDWMin(double val) = 0;
1506
1507
/** RPROP: Update-values upper limit \f$\Delta_{max}\f$.
1508
It must be \>1. Default value is 50.*/
1509
/** @see setRpropDWMax */
1510
CV_WRAP virtual double getRpropDWMax() const = 0;
1511
/** @copybrief getRpropDWMax @see getRpropDWMax */
1512
CV_WRAP virtual void setRpropDWMax(double val) = 0;
1513
1514
/** ANNEAL: Update initial temperature.
1515
It must be \>=0. Default value is 10.*/
1516
/** @see setAnnealInitialT */
1517
CV_WRAP virtual double getAnnealInitialT() const = 0;
1518
/** @copybrief getAnnealInitialT @see getAnnealInitialT */
1519
CV_WRAP virtual void setAnnealInitialT(double val) = 0;
1520
1521
/** ANNEAL: Update final temperature.
1522
It must be \>=0 and less than initialT. Default value is 0.1.*/
1523
/** @see setAnnealFinalT */
1524
CV_WRAP virtual double getAnnealFinalT() const = 0;
1525
/** @copybrief getAnnealFinalT @see getAnnealFinalT */
1526
CV_WRAP virtual void setAnnealFinalT(double val) = 0;
1527
1528
/** ANNEAL: Update cooling ratio.
1529
It must be \>0 and less than 1. Default value is 0.95.*/
1530
/** @see setAnnealCoolingRatio */
1531
CV_WRAP virtual double getAnnealCoolingRatio() const = 0;
1532
/** @copybrief getAnnealCoolingRatio @see getAnnealCoolingRatio */
1533
CV_WRAP virtual void setAnnealCoolingRatio(double val) = 0;
1534
1535
/** ANNEAL: Update iteration per step.
1536
It must be \>0 . Default value is 10.*/
1537
/** @see setAnnealItePerStep */
1538
CV_WRAP virtual int getAnnealItePerStep() const = 0;
1539
/** @copybrief getAnnealItePerStep @see getAnnealItePerStep */
1540
CV_WRAP virtual void setAnnealItePerStep(int val) = 0;
1541
1542
/** @brief Set/initialize anneal RNG */
1543
virtual void setAnnealEnergyRNG(const RNG& rng) = 0;
1544
1545
/** possible activation functions */
1546
enum ActivationFunctions {
1547
/** Identity function: \f$f(x)=x\f$ */
1548
IDENTITY = 0,
1549
/** Symmetrical sigmoid: \f$f(x)=\beta*(1-e^{-\alpha x})/(1+e^{-\alpha x})\f$
1550
@note
1551
If you are using the default sigmoid activation function with the default parameter values
1552
fparam1=0 and fparam2=0 then the function used is y = 1.7159\*tanh(2/3 \* x), so the output
1553
will range from [-1.7159, 1.7159], instead of [0,1].*/
1554
SIGMOID_SYM = 1,
1555
/** Gaussian function: \f$f(x)=\beta e^{-\alpha x*x}\f$ */
1556
GAUSSIAN = 2,
1557
/** ReLU function: \f$f(x)=max(0,x)\f$ */
1558
RELU = 3,
1559
/** Leaky ReLU function: for x>0 \f$f(x)=x \f$ and x<=0 \f$f(x)=\alpha x \f$*/
1560
LEAKYRELU= 4
1561
};
1562
1563
/** Train options */
1564
enum TrainFlags {
1565
/** Update the network weights, rather than compute them from scratch. In the latter case
1566
the weights are initialized using the Nguyen-Widrow algorithm. */
1567
UPDATE_WEIGHTS = 1,
1568
/** Do not normalize the input vectors. If this flag is not set, the training algorithm
1569
normalizes each input feature independently, shifting its mean value to 0 and making the
1570
standard deviation equal to 1. If the network is assumed to be updated frequently, the new
1571
training data could be much different from original one. In this case, you should take care
1572
of proper normalization. */
1573
NO_INPUT_SCALE = 2,
1574
/** Do not normalize the output vectors. If the flag is not set, the training algorithm
1575
normalizes each output feature independently, by transforming it to the certain range
1576
depending on the used activation function. */
1577
NO_OUTPUT_SCALE = 4
1578
};
1579
1580
CV_WRAP virtual Mat getWeights(int layerIdx) const = 0;
1581
1582
/** @brief Creates empty model
1583
1584
Use StatModel::train to train the model, Algorithm::load\<ANN_MLP\>(filename) to load the pre-trained model.
1585
Note that the train method has optional flags: ANN_MLP::TrainFlags.
1586
*/
1587
CV_WRAP static Ptr<ANN_MLP> create();
1588
1589
/** @brief Loads and creates a serialized ANN from a file
1590
*
1591
* Use ANN::save to serialize and store an ANN to disk.
1592
* Load the ANN from this file again, by calling this function with the path to the file.
1593
*
1594
* @param filepath path to serialized ANN
1595
*/
1596
CV_WRAP static Ptr<ANN_MLP> load(const String& filepath);
1597
1598
};
1599
1600
#ifndef DISABLE_OPENCV_3_COMPATIBILITY
1601
typedef ANN_MLP ANN_MLP_ANNEAL;
1602
#endif
1603
1604
/****************************************************************************************\
1605
* Logistic Regression *
1606
\****************************************************************************************/
1607
1608
/** @brief Implements Logistic Regression classifier.
1609
1610
@sa @ref ml_intro_lr
1611
*/
1612
class CV_EXPORTS_W LogisticRegression : public StatModel
1613
{
1614
public:
1615
1616
/** Learning rate. */
1617
/** @see setLearningRate */
1618
CV_WRAP virtual double getLearningRate() const = 0;
1619
/** @copybrief getLearningRate @see getLearningRate */
1620
CV_WRAP virtual void setLearningRate(double val) = 0;
1621
1622
/** Number of iterations. */
1623
/** @see setIterations */
1624
CV_WRAP virtual int getIterations() const = 0;
1625
/** @copybrief getIterations @see getIterations */
1626
CV_WRAP virtual void setIterations(int val) = 0;
1627
1628
/** Kind of regularization to be applied. See LogisticRegression::RegKinds. */
1629
/** @see setRegularization */
1630
CV_WRAP virtual int getRegularization() const = 0;
1631
/** @copybrief getRegularization @see getRegularization */
1632
CV_WRAP virtual void setRegularization(int val) = 0;
1633
1634
/** Kind of training method used. See LogisticRegression::Methods. */
1635
/** @see setTrainMethod */
1636
CV_WRAP virtual int getTrainMethod() const = 0;
1637
/** @copybrief getTrainMethod @see getTrainMethod */
1638
CV_WRAP virtual void setTrainMethod(int val) = 0;
1639
1640
/** Specifies the number of training samples taken in each step of Mini-Batch Gradient
1641
Descent. Will only be used if using LogisticRegression::MINI_BATCH training algorithm. It
1642
has to take values less than the total number of training samples. */
1643
/** @see setMiniBatchSize */
1644
CV_WRAP virtual int getMiniBatchSize() const = 0;
1645
/** @copybrief getMiniBatchSize @see getMiniBatchSize */
1646
CV_WRAP virtual void setMiniBatchSize(int val) = 0;
1647
1648
/** Termination criteria of the algorithm. */
1649
/** @see setTermCriteria */
1650
CV_WRAP virtual TermCriteria getTermCriteria() const = 0;
1651
/** @copybrief getTermCriteria @see getTermCriteria */
1652
CV_WRAP virtual void setTermCriteria(TermCriteria val) = 0;
1653
1654
//! Regularization kinds
1655
enum RegKinds {
1656
REG_DISABLE = -1, //!< Regularization disabled
1657
REG_L1 = 0, //!< %L1 norm
1658
REG_L2 = 1 //!< %L2 norm
1659
};
1660
1661
//! Training methods
1662
enum Methods {
1663
BATCH = 0,
1664
MINI_BATCH = 1 //!< Set MiniBatchSize to a positive integer when using this method.
1665
};
1666
1667
/** @brief Predicts responses for input samples and returns a float type.
1668
1669
@param samples The input data for the prediction algorithm. Matrix [m x n], where each row
1670
contains variables (features) of one object being classified. Should have data type CV_32F.
1671
@param results Predicted labels as a column matrix of type CV_32S.
1672
@param flags Not used.
1673
*/
1674
CV_WRAP virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const CV_OVERRIDE = 0;
1675
1676
/** @brief This function returns the trained parameters arranged across rows.
1677
1678
For a two class classifcation problem, it returns a row matrix. It returns learnt parameters of
1679
the Logistic Regression as a matrix of type CV_32F.
1680
*/
1681
CV_WRAP virtual Mat get_learnt_thetas() const = 0;
1682
1683
/** @brief Creates empty model.
1684
1685
Creates Logistic Regression model with parameters given.
1686
*/
1687
CV_WRAP static Ptr<LogisticRegression> create();
1688
1689
/** @brief Loads and creates a serialized LogisticRegression from a file
1690
*
1691
* Use LogisticRegression::save to serialize and store an LogisticRegression to disk.
1692
* Load the LogisticRegression from this file again, by calling this function with the path to the file.
1693
* Optionally specify the node for the file containing the classifier
1694
*
1695
* @param filepath path to serialized LogisticRegression
1696
* @param nodeName name of node containing the classifier
1697
*/
1698
CV_WRAP static Ptr<LogisticRegression> load(const String& filepath , const String& nodeName = String());
1699
};
1700
1701
1702
/****************************************************************************************\
1703
* Stochastic Gradient Descent SVM Classifier *
1704
\****************************************************************************************/
1705
1706
/*!
1707
@brief Stochastic Gradient Descent SVM classifier
1708
1709
SVMSGD provides a fast and easy-to-use implementation of the SVM classifier using the Stochastic Gradient Descent approach,
1710
as presented in @cite bottou2010large.
1711
1712
The classifier has following parameters:
1713
- model type,
1714
- margin type,
1715
- margin regularization (\f$\lambda\f$),
1716
- initial step size (\f$\gamma_0\f$),
1717
- step decreasing power (\f$c\f$),
1718
- and termination criteria.
1719
1720
The model type may have one of the following values: \ref SGD and \ref ASGD.
1721
1722
- \ref SGD is the classic version of SVMSGD classifier: every next step is calculated by the formula
1723
\f[w_{t+1} = w_t - \gamma(t) \frac{dQ_i}{dw} |_{w = w_t}\f]
1724
where
1725
- \f$w_t\f$ is the weights vector for decision function at step \f$t\f$,
1726
- \f$\gamma(t)\f$ is the step size of model parameters at the iteration \f$t\f$, it is decreased on each step by the formula
1727
\f$\gamma(t) = \gamma_0 (1 + \lambda \gamma_0 t) ^ {-c}\f$
1728
- \f$Q_i\f$ is the target functional from SVM task for sample with number \f$i\f$, this sample is chosen stochastically on each step of the algorithm.
1729
1730
- \ref ASGD is Average Stochastic Gradient Descent SVM Classifier. ASGD classifier averages weights vector on each step of algorithm by the formula
1731
\f$\widehat{w}_{t+1} = \frac{t}{1+t}\widehat{w}_{t} + \frac{1}{1+t}w_{t+1}\f$
1732
1733
The recommended model type is ASGD (following @cite bottou2010large).
1734
1735
The margin type may have one of the following values: \ref SOFT_MARGIN or \ref HARD_MARGIN.
1736
1737
- You should use \ref HARD_MARGIN type, if you have linearly separable sets.
1738
- You should use \ref SOFT_MARGIN type, if you have non-linearly separable sets or sets with outliers.
1739
- In the general case (if you know nothing about linear separability of your sets), use SOFT_MARGIN.
1740
1741
The other parameters may be described as follows:
1742
- Margin regularization parameter is responsible for weights decreasing at each step and for the strength of restrictions on outliers
1743
(the less the parameter, the less probability that an outlier will be ignored).
1744
Recommended value for SGD model is 0.0001, for ASGD model is 0.00001.
1745
1746
- Initial step size parameter is the initial value for the step size \f$\gamma(t)\f$.
1747
You will have to find the best initial step for your problem.
1748
1749
- Step decreasing power is the power parameter for \f$\gamma(t)\f$ decreasing by the formula, mentioned above.
1750
Recommended value for SGD model is 1, for ASGD model is 0.75.
1751
1752
- Termination criteria can be TermCriteria::COUNT, TermCriteria::EPS or TermCriteria::COUNT + TermCriteria::EPS.
1753
You will have to find the best termination criteria for your problem.
1754
1755
Note that the parameters margin regularization, initial step size, and step decreasing power should be positive.
1756
1757
To use SVMSGD algorithm do as follows:
1758
1759
- first, create the SVMSGD object. The algoorithm will set optimal parameters by default, but you can set your own parameters via functions setSvmsgdType(),
1760
setMarginType(), setMarginRegularization(), setInitialStepSize(), and setStepDecreasingPower().
1761
1762
- then the SVM model can be trained using the train features and the correspondent labels by the method train().
1763
1764
- after that, the label of a new feature vector can be predicted using the method predict().
1765
1766
@code
1767
// Create empty object
1768
cv::Ptr<SVMSGD> svmsgd = SVMSGD::create();
1769
1770
// Train the Stochastic Gradient Descent SVM
1771
svmsgd->train(trainData);
1772
1773
// Predict labels for the new samples
1774
svmsgd->predict(samples, responses);
1775
@endcode
1776
1777
*/
1778
1779
class CV_EXPORTS_W SVMSGD : public cv::ml::StatModel
1780
{
1781
public:
1782
1783
/** SVMSGD type.
1784
ASGD is often the preferable choice. */
1785
enum SvmsgdType
1786
{
1787
SGD, //!< Stochastic Gradient Descent
1788
ASGD //!< Average Stochastic Gradient Descent
1789
};
1790
1791
/** Margin type.*/
1792
enum MarginType
1793
{
1794
SOFT_MARGIN, //!< General case, suits to the case of non-linearly separable sets, allows outliers.
1795
HARD_MARGIN //!< More accurate for the case of linearly separable sets.
1796
};
1797
1798
/**
1799
* @return the weights of the trained model (decision function f(x) = weights * x + shift).
1800
*/
1801
CV_WRAP virtual Mat getWeights() = 0;
1802
1803
/**
1804
* @return the shift of the trained model (decision function f(x) = weights * x + shift).
1805
*/
1806
CV_WRAP virtual float getShift() = 0;
1807
1808
/** @brief Creates empty model.
1809
* Use StatModel::train to train the model. Since %SVMSGD has several parameters, you may want to
1810
* find the best parameters for your problem or use setOptimalParameters() to set some default parameters.
1811
*/
1812
CV_WRAP static Ptr<SVMSGD> create();
1813
1814
/** @brief Loads and creates a serialized SVMSGD from a file
1815
*
1816
* Use SVMSGD::save to serialize and store an SVMSGD to disk.
1817
* Load the SVMSGD from this file again, by calling this function with the path to the file.
1818
* Optionally specify the node for the file containing the classifier
1819
*
1820
* @param filepath path to serialized SVMSGD
1821
* @param nodeName name of node containing the classifier
1822
*/
1823
CV_WRAP static Ptr<SVMSGD> load(const String& filepath , const String& nodeName = String());
1824
1825
/** @brief Function sets optimal parameters values for chosen SVM SGD model.
1826
* @param svmsgdType is the type of SVMSGD classifier.
1827
* @param marginType is the type of margin constraint.
1828
*/
1829
CV_WRAP virtual void setOptimalParameters(int svmsgdType = SVMSGD::ASGD, int marginType = SVMSGD::SOFT_MARGIN) = 0;
1830
1831
/** @brief %Algorithm type, one of SVMSGD::SvmsgdType. */
1832
/** @see setSvmsgdType */
1833
CV_WRAP virtual int getSvmsgdType() const = 0;
1834
/** @copybrief getSvmsgdType @see getSvmsgdType */
1835
CV_WRAP virtual void setSvmsgdType(int svmsgdType) = 0;
1836
1837
/** @brief %Margin type, one of SVMSGD::MarginType. */
1838
/** @see setMarginType */
1839
CV_WRAP virtual int getMarginType() const = 0;
1840
/** @copybrief getMarginType @see getMarginType */
1841
CV_WRAP virtual void setMarginType(int marginType) = 0;
1842
1843
/** @brief Parameter marginRegularization of a %SVMSGD optimization problem. */
1844
/** @see setMarginRegularization */
1845
CV_WRAP virtual float getMarginRegularization() const = 0;
1846
/** @copybrief getMarginRegularization @see getMarginRegularization */
1847
CV_WRAP virtual void setMarginRegularization(float marginRegularization) = 0;
1848
1849
/** @brief Parameter initialStepSize of a %SVMSGD optimization problem. */
1850
/** @see setInitialStepSize */
1851
CV_WRAP virtual float getInitialStepSize() const = 0;
1852
/** @copybrief getInitialStepSize @see getInitialStepSize */
1853
CV_WRAP virtual void setInitialStepSize(float InitialStepSize) = 0;
1854
1855
/** @brief Parameter stepDecreasingPower of a %SVMSGD optimization problem. */
1856
/** @see setStepDecreasingPower */
1857
CV_WRAP virtual float getStepDecreasingPower() const = 0;
1858
/** @copybrief getStepDecreasingPower @see getStepDecreasingPower */
1859
CV_WRAP virtual void setStepDecreasingPower(float stepDecreasingPower) = 0;
1860
1861
/** @brief Termination criteria of the training algorithm.
1862
You can specify the maximum number of iterations (maxCount) and/or how much the error could
1863
change between the iterations to make the algorithm continue (epsilon).*/
1864
/** @see setTermCriteria */
1865
CV_WRAP virtual TermCriteria getTermCriteria() const = 0;
1866
/** @copybrief getTermCriteria @see getTermCriteria */
1867
CV_WRAP virtual void setTermCriteria(const cv::TermCriteria &val) = 0;
1868
};
1869
1870
1871
/****************************************************************************************\
1872
* Auxiliary functions declarations *
1873
\****************************************************************************************/
1874
1875
/** @brief Generates _sample_ from multivariate normal distribution
1876
1877
@param mean an average row vector
1878
@param cov symmetric covariation matrix
1879
@param nsamples returned samples count
1880
@param samples returned samples array
1881
*/
1882
CV_EXPORTS void randMVNormal( InputArray mean, InputArray cov, int nsamples, OutputArray samples);
1883
1884
/** @brief Creates test set */
1885
CV_EXPORTS void createConcentricSpheresTestSet( int nsamples, int nfeatures, int nclasses,
1886
OutputArray samples, OutputArray responses);
1887
1888
1889
/****************************************************************************************\
1890
* Simulated annealing solver *
1891
\****************************************************************************************/
1892
1893
#ifdef CV_DOXYGEN
1894
/** @brief This class declares example interface for system state used in simulated annealing optimization algorithm.
1895
1896
@note This class is not defined in C++ code and can't be use directly - you need your own implementation with the same methods.
1897
*/
1898
struct SimulatedAnnealingSolverSystem
1899
{
1900
/** Give energy value for a state of system.*/
1901
double energy() const;
1902
/** Function which change the state of system (random perturbation).*/
1903
void changeState();
1904
/** Function to reverse to the previous state. Can be called once only after changeState(). */
1905
void reverseState();
1906
};
1907
#endif // CV_DOXYGEN
1908
1909
/** @brief The class implements simulated annealing for optimization.
1910
1911
@cite Kirkpatrick83 for details
1912
1913
@param solverSystem optimization system (see SimulatedAnnealingSolverSystem)
1914
@param initialTemperature initial temperature
1915
@param finalTemperature final temperature
1916
@param coolingRatio temperature step multiplies
1917
@param iterationsPerStep number of iterations per temperature changing step
1918
@param lastTemperature optional output for last used temperature
1919
@param rngEnergy specify custom random numbers generator (cv::theRNG() by default)
1920
*/
1921
template<class SimulatedAnnealingSolverSystem>
1922
int simulatedAnnealingSolver(SimulatedAnnealingSolverSystem& solverSystem,
1923
double initialTemperature, double finalTemperature, double coolingRatio,
1924
size_t iterationsPerStep,
1925
CV_OUT double* lastTemperature = NULL,
1926
cv::RNG& rngEnergy = cv::theRNG()
1927
);
1928
1929
//! @} ml
1930
1931
}
1932
}
1933
1934
#include <opencv2/ml/ml.inl.hpp>
1935
1936
#endif // __cplusplus
1937
#endif // OPENCV_ML_HPP
1938
1939
/* End of file. */
1940
1941