/work/install-coverage/include/opencv4/opencv2/ml.hpp
Line | Count | Source (jump to first uncovered line) |
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 than 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 | 0 | 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 | | /** @brief Loads and creates a serialized knearest from a file |
509 | | * |
510 | | * Use KNearest::save to serialize and store an KNearest to disk. |
511 | | * Load the KNearest from this file again, by calling this function with the path to the file. |
512 | | * |
513 | | * @param filepath path to serialized KNearest |
514 | | */ |
515 | | CV_WRAP static Ptr<KNearest> load(const String& filepath); |
516 | | }; |
517 | | |
518 | | /****************************************************************************************\ |
519 | | * Support Vector Machines * |
520 | | \****************************************************************************************/ |
521 | | |
522 | | /** @brief Support Vector Machines. |
523 | | |
524 | | @sa @ref ml_intro_svm |
525 | | */ |
526 | | class CV_EXPORTS_W SVM : public StatModel |
527 | | { |
528 | | public: |
529 | | |
530 | | class CV_EXPORTS Kernel : public Algorithm |
531 | | { |
532 | | public: |
533 | | virtual int getType() const = 0; |
534 | | virtual void calc( int vcount, int n, const float* vecs, const float* another, float* results ) = 0; |
535 | | }; |
536 | | |
537 | | /** Type of a %SVM formulation. |
538 | | See SVM::Types. Default value is SVM::C_SVC. */ |
539 | | /** @see setType */ |
540 | | CV_WRAP virtual int getType() const = 0; |
541 | | /** @copybrief getType @see getType */ |
542 | | CV_WRAP virtual void setType(int val) = 0; |
543 | | |
544 | | /** Parameter \f$\gamma\f$ of a kernel function. |
545 | | For SVM::POLY, SVM::RBF, SVM::SIGMOID or SVM::CHI2. Default value is 1. */ |
546 | | /** @see setGamma */ |
547 | | CV_WRAP virtual double getGamma() const = 0; |
548 | | /** @copybrief getGamma @see getGamma */ |
549 | | CV_WRAP virtual void setGamma(double val) = 0; |
550 | | |
551 | | /** Parameter _coef0_ of a kernel function. |
552 | | For SVM::POLY or SVM::SIGMOID. Default value is 0.*/ |
553 | | /** @see setCoef0 */ |
554 | | CV_WRAP virtual double getCoef0() const = 0; |
555 | | /** @copybrief getCoef0 @see getCoef0 */ |
556 | | CV_WRAP virtual void setCoef0(double val) = 0; |
557 | | |
558 | | /** Parameter _degree_ of a kernel function. |
559 | | For SVM::POLY. Default value is 0. */ |
560 | | /** @see setDegree */ |
561 | | CV_WRAP virtual double getDegree() const = 0; |
562 | | /** @copybrief getDegree @see getDegree */ |
563 | | CV_WRAP virtual void setDegree(double val) = 0; |
564 | | |
565 | | /** Parameter _C_ of a %SVM optimization problem. |
566 | | For SVM::C_SVC, SVM::EPS_SVR or SVM::NU_SVR. Default value is 0. */ |
567 | | /** @see setC */ |
568 | | CV_WRAP virtual double getC() const = 0; |
569 | | /** @copybrief getC @see getC */ |
570 | | CV_WRAP virtual void setC(double val) = 0; |
571 | | |
572 | | /** Parameter \f$\nu\f$ of a %SVM optimization problem. |
573 | | For SVM::NU_SVC, SVM::ONE_CLASS or SVM::NU_SVR. Default value is 0. */ |
574 | | /** @see setNu */ |
575 | | CV_WRAP virtual double getNu() const = 0; |
576 | | /** @copybrief getNu @see getNu */ |
577 | | CV_WRAP virtual void setNu(double val) = 0; |
578 | | |
579 | | /** Parameter \f$\epsilon\f$ of a %SVM optimization problem. |
580 | | For SVM::EPS_SVR. Default value is 0. */ |
581 | | /** @see setP */ |
582 | | CV_WRAP virtual double getP() const = 0; |
583 | | /** @copybrief getP @see getP */ |
584 | | CV_WRAP virtual void setP(double val) = 0; |
585 | | |
586 | | /** Optional weights in the SVM::C_SVC problem, assigned to particular classes. |
587 | | They are multiplied by _C_ so the parameter _C_ of class _i_ becomes `classWeights(i) * C`. Thus |
588 | | these weights affect the misclassification penalty for different classes. The larger weight, |
589 | | the larger penalty on misclassification of data from the corresponding class. Default value is |
590 | | empty Mat. */ |
591 | | /** @see setClassWeights */ |
592 | | CV_WRAP virtual cv::Mat getClassWeights() const = 0; |
593 | | /** @copybrief getClassWeights @see getClassWeights */ |
594 | | CV_WRAP virtual void setClassWeights(const cv::Mat &val) = 0; |
595 | | |
596 | | /** Termination criteria of the iterative %SVM training procedure which solves a partial |
597 | | case of constrained quadratic optimization problem. |
598 | | You can specify tolerance and/or the maximum number of iterations. Default value is |
599 | | `TermCriteria( TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, FLT_EPSILON )`; */ |
600 | | /** @see setTermCriteria */ |
601 | | CV_WRAP virtual cv::TermCriteria getTermCriteria() const = 0; |
602 | | /** @copybrief getTermCriteria @see getTermCriteria */ |
603 | | CV_WRAP virtual void setTermCriteria(const cv::TermCriteria &val) = 0; |
604 | | |
605 | | /** Type of a %SVM kernel. |
606 | | See SVM::KernelTypes. Default value is SVM::RBF. */ |
607 | | CV_WRAP virtual int getKernelType() const = 0; |
608 | | |
609 | | /** Initialize with one of predefined kernels. |
610 | | See SVM::KernelTypes. */ |
611 | | CV_WRAP virtual void setKernel(int kernelType) = 0; |
612 | | |
613 | | /** Initialize with custom kernel. |
614 | | See SVM::Kernel class for implementation details */ |
615 | | virtual void setCustomKernel(const Ptr<Kernel> &_kernel) = 0; |
616 | | |
617 | | //! %SVM type |
618 | | enum Types { |
619 | | /** C-Support Vector Classification. n-class classification (n \f$\geq\f$ 2), allows |
620 | | imperfect separation of classes with penalty multiplier C for outliers. */ |
621 | | C_SVC=100, |
622 | | /** \f$\nu\f$-Support Vector Classification. n-class classification with possible |
623 | | imperfect separation. Parameter \f$\nu\f$ (in the range 0..1, the larger the value, the smoother |
624 | | the decision boundary) is used instead of C. */ |
625 | | NU_SVC=101, |
626 | | /** Distribution Estimation (One-class %SVM). All the training data are from |
627 | | the same class, %SVM builds a boundary that separates the class from the rest of the feature |
628 | | space. */ |
629 | | ONE_CLASS=102, |
630 | | /** \f$\epsilon\f$-Support Vector Regression. The distance between feature vectors |
631 | | from the training set and the fitting hyper-plane must be less than p. For outliers the |
632 | | penalty multiplier C is used. */ |
633 | | EPS_SVR=103, |
634 | | /** \f$\nu\f$-Support Vector Regression. \f$\nu\f$ is used instead of p. |
635 | | See @cite LibSVM for details. */ |
636 | | NU_SVR=104 |
637 | | }; |
638 | | |
639 | | /** @brief %SVM kernel type |
640 | | |
641 | | A comparison of different kernels on the following 2D test case with four classes. Four |
642 | | SVM::C_SVC SVMs have been trained (one against rest) with auto_train. Evaluation on three |
643 | | different kernels (SVM::CHI2, SVM::INTER, SVM::RBF). The color depicts the class with max score. |
644 | | Bright means max-score \> 0, dark means max-score \< 0. |
645 | |  |
646 | | */ |
647 | | enum KernelTypes { |
648 | | /** Returned by SVM::getKernelType in case when custom kernel has been set */ |
649 | | CUSTOM=-1, |
650 | | /** Linear kernel. No mapping is done, linear discrimination (or regression) is |
651 | | done in the original feature space. It is the fastest option. \f$K(x_i, x_j) = x_i^T x_j\f$. */ |
652 | | LINEAR=0, |
653 | | /** Polynomial kernel: |
654 | | \f$K(x_i, x_j) = (\gamma x_i^T x_j + coef0)^{degree}, \gamma > 0\f$. */ |
655 | | POLY=1, |
656 | | /** Radial basis function (RBF), a good choice in most cases. |
657 | | \f$K(x_i, x_j) = e^{-\gamma ||x_i - x_j||^2}, \gamma > 0\f$. */ |
658 | | RBF=2, |
659 | | /** Sigmoid kernel: \f$K(x_i, x_j) = \tanh(\gamma x_i^T x_j + coef0)\f$. */ |
660 | | SIGMOID=3, |
661 | | /** Exponential Chi2 kernel, similar to the RBF kernel: |
662 | | \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$. */ |
663 | | CHI2=4, |
664 | | /** Histogram intersection kernel. A fast kernel. \f$K(x_i, x_j) = min(x_i,x_j)\f$. */ |
665 | | INTER=5 |
666 | | }; |
667 | | |
668 | | //! %SVM params type |
669 | | enum ParamTypes { |
670 | | C=0, |
671 | | GAMMA=1, |
672 | | P=2, |
673 | | NU=3, |
674 | | COEF=4, |
675 | | DEGREE=5 |
676 | | }; |
677 | | |
678 | | /** @brief Trains an %SVM with optimal parameters. |
679 | | |
680 | | @param data the training data that can be constructed using TrainData::create or |
681 | | TrainData::loadFromCSV. |
682 | | @param kFold Cross-validation parameter. The training set is divided into kFold subsets. One |
683 | | subset is used to test the model, the others form the train set. So, the %SVM algorithm is |
684 | | executed kFold times. |
685 | | @param Cgrid grid for C |
686 | | @param gammaGrid grid for gamma |
687 | | @param pGrid grid for p |
688 | | @param nuGrid grid for nu |
689 | | @param coeffGrid grid for coeff |
690 | | @param degreeGrid grid for degree |
691 | | @param balanced If true and the problem is 2-class classification then the method creates more |
692 | | balanced cross-validation subsets that is proportions between classes in subsets are close |
693 | | to such proportion in the whole train dataset. |
694 | | |
695 | | The method trains the %SVM model automatically by choosing the optimal parameters C, gamma, p, |
696 | | nu, coef0, degree. Parameters are considered optimal when the cross-validation |
697 | | estimate of the test set error is minimal. |
698 | | |
699 | | If there is no need to optimize a parameter, the corresponding grid step should be set to any |
700 | | value less than or equal to 1. For example, to avoid optimization in gamma, set `gammaGrid.step |
701 | | = 0`, `gammaGrid.minVal`, `gamma_grid.maxVal` as arbitrary numbers. In this case, the value |
702 | | `Gamma` is taken for gamma. |
703 | | |
704 | | And, finally, if the optimization in a parameter is required but the corresponding grid is |
705 | | unknown, you may call the function SVM::getDefaultGrid. To generate a grid, for example, for |
706 | | gamma, call `SVM::getDefaultGrid(SVM::GAMMA)`. |
707 | | |
708 | | This function works for the classification (SVM::C_SVC or SVM::NU_SVC) as well as for the |
709 | | regression (SVM::EPS_SVR or SVM::NU_SVR). If it is SVM::ONE_CLASS, no optimization is made and |
710 | | the usual %SVM with parameters specified in params is executed. |
711 | | */ |
712 | | virtual bool trainAuto( const Ptr<TrainData>& data, int kFold = 10, |
713 | | ParamGrid Cgrid = getDefaultGrid(C), |
714 | | ParamGrid gammaGrid = getDefaultGrid(GAMMA), |
715 | | ParamGrid pGrid = getDefaultGrid(P), |
716 | | ParamGrid nuGrid = getDefaultGrid(NU), |
717 | | ParamGrid coeffGrid = getDefaultGrid(COEF), |
718 | | ParamGrid degreeGrid = getDefaultGrid(DEGREE), |
719 | | bool balanced=false) = 0; |
720 | | |
721 | | /** @brief Trains an %SVM with optimal parameters |
722 | | |
723 | | @param samples training samples |
724 | | @param layout See ml::SampleTypes. |
725 | | @param responses vector of responses associated with the training samples. |
726 | | @param kFold Cross-validation parameter. The training set is divided into kFold subsets. One |
727 | | subset is used to test the model, the others form the train set. So, the %SVM algorithm is |
728 | | @param Cgrid grid for C |
729 | | @param gammaGrid grid for gamma |
730 | | @param pGrid grid for p |
731 | | @param nuGrid grid for nu |
732 | | @param coeffGrid grid for coeff |
733 | | @param degreeGrid grid for degree |
734 | | @param balanced If true and the problem is 2-class classification then the method creates more |
735 | | balanced cross-validation subsets that is proportions between classes in subsets are close |
736 | | to such proportion in the whole train dataset. |
737 | | |
738 | | The method trains the %SVM model automatically by choosing the optimal parameters C, gamma, p, |
739 | | nu, coef0, degree. Parameters are considered optimal when the cross-validation |
740 | | estimate of the test set error is minimal. |
741 | | |
742 | | This function only makes use of SVM::getDefaultGrid for parameter optimization and thus only |
743 | | offers rudimentary parameter options. |
744 | | |
745 | | This function works for the classification (SVM::C_SVC or SVM::NU_SVC) as well as for the |
746 | | regression (SVM::EPS_SVR or SVM::NU_SVR). If it is SVM::ONE_CLASS, no optimization is made and |
747 | | the usual %SVM with parameters specified in params is executed. |
748 | | */ |
749 | | CV_WRAP virtual bool trainAuto(InputArray samples, |
750 | | int layout, |
751 | | InputArray responses, |
752 | | int kFold = 10, |
753 | | Ptr<ParamGrid> Cgrid = SVM::getDefaultGridPtr(SVM::C), |
754 | | Ptr<ParamGrid> gammaGrid = SVM::getDefaultGridPtr(SVM::GAMMA), |
755 | | Ptr<ParamGrid> pGrid = SVM::getDefaultGridPtr(SVM::P), |
756 | | Ptr<ParamGrid> nuGrid = SVM::getDefaultGridPtr(SVM::NU), |
757 | | Ptr<ParamGrid> coeffGrid = SVM::getDefaultGridPtr(SVM::COEF), |
758 | | Ptr<ParamGrid> degreeGrid = SVM::getDefaultGridPtr(SVM::DEGREE), |
759 | | bool balanced=false) = 0; |
760 | | |
761 | | /** @brief Retrieves all the support vectors |
762 | | |
763 | | The method returns all the support vectors as a floating-point matrix, where support vectors are |
764 | | stored as matrix rows. |
765 | | */ |
766 | | CV_WRAP virtual Mat getSupportVectors() const = 0; |
767 | | |
768 | | /** @brief Retrieves all the uncompressed support vectors of a linear %SVM |
769 | | |
770 | | The method returns all the uncompressed support vectors of a linear %SVM that the compressed |
771 | | support vector, used for prediction, was derived from. They are returned in a floating-point |
772 | | matrix, where the support vectors are stored as matrix rows. |
773 | | */ |
774 | | CV_WRAP virtual Mat getUncompressedSupportVectors() const = 0; |
775 | | |
776 | | /** @brief Retrieves the decision function |
777 | | |
778 | | @param i the index of the decision function. If the problem solved is regression, 1-class or |
779 | | 2-class classification, then there will be just one decision function and the index should |
780 | | always be 0. Otherwise, in the case of N-class classification, there will be \f$N(N-1)/2\f$ |
781 | | decision functions. |
782 | | @param alpha the optional output vector for weights, corresponding to different support vectors. |
783 | | In the case of linear %SVM all the alpha's will be 1's. |
784 | | @param svidx the optional output vector of indices of support vectors within the matrix of |
785 | | support vectors (which can be retrieved by SVM::getSupportVectors). In the case of linear |
786 | | %SVM each decision function consists of a single "compressed" support vector. |
787 | | |
788 | | The method returns rho parameter of the decision function, a scalar subtracted from the weighted |
789 | | sum of kernel responses. |
790 | | */ |
791 | | CV_WRAP virtual double getDecisionFunction(int i, OutputArray alpha, OutputArray svidx) const = 0; |
792 | | |
793 | | /** @brief Generates a grid for %SVM parameters. |
794 | | |
795 | | @param param_id %SVM parameters IDs that must be one of the SVM::ParamTypes. The grid is |
796 | | generated for the parameter with this ID. |
797 | | |
798 | | The function generates a grid for the specified parameter of the %SVM algorithm. The grid may be |
799 | | passed to the function SVM::trainAuto. |
800 | | */ |
801 | | static ParamGrid getDefaultGrid( int param_id ); |
802 | | |
803 | | /** @brief Generates a grid for %SVM parameters. |
804 | | |
805 | | @param param_id %SVM parameters IDs that must be one of the SVM::ParamTypes. The grid is |
806 | | generated for the parameter with this ID. |
807 | | |
808 | | The function generates a grid pointer for the specified parameter of the %SVM algorithm. |
809 | | The grid may be passed to the function SVM::trainAuto. |
810 | | */ |
811 | | CV_WRAP static Ptr<ParamGrid> getDefaultGridPtr( int param_id ); |
812 | | |
813 | | /** Creates empty model. |
814 | | Use StatModel::train to train the model. Since %SVM has several parameters, you may want to |
815 | | find the best parameters for your problem, it can be done with SVM::trainAuto. */ |
816 | | CV_WRAP static Ptr<SVM> create(); |
817 | | |
818 | | /** @brief Loads and creates a serialized svm from a file |
819 | | * |
820 | | * Use SVM::save to serialize and store an SVM to disk. |
821 | | * Load the SVM from this file again, by calling this function with the path to the file. |
822 | | * |
823 | | * @param filepath path to serialized svm |
824 | | */ |
825 | | CV_WRAP static Ptr<SVM> load(const String& filepath); |
826 | | }; |
827 | | |
828 | | /****************************************************************************************\ |
829 | | * Expectation - Maximization * |
830 | | \****************************************************************************************/ |
831 | | |
832 | | /** @brief The class implements the Expectation Maximization algorithm. |
833 | | |
834 | | @sa @ref ml_intro_em |
835 | | */ |
836 | | class CV_EXPORTS_W EM : public StatModel |
837 | | { |
838 | | public: |
839 | | //! Type of covariation matrices |
840 | | enum Types { |
841 | | /** A scaled identity matrix \f$\mu_k * I\f$. There is the only |
842 | | parameter \f$\mu_k\f$ to be estimated for each matrix. The option may be used in special cases, |
843 | | when the constraint is relevant, or as a first step in the optimization (for example in case |
844 | | when the data is preprocessed with PCA). The results of such preliminary estimation may be |
845 | | passed again to the optimization procedure, this time with |
846 | | covMatType=EM::COV_MAT_DIAGONAL. */ |
847 | | COV_MAT_SPHERICAL=0, |
848 | | /** A diagonal matrix with positive diagonal elements. The number of |
849 | | free parameters is d for each matrix. This is most commonly used option yielding good |
850 | | estimation results. */ |
851 | | COV_MAT_DIAGONAL=1, |
852 | | /** A symmetric positively defined matrix. The number of free |
853 | | parameters in each matrix is about \f$d^2/2\f$. It is not recommended to use this option, unless |
854 | | there is pretty accurate initial estimation of the parameters and/or a huge number of |
855 | | training samples. */ |
856 | | COV_MAT_GENERIC=2, |
857 | | COV_MAT_DEFAULT=COV_MAT_DIAGONAL |
858 | | }; |
859 | | |
860 | | //! Default parameters |
861 | | enum {DEFAULT_NCLUSTERS=5, DEFAULT_MAX_ITERS=100}; |
862 | | |
863 | | //! The initial step |
864 | | enum {START_E_STEP=1, START_M_STEP=2, START_AUTO_STEP=0}; |
865 | | |
866 | | /** The number of mixture components in the Gaussian mixture model. |
867 | | Default value of the parameter is EM::DEFAULT_NCLUSTERS=5. Some of %EM implementation could |
868 | | determine the optimal number of mixtures within a specified value range, but that is not the |
869 | | case in ML yet. */ |
870 | | /** @see setClustersNumber */ |
871 | | CV_WRAP virtual int getClustersNumber() const = 0; |
872 | | /** @copybrief getClustersNumber @see getClustersNumber */ |
873 | | CV_WRAP virtual void setClustersNumber(int val) = 0; |
874 | | |
875 | | /** Constraint on covariance matrices which defines type of matrices. |
876 | | See EM::Types. */ |
877 | | /** @see setCovarianceMatrixType */ |
878 | | CV_WRAP virtual int getCovarianceMatrixType() const = 0; |
879 | | /** @copybrief getCovarianceMatrixType @see getCovarianceMatrixType */ |
880 | | CV_WRAP virtual void setCovarianceMatrixType(int val) = 0; |
881 | | |
882 | | /** The termination criteria of the %EM algorithm. |
883 | | The %EM algorithm can be terminated by the number of iterations termCrit.maxCount (number of |
884 | | M-steps) or when relative change of likelihood logarithm is less than termCrit.epsilon. Default |
885 | | maximum number of iterations is EM::DEFAULT_MAX_ITERS=100. */ |
886 | | /** @see setTermCriteria */ |
887 | | CV_WRAP virtual TermCriteria getTermCriteria() const = 0; |
888 | | /** @copybrief getTermCriteria @see getTermCriteria */ |
889 | | CV_WRAP virtual void setTermCriteria(const TermCriteria &val) = 0; |
890 | | |
891 | | /** @brief Returns weights of the mixtures |
892 | | |
893 | | Returns vector with the number of elements equal to the number of mixtures. |
894 | | */ |
895 | | CV_WRAP virtual Mat getWeights() const = 0; |
896 | | /** @brief Returns the cluster centers (means of the Gaussian mixture) |
897 | | |
898 | | Returns matrix with the number of rows equal to the number of mixtures and number of columns |
899 | | equal to the space dimensionality. |
900 | | */ |
901 | | CV_WRAP virtual Mat getMeans() const = 0; |
902 | | /** @brief Returns covariation matrices |
903 | | |
904 | | Returns vector of covariation matrices. Number of matrices is the number of gaussian mixtures, |
905 | | each matrix is a square floating-point matrix NxN, where N is the space dimensionality. |
906 | | */ |
907 | | CV_WRAP virtual void getCovs(CV_OUT std::vector<Mat>& covs) const = 0; |
908 | | |
909 | | /** @brief Returns posterior probabilities for the provided samples |
910 | | |
911 | | @param samples The input samples, floating-point matrix |
912 | | @param results The optional output \f$ nSamples \times nClusters\f$ matrix of results. It contains |
913 | | posterior probabilities for each sample from the input |
914 | | @param flags This parameter will be ignored |
915 | | */ |
916 | | CV_WRAP virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const CV_OVERRIDE = 0; |
917 | | |
918 | | /** @brief Returns a likelihood logarithm value and an index of the most probable mixture component |
919 | | for the given sample. |
920 | | |
921 | | @param sample A sample for classification. It should be a one-channel matrix of |
922 | | \f$1 \times dims\f$ or \f$dims \times 1\f$ size. |
923 | | @param probs Optional output matrix that contains posterior probabilities of each component |
924 | | given the sample. It has \f$1 \times nclusters\f$ size and CV_64FC1 type. |
925 | | |
926 | | The method returns a two-element double vector. Zero element is a likelihood logarithm value for |
927 | | the sample. First element is an index of the most probable mixture component for the given |
928 | | sample. |
929 | | */ |
930 | | CV_WRAP virtual Vec2d predict2(InputArray sample, OutputArray probs) const = 0; |
931 | | |
932 | | /** @brief Estimate the Gaussian mixture parameters from a samples set. |
933 | | |
934 | | This variation starts with Expectation step. Initial values of the model parameters will be |
935 | | estimated by the k-means algorithm. |
936 | | |
937 | | Unlike many of the ML models, %EM is an unsupervised learning algorithm and it does not take |
938 | | responses (class labels or function values) as input. Instead, it computes the *Maximum |
939 | | Likelihood Estimate* of the Gaussian mixture parameters from an input sample set, stores all the |
940 | | parameters inside the structure: \f$p_{i,k}\f$ in probs, \f$a_k\f$ in means , \f$S_k\f$ in |
941 | | covs[k], \f$\pi_k\f$ in weights , and optionally computes the output "class label" for each |
942 | | sample: \f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most |
943 | | probable mixture component for each sample). |
944 | | |
945 | | The trained model can be used further for prediction, just like any other classifier. The |
946 | | trained model is similar to the NormalBayesClassifier. |
947 | | |
948 | | @param samples Samples from which the Gaussian mixture model will be estimated. It should be a |
949 | | one-channel matrix, each row of which is a sample. If the matrix does not have CV_64F type |
950 | | it will be converted to the inner matrix of such type for the further computing. |
951 | | @param logLikelihoods The optional output matrix that contains a likelihood logarithm value for |
952 | | each sample. It has \f$nsamples \times 1\f$ size and CV_64FC1 type. |
953 | | @param labels The optional output "class label" for each sample: |
954 | | \f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most probable |
955 | | mixture component for each sample). It has \f$nsamples \times 1\f$ size and CV_32SC1 type. |
956 | | @param probs The optional output matrix that contains posterior probabilities of each Gaussian |
957 | | mixture component given the each sample. It has \f$nsamples \times nclusters\f$ size and |
958 | | CV_64FC1 type. |
959 | | */ |
960 | | CV_WRAP virtual bool trainEM(InputArray samples, |
961 | | OutputArray logLikelihoods=noArray(), |
962 | | OutputArray labels=noArray(), |
963 | | OutputArray probs=noArray()) = 0; |
964 | | |
965 | | /** @brief Estimate the Gaussian mixture parameters from a samples set. |
966 | | |
967 | | This variation starts with Expectation step. You need to provide initial means \f$a_k\f$ of |
968 | | mixture components. Optionally you can pass initial weights \f$\pi_k\f$ and covariance matrices |
969 | | \f$S_k\f$ of mixture components. |
970 | | |
971 | | @param samples Samples from which the Gaussian mixture model will be estimated. It should be a |
972 | | one-channel matrix, each row of which is a sample. If the matrix does not have CV_64F type |
973 | | it will be converted to the inner matrix of such type for the further computing. |
974 | | @param means0 Initial means \f$a_k\f$ of mixture components. It is a one-channel matrix of |
975 | | \f$nclusters \times dims\f$ size. If the matrix does not have CV_64F type it will be |
976 | | converted to the inner matrix of such type for the further computing. |
977 | | @param covs0 The vector of initial covariance matrices \f$S_k\f$ of mixture components. Each of |
978 | | covariance matrices is a one-channel matrix of \f$dims \times dims\f$ size. If the matrices |
979 | | do not have CV_64F type they will be converted to the inner matrices of such type for the |
980 | | further computing. |
981 | | @param weights0 Initial weights \f$\pi_k\f$ of mixture components. It should be a one-channel |
982 | | floating-point matrix with \f$1 \times nclusters\f$ or \f$nclusters \times 1\f$ size. |
983 | | @param logLikelihoods The optional output matrix that contains a likelihood logarithm value for |
984 | | each sample. It has \f$nsamples \times 1\f$ size and CV_64FC1 type. |
985 | | @param labels The optional output "class label" for each sample: |
986 | | \f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most probable |
987 | | mixture component for each sample). It has \f$nsamples \times 1\f$ size and CV_32SC1 type. |
988 | | @param probs The optional output matrix that contains posterior probabilities of each Gaussian |
989 | | mixture component given the each sample. It has \f$nsamples \times nclusters\f$ size and |
990 | | CV_64FC1 type. |
991 | | */ |
992 | | CV_WRAP virtual bool trainE(InputArray samples, InputArray means0, |
993 | | InputArray covs0=noArray(), |
994 | | InputArray weights0=noArray(), |
995 | | OutputArray logLikelihoods=noArray(), |
996 | | OutputArray labels=noArray(), |
997 | | OutputArray probs=noArray()) = 0; |
998 | | |
999 | | /** @brief Estimate the Gaussian mixture parameters from a samples set. |
1000 | | |
1001 | | This variation starts with Maximization step. You need to provide initial probabilities |
1002 | | \f$p_{i,k}\f$ to use this option. |
1003 | | |
1004 | | @param samples Samples from which the Gaussian mixture model will be estimated. It should be a |
1005 | | one-channel matrix, each row of which is a sample. If the matrix does not have CV_64F type |
1006 | | it will be converted to the inner matrix of such type for the further computing. |
1007 | | @param probs0 the probabilities |
1008 | | @param logLikelihoods The optional output matrix that contains a likelihood logarithm value for |
1009 | | each sample. It has \f$nsamples \times 1\f$ size and CV_64FC1 type. |
1010 | | @param labels The optional output "class label" for each sample: |
1011 | | \f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most probable |
1012 | | mixture component for each sample). It has \f$nsamples \times 1\f$ size and CV_32SC1 type. |
1013 | | @param probs The optional output matrix that contains posterior probabilities of each Gaussian |
1014 | | mixture component given the each sample. It has \f$nsamples \times nclusters\f$ size and |
1015 | | CV_64FC1 type. |
1016 | | */ |
1017 | | CV_WRAP virtual bool trainM(InputArray samples, InputArray probs0, |
1018 | | OutputArray logLikelihoods=noArray(), |
1019 | | OutputArray labels=noArray(), |
1020 | | OutputArray probs=noArray()) = 0; |
1021 | | |
1022 | | /** Creates empty %EM model. |
1023 | | The model should be trained then using StatModel::train(traindata, flags) method. Alternatively, you |
1024 | | can use one of the EM::train\* methods or load it from file using Algorithm::load\<EM\>(filename). |
1025 | | */ |
1026 | | CV_WRAP static Ptr<EM> create(); |
1027 | | |
1028 | | /** @brief Loads and creates a serialized EM from a file |
1029 | | * |
1030 | | * Use EM::save to serialize and store an EM to disk. |
1031 | | * Load the EM from this file again, by calling this function with the path to the file. |
1032 | | * Optionally specify the node for the file containing the classifier |
1033 | | * |
1034 | | * @param filepath path to serialized EM |
1035 | | * @param nodeName name of node containing the classifier |
1036 | | */ |
1037 | | CV_WRAP static Ptr<EM> load(const String& filepath , const String& nodeName = String()); |
1038 | | }; |
1039 | | |
1040 | | /****************************************************************************************\ |
1041 | | * Decision Tree * |
1042 | | \****************************************************************************************/ |
1043 | | |
1044 | | /** @brief The class represents a single decision tree or a collection of decision trees. |
1045 | | |
1046 | | The current public interface of the class allows user to train only a single decision tree, however |
1047 | | the class is capable of storing multiple decision trees and using them for prediction (by summing |
1048 | | responses or using a voting schemes), and the derived from DTrees classes (such as RTrees and Boost) |
1049 | | use this capability to implement decision tree ensembles. |
1050 | | |
1051 | | @sa @ref ml_intro_trees |
1052 | | */ |
1053 | | class CV_EXPORTS_W DTrees : public StatModel |
1054 | | { |
1055 | | public: |
1056 | | /** Predict options */ |
1057 | | enum Flags { PREDICT_AUTO=0, PREDICT_SUM=(1<<8), PREDICT_MAX_VOTE=(2<<8), PREDICT_MASK=(3<<8) }; |
1058 | | |
1059 | | /** Cluster possible values of a categorical variable into K\<=maxCategories clusters to |
1060 | | find a suboptimal split. |
1061 | | If a discrete variable, on which the training procedure tries to make a split, takes more than |
1062 | | maxCategories values, the precise best subset estimation may take a very long time because the |
1063 | | algorithm is exponential. Instead, many decision trees engines (including our implementation) |
1064 | | try to find sub-optimal split in this case by clustering all the samples into maxCategories |
1065 | | clusters that is some categories are merged together. The clustering is applied only in n \> |
1066 | | 2-class classification problems for categorical variables with N \> max_categories possible |
1067 | | values. In case of regression and 2-class classification the optimal split can be found |
1068 | | efficiently without employing clustering, thus the parameter is not used in these cases. |
1069 | | Default value is 10.*/ |
1070 | | /** @see setMaxCategories */ |
1071 | | CV_WRAP virtual int getMaxCategories() const = 0; |
1072 | | /** @copybrief getMaxCategories @see getMaxCategories */ |
1073 | | CV_WRAP virtual void setMaxCategories(int val) = 0; |
1074 | | |
1075 | | /** The maximum possible depth of the tree. |
1076 | | That is the training algorithms attempts to split a node while its depth is less than maxDepth. |
1077 | | The root node has zero depth. The actual depth may be smaller if the other termination criteria |
1078 | | are met (see the outline of the training procedure @ref ml_intro_trees "here"), and/or if the |
1079 | | tree is pruned. Default value is INT_MAX.*/ |
1080 | | /** @see setMaxDepth */ |
1081 | | CV_WRAP virtual int getMaxDepth() const = 0; |
1082 | | /** @copybrief getMaxDepth @see getMaxDepth */ |
1083 | | CV_WRAP virtual void setMaxDepth(int val) = 0; |
1084 | | |
1085 | | /** If the number of samples in a node is less than this parameter then the node will not be split. |
1086 | | |
1087 | | Default value is 10.*/ |
1088 | | /** @see setMinSampleCount */ |
1089 | | CV_WRAP virtual int getMinSampleCount() const = 0; |
1090 | | /** @copybrief getMinSampleCount @see getMinSampleCount */ |
1091 | | CV_WRAP virtual void setMinSampleCount(int val) = 0; |
1092 | | |
1093 | | /** If CVFolds \> 1 then algorithms prunes the built decision tree using K-fold |
1094 | | cross-validation procedure where K is equal to CVFolds. |
1095 | | Default value is 10.*/ |
1096 | | /** @see setCVFolds */ |
1097 | | CV_WRAP virtual int getCVFolds() const = 0; |
1098 | | /** @copybrief getCVFolds @see getCVFolds */ |
1099 | | CV_WRAP virtual void setCVFolds(int val) = 0; |
1100 | | |
1101 | | /** If true then surrogate splits will be built. |
1102 | | These splits allow to work with missing data and compute variable importance correctly. |
1103 | | Default value is false. |
1104 | | @note currently it's not implemented.*/ |
1105 | | /** @see setUseSurrogates */ |
1106 | | CV_WRAP virtual bool getUseSurrogates() const = 0; |
1107 | | /** @copybrief getUseSurrogates @see getUseSurrogates */ |
1108 | | CV_WRAP virtual void setUseSurrogates(bool val) = 0; |
1109 | | |
1110 | | /** If true then a pruning will be harsher. |
1111 | | This will make a tree more compact and more resistant to the training data noise but a bit less |
1112 | | accurate. Default value is true.*/ |
1113 | | /** @see setUse1SERule */ |
1114 | | CV_WRAP virtual bool getUse1SERule() const = 0; |
1115 | | /** @copybrief getUse1SERule @see getUse1SERule */ |
1116 | | CV_WRAP virtual void setUse1SERule(bool val) = 0; |
1117 | | |
1118 | | /** If true then pruned branches are physically removed from the tree. |
1119 | | Otherwise they are retained and it is possible to get results from the original unpruned (or |
1120 | | pruned less aggressively) tree. Default value is true.*/ |
1121 | | /** @see setTruncatePrunedTree */ |
1122 | | CV_WRAP virtual bool getTruncatePrunedTree() const = 0; |
1123 | | /** @copybrief getTruncatePrunedTree @see getTruncatePrunedTree */ |
1124 | | CV_WRAP virtual void setTruncatePrunedTree(bool val) = 0; |
1125 | | |
1126 | | /** Termination criteria for regression trees. |
1127 | | If all absolute differences between an estimated value in a node and values of train samples |
1128 | | in this node are less than this parameter then the node will not be split further. Default |
1129 | | value is 0.01f*/ |
1130 | | /** @see setRegressionAccuracy */ |
1131 | | CV_WRAP virtual float getRegressionAccuracy() const = 0; |
1132 | | /** @copybrief getRegressionAccuracy @see getRegressionAccuracy */ |
1133 | | CV_WRAP virtual void setRegressionAccuracy(float val) = 0; |
1134 | | |
1135 | | /** @brief The array of a priori class probabilities, sorted by the class label value. |
1136 | | |
1137 | | The parameter can be used to tune the decision tree preferences toward a certain class. For |
1138 | | example, if you want to detect some rare anomaly occurrence, the training base will likely |
1139 | | contain much more normal cases than anomalies, so a very good classification performance |
1140 | | will be achieved just by considering every case as normal. To avoid this, the priors can be |
1141 | | specified, where the anomaly probability is artificially increased (up to 0.5 or even |
1142 | | greater), so the weight of the misclassified anomalies becomes much bigger, and the tree is |
1143 | | adjusted properly. |
1144 | | |
1145 | | You can also think about this parameter as weights of prediction categories which determine |
1146 | | relative weights that you give to misclassification. That is, if the weight of the first |
1147 | | category is 1 and the weight of the second category is 10, then each mistake in predicting |
1148 | | the second category is equivalent to making 10 mistakes in predicting the first category. |
1149 | | Default value is empty Mat.*/ |
1150 | | /** @see setPriors */ |
1151 | | CV_WRAP virtual cv::Mat getPriors() const = 0; |
1152 | | /** @copybrief getPriors @see getPriors */ |
1153 | | CV_WRAP virtual void setPriors(const cv::Mat &val) = 0; |
1154 | | |
1155 | | /** @brief The class represents a decision tree node. |
1156 | | */ |
1157 | | class CV_EXPORTS Node |
1158 | | { |
1159 | | public: |
1160 | | Node(); |
1161 | | double value; //!< Value at the node: a class label in case of classification or estimated |
1162 | | //!< function value in case of regression. |
1163 | | int classIdx; //!< Class index normalized to 0..class_count-1 range and assigned to the |
1164 | | //!< node. It is used internally in classification trees and tree ensembles. |
1165 | | int parent; //!< Index of the parent node |
1166 | | int left; //!< Index of the left child node |
1167 | | int right; //!< Index of right child node |
1168 | | int defaultDir; //!< Default direction where to go (-1: left or +1: right). It helps in the |
1169 | | //!< case of missing values. |
1170 | | int split; //!< Index of the first split |
1171 | | }; |
1172 | | |
1173 | | /** @brief The class represents split in a decision tree. |
1174 | | */ |
1175 | | class CV_EXPORTS Split |
1176 | | { |
1177 | | public: |
1178 | | Split(); |
1179 | | int varIdx; //!< Index of variable on which the split is created. |
1180 | | bool inversed; //!< If true, then the inverse split rule is used (i.e. left and right |
1181 | | //!< branches are exchanged in the rule expressions below). |
1182 | | float quality; //!< The split quality, a positive number. It is used to choose the best split. |
1183 | | int next; //!< Index of the next split in the list of splits for the node |
1184 | | float c; /**< The threshold value in case of split on an ordered variable. |
1185 | | The rule is: |
1186 | | @code{.none} |
1187 | | if var_value < c |
1188 | | then next_node <- left |
1189 | | else next_node <- right |
1190 | | @endcode */ |
1191 | | int subsetOfs; /**< Offset of the bitset used by the split on a categorical variable. |
1192 | | The rule is: |
1193 | | @code{.none} |
1194 | | if bitset[var_value] == 1 |
1195 | | then next_node <- left |
1196 | | else next_node <- right |
1197 | | @endcode */ |
1198 | | }; |
1199 | | |
1200 | | /** @brief Returns indices of root nodes |
1201 | | */ |
1202 | | virtual const std::vector<int>& getRoots() const = 0; |
1203 | | /** @brief Returns all the nodes |
1204 | | |
1205 | | all the node indices are indices in the returned vector |
1206 | | */ |
1207 | | virtual const std::vector<Node>& getNodes() const = 0; |
1208 | | /** @brief Returns all the splits |
1209 | | |
1210 | | all the split indices are indices in the returned vector |
1211 | | */ |
1212 | | virtual const std::vector<Split>& getSplits() const = 0; |
1213 | | /** @brief Returns all the bitsets for categorical splits |
1214 | | |
1215 | | Split::subsetOfs is an offset in the returned vector |
1216 | | */ |
1217 | | virtual const std::vector<int>& getSubsets() const = 0; |
1218 | | |
1219 | | /** @brief Creates the empty model |
1220 | | |
1221 | | The static method creates empty decision tree with the specified parameters. It should be then |
1222 | | trained using train method (see StatModel::train). Alternatively, you can load the model from |
1223 | | file using Algorithm::load\<DTrees\>(filename). |
1224 | | */ |
1225 | | CV_WRAP static Ptr<DTrees> create(); |
1226 | | |
1227 | | /** @brief Loads and creates a serialized DTrees from a file |
1228 | | * |
1229 | | * Use DTree::save to serialize and store an DTree to disk. |
1230 | | * Load the DTree from this file again, by calling this function with the path to the file. |
1231 | | * Optionally specify the node for the file containing the classifier |
1232 | | * |
1233 | | * @param filepath path to serialized DTree |
1234 | | * @param nodeName name of node containing the classifier |
1235 | | */ |
1236 | | CV_WRAP static Ptr<DTrees> load(const String& filepath , const String& nodeName = String()); |
1237 | | }; |
1238 | | |
1239 | | /****************************************************************************************\ |
1240 | | * Random Trees Classifier * |
1241 | | \****************************************************************************************/ |
1242 | | |
1243 | | /** @brief The class implements the random forest predictor. |
1244 | | |
1245 | | @sa @ref ml_intro_rtrees |
1246 | | */ |
1247 | | class CV_EXPORTS_W RTrees : public DTrees |
1248 | | { |
1249 | | public: |
1250 | | |
1251 | | /** If true then variable importance will be calculated and then it can be retrieved by RTrees::getVarImportance. |
1252 | | Default value is false.*/ |
1253 | | /** @see setCalculateVarImportance */ |
1254 | | CV_WRAP virtual bool getCalculateVarImportance() const = 0; |
1255 | | /** @copybrief getCalculateVarImportance @see getCalculateVarImportance */ |
1256 | | CV_WRAP virtual void setCalculateVarImportance(bool val) = 0; |
1257 | | |
1258 | | /** The size of the randomly selected subset of features at each tree node and that are used |
1259 | | to find the best split(s). |
1260 | | If you set it to 0 then the size will be set to the square root of the total number of |
1261 | | features. Default value is 0.*/ |
1262 | | /** @see setActiveVarCount */ |
1263 | | CV_WRAP virtual int getActiveVarCount() const = 0; |
1264 | | /** @copybrief getActiveVarCount @see getActiveVarCount */ |
1265 | | CV_WRAP virtual void setActiveVarCount(int val) = 0; |
1266 | | |
1267 | | /** The termination criteria that specifies when the training algorithm stops. |
1268 | | Either when the specified number of trees is trained and added to the ensemble or when |
1269 | | sufficient accuracy (measured as OOB error) is achieved. Typically the more trees you have the |
1270 | | better the accuracy. However, the improvement in accuracy generally diminishes and asymptotes |
1271 | | pass a certain number of trees. Also to keep in mind, the number of tree increases the |
1272 | | prediction time linearly. Default value is TermCriteria(TermCriteria::MAX_ITERS + |
1273 | | TermCriteria::EPS, 50, 0.1)*/ |
1274 | | /** @see setTermCriteria */ |
1275 | | CV_WRAP virtual TermCriteria getTermCriteria() const = 0; |
1276 | | /** @copybrief getTermCriteria @see getTermCriteria */ |
1277 | | CV_WRAP virtual void setTermCriteria(const TermCriteria &val) = 0; |
1278 | | |
1279 | | /** Returns the variable importance array. |
1280 | | The method returns the variable importance vector, computed at the training stage when |
1281 | | CalculateVarImportance is set to true. If this flag was set to false, the empty matrix is |
1282 | | returned. |
1283 | | */ |
1284 | | CV_WRAP virtual Mat getVarImportance() const = 0; |
1285 | | |
1286 | | /** Returns the result of each individual tree in the forest. |
1287 | | In case the model is a regression problem, the method will return each of the trees' |
1288 | | results for each of the sample cases. If the model is a classifier, it will return |
1289 | | a Mat with samples + 1 rows, where the first row gives the class number and the |
1290 | | following rows return the votes each class had for each sample. |
1291 | | @param samples Array containing the samples for which votes will be calculated. |
1292 | | @param results Array where the result of the calculation will be written. |
1293 | | @param flags Flags for defining the type of RTrees. |
1294 | | */ |
1295 | | CV_WRAP virtual void getVotes(InputArray samples, OutputArray results, int flags) const = 0; |
1296 | | |
1297 | | /** Returns the OOB error value, computed at the training stage when calcOOBError is set to true. |
1298 | | * If this flag was set to false, 0 is returned. The OOB error is also scaled by sample weighting. |
1299 | | */ |
1300 | | #if CV_VERSION_MAJOR == 4 |
1301 | 0 | CV_WRAP virtual double getOOBError() const { return 0; } |
1302 | | #else |
1303 | | /*CV_WRAP*/ virtual double getOOBError() const = 0; |
1304 | | #endif |
1305 | | |
1306 | | /** Creates the empty model. |
1307 | | Use StatModel::train to train the model, StatModel::train to create and train the model, |
1308 | | Algorithm::load to load the pre-trained model. |
1309 | | */ |
1310 | | CV_WRAP static Ptr<RTrees> create(); |
1311 | | |
1312 | | /** @brief Loads and creates a serialized RTree from a file |
1313 | | * |
1314 | | * Use RTree::save to serialize and store an RTree to disk. |
1315 | | * Load the RTree from this file again, by calling this function with the path to the file. |
1316 | | * Optionally specify the node for the file containing the classifier |
1317 | | * |
1318 | | * @param filepath path to serialized RTree |
1319 | | * @param nodeName name of node containing the classifier |
1320 | | */ |
1321 | | CV_WRAP static Ptr<RTrees> load(const String& filepath , const String& nodeName = String()); |
1322 | | }; |
1323 | | |
1324 | | /****************************************************************************************\ |
1325 | | * Boosted tree classifier * |
1326 | | \****************************************************************************************/ |
1327 | | |
1328 | | /** @brief Boosted tree classifier derived from DTrees |
1329 | | |
1330 | | @sa @ref ml_intro_boost |
1331 | | */ |
1332 | | class CV_EXPORTS_W Boost : public DTrees |
1333 | | { |
1334 | | public: |
1335 | | /** Type of the boosting algorithm. |
1336 | | See Boost::Types. Default value is Boost::REAL. */ |
1337 | | /** @see setBoostType */ |
1338 | | CV_WRAP virtual int getBoostType() const = 0; |
1339 | | /** @copybrief getBoostType @see getBoostType */ |
1340 | | CV_WRAP virtual void setBoostType(int val) = 0; |
1341 | | |
1342 | | /** The number of weak classifiers. |
1343 | | Default value is 100. */ |
1344 | | /** @see setWeakCount */ |
1345 | | CV_WRAP virtual int getWeakCount() const = 0; |
1346 | | /** @copybrief getWeakCount @see getWeakCount */ |
1347 | | CV_WRAP virtual void setWeakCount(int val) = 0; |
1348 | | |
1349 | | /** A threshold between 0 and 1 used to save computational time. |
1350 | | Samples with summary weight \f$\leq 1 - weight_trim_rate\f$ do not participate in the *next* |
1351 | | iteration of training. Set this parameter to 0 to turn off this functionality. Default value is 0.95.*/ |
1352 | | /** @see setWeightTrimRate */ |
1353 | | CV_WRAP virtual double getWeightTrimRate() const = 0; |
1354 | | /** @copybrief getWeightTrimRate @see getWeightTrimRate */ |
1355 | | CV_WRAP virtual void setWeightTrimRate(double val) = 0; |
1356 | | |
1357 | | /** Boosting type. |
1358 | | Gentle AdaBoost and Real AdaBoost are often the preferable choices. */ |
1359 | | enum Types { |
1360 | | DISCRETE=0, //!< Discrete AdaBoost. |
1361 | | REAL=1, //!< Real AdaBoost. It is a technique that utilizes confidence-rated predictions |
1362 | | //!< and works well with categorical data. |
1363 | | LOGIT=2, //!< LogitBoost. It can produce good regression fits. |
1364 | | GENTLE=3 //!< Gentle AdaBoost. It puts less weight on outlier data points and for that |
1365 | | //!<reason is often good with regression data. |
1366 | | }; |
1367 | | |
1368 | | /** Creates the empty model. |
1369 | | Use StatModel::train to train the model, Algorithm::load\<Boost\>(filename) to load the pre-trained model. */ |
1370 | | CV_WRAP static Ptr<Boost> create(); |
1371 | | |
1372 | | /** @brief Loads and creates a serialized Boost from a file |
1373 | | * |
1374 | | * Use Boost::save to serialize and store an RTree to disk. |
1375 | | * Load the Boost from this file again, by calling this function with the path to the file. |
1376 | | * Optionally specify the node for the file containing the classifier |
1377 | | * |
1378 | | * @param filepath path to serialized Boost |
1379 | | * @param nodeName name of node containing the classifier |
1380 | | */ |
1381 | | CV_WRAP static Ptr<Boost> load(const String& filepath , const String& nodeName = String()); |
1382 | | }; |
1383 | | |
1384 | | /****************************************************************************************\ |
1385 | | * Gradient Boosted Trees * |
1386 | | \****************************************************************************************/ |
1387 | | |
1388 | | /*class CV_EXPORTS_W GBTrees : public DTrees |
1389 | | { |
1390 | | public: |
1391 | | struct CV_EXPORTS_W_MAP Params : public DTrees::Params |
1392 | | { |
1393 | | CV_PROP_RW int weakCount; |
1394 | | CV_PROP_RW int lossFunctionType; |
1395 | | CV_PROP_RW float subsamplePortion; |
1396 | | CV_PROP_RW float shrinkage; |
1397 | | |
1398 | | Params(); |
1399 | | Params( int lossFunctionType, int weakCount, float shrinkage, |
1400 | | float subsamplePortion, int maxDepth, bool useSurrogates ); |
1401 | | }; |
1402 | | |
1403 | | enum {SQUARED_LOSS=0, ABSOLUTE_LOSS, HUBER_LOSS=3, DEVIANCE_LOSS}; |
1404 | | |
1405 | | virtual void setK(int k) = 0; |
1406 | | |
1407 | | virtual float predictSerial( InputArray samples, |
1408 | | OutputArray weakResponses, int flags) const = 0; |
1409 | | |
1410 | | static Ptr<GBTrees> create(const Params& p); |
1411 | | };*/ |
1412 | | |
1413 | | /****************************************************************************************\ |
1414 | | * Artificial Neural Networks (ANN) * |
1415 | | \****************************************************************************************/ |
1416 | | |
1417 | | /////////////////////////////////// Multi-Layer Perceptrons ////////////////////////////// |
1418 | | |
1419 | | /** @brief Artificial Neural Networks - Multi-Layer Perceptrons. |
1420 | | |
1421 | | Unlike many other models in ML that are constructed and trained at once, in the MLP model these |
1422 | | steps are separated. First, a network with the specified topology is created using the non-default |
1423 | | constructor or the method ANN_MLP::create. All the weights are set to zeros. Then, the network is |
1424 | | trained using a set of input and output vectors. The training procedure can be repeated more than |
1425 | | once, that is, the weights can be adjusted based on the new training data. |
1426 | | |
1427 | | Additional flags for StatModel::train are available: ANN_MLP::TrainFlags. |
1428 | | |
1429 | | @sa @ref ml_intro_ann |
1430 | | */ |
1431 | | class CV_EXPORTS_W ANN_MLP : public StatModel |
1432 | | { |
1433 | | public: |
1434 | | /** Available training methods */ |
1435 | | enum TrainingMethods { |
1436 | | BACKPROP=0, //!< The back-propagation algorithm. |
1437 | | RPROP = 1, //!< The RPROP algorithm. See @cite RPROP93 for details. |
1438 | | ANNEAL = 2 //!< The simulated annealing algorithm. See @cite Kirkpatrick83 for details. |
1439 | | }; |
1440 | | |
1441 | | /** Sets training method and common parameters. |
1442 | | @param method Default value is ANN_MLP::RPROP. See ANN_MLP::TrainingMethods. |
1443 | | @param param1 passed to setRpropDW0 for ANN_MLP::RPROP and to setBackpropWeightScale for ANN_MLP::BACKPROP and to initialT for ANN_MLP::ANNEAL. |
1444 | | @param param2 passed to setRpropDWMin for ANN_MLP::RPROP and to setBackpropMomentumScale for ANN_MLP::BACKPROP and to finalT for ANN_MLP::ANNEAL. |
1445 | | */ |
1446 | | CV_WRAP virtual void setTrainMethod(int method, double param1 = 0, double param2 = 0) = 0; |
1447 | | |
1448 | | /** Returns current training method */ |
1449 | | CV_WRAP virtual int getTrainMethod() const = 0; |
1450 | | |
1451 | | /** Initialize the activation function for each neuron. |
1452 | | Currently the default and the only fully supported activation function is ANN_MLP::SIGMOID_SYM. |
1453 | | @param type The type of activation function. See ANN_MLP::ActivationFunctions. |
1454 | | @param param1 The first parameter of the activation function, \f$\alpha\f$. Default value is 0. |
1455 | | @param param2 The second parameter of the activation function, \f$\beta\f$. Default value is 0. |
1456 | | */ |
1457 | | CV_WRAP virtual void setActivationFunction(int type, double param1 = 0, double param2 = 0) = 0; |
1458 | | |
1459 | | /** Integer vector specifying the number of neurons in each layer including the input and output layers. |
1460 | | The very first element specifies the number of elements in the input layer. |
1461 | | The last element - number of elements in the output layer. Default value is empty Mat. |
1462 | | @sa getLayerSizes */ |
1463 | | CV_WRAP virtual void setLayerSizes(InputArray _layer_sizes) = 0; |
1464 | | |
1465 | | /** Integer vector specifying the number of neurons in each layer including the input and output layers. |
1466 | | The very first element specifies the number of elements in the input layer. |
1467 | | The last element - number of elements in the output layer. |
1468 | | @sa setLayerSizes */ |
1469 | | CV_WRAP virtual cv::Mat getLayerSizes() const = 0; |
1470 | | |
1471 | | /** Termination criteria of the training algorithm. |
1472 | | You can specify the maximum number of iterations (maxCount) and/or how much the error could |
1473 | | change between the iterations to make the algorithm continue (epsilon). Default value is |
1474 | | TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, 0.01).*/ |
1475 | | /** @see setTermCriteria */ |
1476 | | CV_WRAP virtual TermCriteria getTermCriteria() const = 0; |
1477 | | /** @copybrief getTermCriteria @see getTermCriteria */ |
1478 | | CV_WRAP virtual void setTermCriteria(TermCriteria val) = 0; |
1479 | | |
1480 | | /** BPROP: Strength of the weight gradient term. |
1481 | | The recommended value is about 0.1. Default value is 0.1.*/ |
1482 | | /** @see setBackpropWeightScale */ |
1483 | | CV_WRAP virtual double getBackpropWeightScale() const = 0; |
1484 | | /** @copybrief getBackpropWeightScale @see getBackpropWeightScale */ |
1485 | | CV_WRAP virtual void setBackpropWeightScale(double val) = 0; |
1486 | | |
1487 | | /** BPROP: Strength of the momentum term (the difference between weights on the 2 previous iterations). |
1488 | | This parameter provides some inertia to smooth the random fluctuations of the weights. It can |
1489 | | vary from 0 (the feature is disabled) to 1 and beyond. The value 0.1 or so is good enough. |
1490 | | Default value is 0.1.*/ |
1491 | | /** @see setBackpropMomentumScale */ |
1492 | | CV_WRAP virtual double getBackpropMomentumScale() const = 0; |
1493 | | /** @copybrief getBackpropMomentumScale @see getBackpropMomentumScale */ |
1494 | | CV_WRAP virtual void setBackpropMomentumScale(double val) = 0; |
1495 | | |
1496 | | /** RPROP: Initial value \f$\Delta_0\f$ of update-values \f$\Delta_{ij}\f$. |
1497 | | Default value is 0.1.*/ |
1498 | | /** @see setRpropDW0 */ |
1499 | | CV_WRAP virtual double getRpropDW0() const = 0; |
1500 | | /** @copybrief getRpropDW0 @see getRpropDW0 */ |
1501 | | CV_WRAP virtual void setRpropDW0(double val) = 0; |
1502 | | |
1503 | | /** RPROP: Increase factor \f$\eta^+\f$. |
1504 | | It must be \>1. Default value is 1.2.*/ |
1505 | | /** @see setRpropDWPlus */ |
1506 | | CV_WRAP virtual double getRpropDWPlus() const = 0; |
1507 | | /** @copybrief getRpropDWPlus @see getRpropDWPlus */ |
1508 | | CV_WRAP virtual void setRpropDWPlus(double val) = 0; |
1509 | | |
1510 | | /** RPROP: Decrease factor \f$\eta^-\f$. |
1511 | | It must be \<1. Default value is 0.5.*/ |
1512 | | /** @see setRpropDWMinus */ |
1513 | | CV_WRAP virtual double getRpropDWMinus() const = 0; |
1514 | | /** @copybrief getRpropDWMinus @see getRpropDWMinus */ |
1515 | | CV_WRAP virtual void setRpropDWMinus(double val) = 0; |
1516 | | |
1517 | | /** RPROP: Update-values lower limit \f$\Delta_{min}\f$. |
1518 | | It must be positive. Default value is FLT_EPSILON.*/ |
1519 | | /** @see setRpropDWMin */ |
1520 | | CV_WRAP virtual double getRpropDWMin() const = 0; |
1521 | | /** @copybrief getRpropDWMin @see getRpropDWMin */ |
1522 | | CV_WRAP virtual void setRpropDWMin(double val) = 0; |
1523 | | |
1524 | | /** RPROP: Update-values upper limit \f$\Delta_{max}\f$. |
1525 | | It must be \>1. Default value is 50.*/ |
1526 | | /** @see setRpropDWMax */ |
1527 | | CV_WRAP virtual double getRpropDWMax() const = 0; |
1528 | | /** @copybrief getRpropDWMax @see getRpropDWMax */ |
1529 | | CV_WRAP virtual void setRpropDWMax(double val) = 0; |
1530 | | |
1531 | | /** ANNEAL: Update initial temperature. |
1532 | | It must be \>=0. Default value is 10.*/ |
1533 | | /** @see setAnnealInitialT */ |
1534 | | CV_WRAP virtual double getAnnealInitialT() const = 0; |
1535 | | /** @copybrief getAnnealInitialT @see getAnnealInitialT */ |
1536 | | CV_WRAP virtual void setAnnealInitialT(double val) = 0; |
1537 | | |
1538 | | /** ANNEAL: Update final temperature. |
1539 | | It must be \>=0 and less than initialT. Default value is 0.1.*/ |
1540 | | /** @see setAnnealFinalT */ |
1541 | | CV_WRAP virtual double getAnnealFinalT() const = 0; |
1542 | | /** @copybrief getAnnealFinalT @see getAnnealFinalT */ |
1543 | | CV_WRAP virtual void setAnnealFinalT(double val) = 0; |
1544 | | |
1545 | | /** ANNEAL: Update cooling ratio. |
1546 | | It must be \>0 and less than 1. Default value is 0.95.*/ |
1547 | | /** @see setAnnealCoolingRatio */ |
1548 | | CV_WRAP virtual double getAnnealCoolingRatio() const = 0; |
1549 | | /** @copybrief getAnnealCoolingRatio @see getAnnealCoolingRatio */ |
1550 | | CV_WRAP virtual void setAnnealCoolingRatio(double val) = 0; |
1551 | | |
1552 | | /** ANNEAL: Update iteration per step. |
1553 | | It must be \>0 . Default value is 10.*/ |
1554 | | /** @see setAnnealItePerStep */ |
1555 | | CV_WRAP virtual int getAnnealItePerStep() const = 0; |
1556 | | /** @copybrief getAnnealItePerStep @see getAnnealItePerStep */ |
1557 | | CV_WRAP virtual void setAnnealItePerStep(int val) = 0; |
1558 | | |
1559 | | /** @brief Set/initialize anneal RNG */ |
1560 | | virtual void setAnnealEnergyRNG(const RNG& rng) = 0; |
1561 | | |
1562 | | /** possible activation functions */ |
1563 | | enum ActivationFunctions { |
1564 | | /** Identity function: \f$f(x)=x\f$ */ |
1565 | | IDENTITY = 0, |
1566 | | /** Symmetrical sigmoid: \f$f(x)=\beta*(1-e^{-\alpha x})/(1+e^{-\alpha x})\f$ |
1567 | | @note |
1568 | | If you are using the default sigmoid activation function with the default parameter values |
1569 | | fparam1=0 and fparam2=0 then the function used is y = 1.7159\*tanh(2/3 \* x), so the output |
1570 | | will range from [-1.7159, 1.7159], instead of [0,1].*/ |
1571 | | SIGMOID_SYM = 1, |
1572 | | /** Gaussian function: \f$f(x)=\beta e^{-\alpha x*x}\f$ */ |
1573 | | GAUSSIAN = 2, |
1574 | | /** ReLU function: \f$f(x)=max(0,x)\f$ */ |
1575 | | RELU = 3, |
1576 | | /** Leaky ReLU function: for x>0 \f$f(x)=x \f$ and x<=0 \f$f(x)=\alpha x \f$*/ |
1577 | | LEAKYRELU= 4 |
1578 | | }; |
1579 | | |
1580 | | /** Train options */ |
1581 | | enum TrainFlags { |
1582 | | /** Update the network weights, rather than compute them from scratch. In the latter case |
1583 | | the weights are initialized using the Nguyen-Widrow algorithm. */ |
1584 | | UPDATE_WEIGHTS = 1, |
1585 | | /** Do not normalize the input vectors. If this flag is not set, the training algorithm |
1586 | | normalizes each input feature independently, shifting its mean value to 0 and making the |
1587 | | standard deviation equal to 1. If the network is assumed to be updated frequently, the new |
1588 | | training data could be much different from original one. In this case, you should take care |
1589 | | of proper normalization. */ |
1590 | | NO_INPUT_SCALE = 2, |
1591 | | /** Do not normalize the output vectors. If the flag is not set, the training algorithm |
1592 | | normalizes each output feature independently, by transforming it to the certain range |
1593 | | depending on the used activation function. */ |
1594 | | NO_OUTPUT_SCALE = 4 |
1595 | | }; |
1596 | | |
1597 | | CV_WRAP virtual Mat getWeights(int layerIdx) const = 0; |
1598 | | |
1599 | | /** @brief Creates empty model |
1600 | | |
1601 | | Use StatModel::train to train the model, Algorithm::load\<ANN_MLP\>(filename) to load the pre-trained model. |
1602 | | Note that the train method has optional flags: ANN_MLP::TrainFlags. |
1603 | | */ |
1604 | | CV_WRAP static Ptr<ANN_MLP> create(); |
1605 | | |
1606 | | /** @brief Loads and creates a serialized ANN from a file |
1607 | | * |
1608 | | * Use ANN::save to serialize and store an ANN to disk. |
1609 | | * Load the ANN from this file again, by calling this function with the path to the file. |
1610 | | * |
1611 | | * @param filepath path to serialized ANN |
1612 | | */ |
1613 | | CV_WRAP static Ptr<ANN_MLP> load(const String& filepath); |
1614 | | |
1615 | | }; |
1616 | | |
1617 | | #ifndef DISABLE_OPENCV_3_COMPATIBILITY |
1618 | | typedef ANN_MLP ANN_MLP_ANNEAL; |
1619 | | #endif |
1620 | | |
1621 | | /****************************************************************************************\ |
1622 | | * Logistic Regression * |
1623 | | \****************************************************************************************/ |
1624 | | |
1625 | | /** @brief Implements Logistic Regression classifier. |
1626 | | |
1627 | | @sa @ref ml_intro_lr |
1628 | | */ |
1629 | | class CV_EXPORTS_W LogisticRegression : public StatModel |
1630 | | { |
1631 | | public: |
1632 | | |
1633 | | /** Learning rate. */ |
1634 | | /** @see setLearningRate */ |
1635 | | CV_WRAP virtual double getLearningRate() const = 0; |
1636 | | /** @copybrief getLearningRate @see getLearningRate */ |
1637 | | CV_WRAP virtual void setLearningRate(double val) = 0; |
1638 | | |
1639 | | /** Number of iterations. */ |
1640 | | /** @see setIterations */ |
1641 | | CV_WRAP virtual int getIterations() const = 0; |
1642 | | /** @copybrief getIterations @see getIterations */ |
1643 | | CV_WRAP virtual void setIterations(int val) = 0; |
1644 | | |
1645 | | /** Kind of regularization to be applied. See LogisticRegression::RegKinds. */ |
1646 | | /** @see setRegularization */ |
1647 | | CV_WRAP virtual int getRegularization() const = 0; |
1648 | | /** @copybrief getRegularization @see getRegularization */ |
1649 | | CV_WRAP virtual void setRegularization(int val) = 0; |
1650 | | |
1651 | | /** Kind of training method used. See LogisticRegression::Methods. */ |
1652 | | /** @see setTrainMethod */ |
1653 | | CV_WRAP virtual int getTrainMethod() const = 0; |
1654 | | /** @copybrief getTrainMethod @see getTrainMethod */ |
1655 | | CV_WRAP virtual void setTrainMethod(int val) = 0; |
1656 | | |
1657 | | /** Specifies the number of training samples taken in each step of Mini-Batch Gradient |
1658 | | Descent. Will only be used if using LogisticRegression::MINI_BATCH training algorithm. It |
1659 | | has to take values less than the total number of training samples. */ |
1660 | | /** @see setMiniBatchSize */ |
1661 | | CV_WRAP virtual int getMiniBatchSize() const = 0; |
1662 | | /** @copybrief getMiniBatchSize @see getMiniBatchSize */ |
1663 | | CV_WRAP virtual void setMiniBatchSize(int val) = 0; |
1664 | | |
1665 | | /** Termination criteria of the algorithm. */ |
1666 | | /** @see setTermCriteria */ |
1667 | | CV_WRAP virtual TermCriteria getTermCriteria() const = 0; |
1668 | | /** @copybrief getTermCriteria @see getTermCriteria */ |
1669 | | CV_WRAP virtual void setTermCriteria(TermCriteria val) = 0; |
1670 | | |
1671 | | //! Regularization kinds |
1672 | | enum RegKinds { |
1673 | | REG_DISABLE = -1, //!< Regularization disabled |
1674 | | REG_L1 = 0, //!< %L1 norm |
1675 | | REG_L2 = 1 //!< %L2 norm |
1676 | | }; |
1677 | | |
1678 | | //! Training methods |
1679 | | enum Methods { |
1680 | | BATCH = 0, |
1681 | | MINI_BATCH = 1 //!< Set MiniBatchSize to a positive integer when using this method. |
1682 | | }; |
1683 | | |
1684 | | /** @brief Predicts responses for input samples and returns a float type. |
1685 | | |
1686 | | @param samples The input data for the prediction algorithm. Matrix [m x n], where each row |
1687 | | contains variables (features) of one object being classified. Should have data type CV_32F. |
1688 | | @param results Predicted labels as a column matrix of type CV_32S. |
1689 | | @param flags Not used. |
1690 | | */ |
1691 | | CV_WRAP virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const CV_OVERRIDE = 0; |
1692 | | |
1693 | | /** @brief This function returns the trained parameters arranged across rows. |
1694 | | |
1695 | | For a two class classification problem, it returns a row matrix. It returns learnt parameters of |
1696 | | the Logistic Regression as a matrix of type CV_32F. |
1697 | | */ |
1698 | | CV_WRAP virtual Mat get_learnt_thetas() const = 0; |
1699 | | |
1700 | | /** @brief Creates empty model. |
1701 | | |
1702 | | Creates Logistic Regression model with parameters given. |
1703 | | */ |
1704 | | CV_WRAP static Ptr<LogisticRegression> create(); |
1705 | | |
1706 | | /** @brief Loads and creates a serialized LogisticRegression from a file |
1707 | | * |
1708 | | * Use LogisticRegression::save to serialize and store an LogisticRegression to disk. |
1709 | | * Load the LogisticRegression from this file again, by calling this function with the path to the file. |
1710 | | * Optionally specify the node for the file containing the classifier |
1711 | | * |
1712 | | * @param filepath path to serialized LogisticRegression |
1713 | | * @param nodeName name of node containing the classifier |
1714 | | */ |
1715 | | CV_WRAP static Ptr<LogisticRegression> load(const String& filepath , const String& nodeName = String()); |
1716 | | }; |
1717 | | |
1718 | | |
1719 | | /****************************************************************************************\ |
1720 | | * Stochastic Gradient Descent SVM Classifier * |
1721 | | \****************************************************************************************/ |
1722 | | |
1723 | | /*! |
1724 | | @brief Stochastic Gradient Descent SVM classifier |
1725 | | |
1726 | | SVMSGD provides a fast and easy-to-use implementation of the SVM classifier using the Stochastic Gradient Descent approach, |
1727 | | as presented in @cite bottou2010large. |
1728 | | |
1729 | | The classifier has following parameters: |
1730 | | - model type, |
1731 | | - margin type, |
1732 | | - margin regularization (\f$\lambda\f$), |
1733 | | - initial step size (\f$\gamma_0\f$), |
1734 | | - step decreasing power (\f$c\f$), |
1735 | | - and termination criteria. |
1736 | | |
1737 | | The model type may have one of the following values: \ref SGD and \ref ASGD. |
1738 | | |
1739 | | - \ref SGD is the classic version of SVMSGD classifier: every next step is calculated by the formula |
1740 | | \f[w_{t+1} = w_t - \gamma(t) \frac{dQ_i}{dw} |_{w = w_t}\f] |
1741 | | where |
1742 | | - \f$w_t\f$ is the weights vector for decision function at step \f$t\f$, |
1743 | | - \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 |
1744 | | \f$\gamma(t) = \gamma_0 (1 + \lambda \gamma_0 t) ^ {-c}\f$ |
1745 | | - \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. |
1746 | | |
1747 | | - \ref ASGD is Average Stochastic Gradient Descent SVM Classifier. ASGD classifier averages weights vector on each step of algorithm by the formula |
1748 | | \f$\widehat{w}_{t+1} = \frac{t}{1+t}\widehat{w}_{t} + \frac{1}{1+t}w_{t+1}\f$ |
1749 | | |
1750 | | The recommended model type is ASGD (following @cite bottou2010large). |
1751 | | |
1752 | | The margin type may have one of the following values: \ref SOFT_MARGIN or \ref HARD_MARGIN. |
1753 | | |
1754 | | - You should use \ref HARD_MARGIN type, if you have linearly separable sets. |
1755 | | - You should use \ref SOFT_MARGIN type, if you have non-linearly separable sets or sets with outliers. |
1756 | | - In the general case (if you know nothing about linear separability of your sets), use SOFT_MARGIN. |
1757 | | |
1758 | | The other parameters may be described as follows: |
1759 | | - Margin regularization parameter is responsible for weights decreasing at each step and for the strength of restrictions on outliers |
1760 | | (the less the parameter, the less probability that an outlier will be ignored). |
1761 | | Recommended value for SGD model is 0.0001, for ASGD model is 0.00001. |
1762 | | |
1763 | | - Initial step size parameter is the initial value for the step size \f$\gamma(t)\f$. |
1764 | | You will have to find the best initial step for your problem. |
1765 | | |
1766 | | - Step decreasing power is the power parameter for \f$\gamma(t)\f$ decreasing by the formula, mentioned above. |
1767 | | Recommended value for SGD model is 1, for ASGD model is 0.75. |
1768 | | |
1769 | | - Termination criteria can be TermCriteria::COUNT, TermCriteria::EPS or TermCriteria::COUNT + TermCriteria::EPS. |
1770 | | You will have to find the best termination criteria for your problem. |
1771 | | |
1772 | | Note that the parameters margin regularization, initial step size, and step decreasing power should be positive. |
1773 | | |
1774 | | To use SVMSGD algorithm do as follows: |
1775 | | |
1776 | | - first, create the SVMSGD object. The algorithm will set optimal parameters by default, but you can set your own parameters via functions setSvmsgdType(), |
1777 | | setMarginType(), setMarginRegularization(), setInitialStepSize(), and setStepDecreasingPower(). |
1778 | | |
1779 | | - then the SVM model can be trained using the train features and the correspondent labels by the method train(). |
1780 | | |
1781 | | - after that, the label of a new feature vector can be predicted using the method predict(). |
1782 | | |
1783 | | @code |
1784 | | // Create empty object |
1785 | | cv::Ptr<SVMSGD> svmsgd = SVMSGD::create(); |
1786 | | |
1787 | | // Train the Stochastic Gradient Descent SVM |
1788 | | svmsgd->train(trainData); |
1789 | | |
1790 | | // Predict labels for the new samples |
1791 | | svmsgd->predict(samples, responses); |
1792 | | @endcode |
1793 | | |
1794 | | */ |
1795 | | |
1796 | | class CV_EXPORTS_W SVMSGD : public cv::ml::StatModel |
1797 | | { |
1798 | | public: |
1799 | | |
1800 | | /** SVMSGD type. |
1801 | | ASGD is often the preferable choice. */ |
1802 | | enum SvmsgdType |
1803 | | { |
1804 | | SGD, //!< Stochastic Gradient Descent |
1805 | | ASGD //!< Average Stochastic Gradient Descent |
1806 | | }; |
1807 | | |
1808 | | /** Margin type.*/ |
1809 | | enum MarginType |
1810 | | { |
1811 | | SOFT_MARGIN, //!< General case, suits to the case of non-linearly separable sets, allows outliers. |
1812 | | HARD_MARGIN //!< More accurate for the case of linearly separable sets. |
1813 | | }; |
1814 | | |
1815 | | /** |
1816 | | * @return the weights of the trained model (decision function f(x) = weights * x + shift). |
1817 | | */ |
1818 | | CV_WRAP virtual Mat getWeights() = 0; |
1819 | | |
1820 | | /** |
1821 | | * @return the shift of the trained model (decision function f(x) = weights * x + shift). |
1822 | | */ |
1823 | | CV_WRAP virtual float getShift() = 0; |
1824 | | |
1825 | | /** @brief Creates empty model. |
1826 | | * Use StatModel::train to train the model. Since %SVMSGD has several parameters, you may want to |
1827 | | * find the best parameters for your problem or use setOptimalParameters() to set some default parameters. |
1828 | | */ |
1829 | | CV_WRAP static Ptr<SVMSGD> create(); |
1830 | | |
1831 | | /** @brief Loads and creates a serialized SVMSGD from a file |
1832 | | * |
1833 | | * Use SVMSGD::save to serialize and store an SVMSGD to disk. |
1834 | | * Load the SVMSGD from this file again, by calling this function with the path to the file. |
1835 | | * Optionally specify the node for the file containing the classifier |
1836 | | * |
1837 | | * @param filepath path to serialized SVMSGD |
1838 | | * @param nodeName name of node containing the classifier |
1839 | | */ |
1840 | | CV_WRAP static Ptr<SVMSGD> load(const String& filepath , const String& nodeName = String()); |
1841 | | |
1842 | | /** @brief Function sets optimal parameters values for chosen SVM SGD model. |
1843 | | * @param svmsgdType is the type of SVMSGD classifier. |
1844 | | * @param marginType is the type of margin constraint. |
1845 | | */ |
1846 | | CV_WRAP virtual void setOptimalParameters(int svmsgdType = SVMSGD::ASGD, int marginType = SVMSGD::SOFT_MARGIN) = 0; |
1847 | | |
1848 | | /** @brief %Algorithm type, one of SVMSGD::SvmsgdType. */ |
1849 | | /** @see setSvmsgdType */ |
1850 | | CV_WRAP virtual int getSvmsgdType() const = 0; |
1851 | | /** @copybrief getSvmsgdType @see getSvmsgdType */ |
1852 | | CV_WRAP virtual void setSvmsgdType(int svmsgdType) = 0; |
1853 | | |
1854 | | /** @brief %Margin type, one of SVMSGD::MarginType. */ |
1855 | | /** @see setMarginType */ |
1856 | | CV_WRAP virtual int getMarginType() const = 0; |
1857 | | /** @copybrief getMarginType @see getMarginType */ |
1858 | | CV_WRAP virtual void setMarginType(int marginType) = 0; |
1859 | | |
1860 | | /** @brief Parameter marginRegularization of a %SVMSGD optimization problem. */ |
1861 | | /** @see setMarginRegularization */ |
1862 | | CV_WRAP virtual float getMarginRegularization() const = 0; |
1863 | | /** @copybrief getMarginRegularization @see getMarginRegularization */ |
1864 | | CV_WRAP virtual void setMarginRegularization(float marginRegularization) = 0; |
1865 | | |
1866 | | /** @brief Parameter initialStepSize of a %SVMSGD optimization problem. */ |
1867 | | /** @see setInitialStepSize */ |
1868 | | CV_WRAP virtual float getInitialStepSize() const = 0; |
1869 | | /** @copybrief getInitialStepSize @see getInitialStepSize */ |
1870 | | CV_WRAP virtual void setInitialStepSize(float InitialStepSize) = 0; |
1871 | | |
1872 | | /** @brief Parameter stepDecreasingPower of a %SVMSGD optimization problem. */ |
1873 | | /** @see setStepDecreasingPower */ |
1874 | | CV_WRAP virtual float getStepDecreasingPower() const = 0; |
1875 | | /** @copybrief getStepDecreasingPower @see getStepDecreasingPower */ |
1876 | | CV_WRAP virtual void setStepDecreasingPower(float stepDecreasingPower) = 0; |
1877 | | |
1878 | | /** @brief Termination criteria of the training algorithm. |
1879 | | You can specify the maximum number of iterations (maxCount) and/or how much the error could |
1880 | | change between the iterations to make the algorithm continue (epsilon).*/ |
1881 | | /** @see setTermCriteria */ |
1882 | | CV_WRAP virtual TermCriteria getTermCriteria() const = 0; |
1883 | | /** @copybrief getTermCriteria @see getTermCriteria */ |
1884 | | CV_WRAP virtual void setTermCriteria(const cv::TermCriteria &val) = 0; |
1885 | | }; |
1886 | | |
1887 | | |
1888 | | /****************************************************************************************\ |
1889 | | * Auxiliary functions declarations * |
1890 | | \****************************************************************************************/ |
1891 | | |
1892 | | /** @brief Generates _sample_ from multivariate normal distribution |
1893 | | |
1894 | | @param mean an average row vector |
1895 | | @param cov symmetric covariation matrix |
1896 | | @param nsamples returned samples count |
1897 | | @param samples returned samples array |
1898 | | */ |
1899 | | CV_EXPORTS void randMVNormal( InputArray mean, InputArray cov, int nsamples, OutputArray samples); |
1900 | | |
1901 | | /** @brief Creates test set */ |
1902 | | CV_EXPORTS void createConcentricSpheresTestSet( int nsamples, int nfeatures, int nclasses, |
1903 | | OutputArray samples, OutputArray responses); |
1904 | | |
1905 | | |
1906 | | /****************************************************************************************\ |
1907 | | * Simulated annealing solver * |
1908 | | \****************************************************************************************/ |
1909 | | |
1910 | | #ifdef CV_DOXYGEN |
1911 | | /** @brief This class declares example interface for system state used in simulated annealing optimization algorithm. |
1912 | | |
1913 | | @note This class is not defined in C++ code and can't be use directly - you need your own implementation with the same methods. |
1914 | | */ |
1915 | | struct SimulatedAnnealingSolverSystem |
1916 | | { |
1917 | | /** Give energy value for a state of system.*/ |
1918 | | double energy() const; |
1919 | | /** Function which change the state of system (random perturbation).*/ |
1920 | | void changeState(); |
1921 | | /** Function to reverse to the previous state. Can be called once only after changeState(). */ |
1922 | | void reverseState(); |
1923 | | }; |
1924 | | #endif // CV_DOXYGEN |
1925 | | |
1926 | | /** @brief The class implements simulated annealing for optimization. |
1927 | | |
1928 | | @cite Kirkpatrick83 for details |
1929 | | |
1930 | | @param solverSystem optimization system (see SimulatedAnnealingSolverSystem) |
1931 | | @param initialTemperature initial temperature |
1932 | | @param finalTemperature final temperature |
1933 | | @param coolingRatio temperature step multiplies |
1934 | | @param iterationsPerStep number of iterations per temperature changing step |
1935 | | @param lastTemperature optional output for last used temperature |
1936 | | @param rngEnergy specify custom random numbers generator (cv::theRNG() by default) |
1937 | | */ |
1938 | | template<class SimulatedAnnealingSolverSystem> |
1939 | | int simulatedAnnealingSolver(SimulatedAnnealingSolverSystem& solverSystem, |
1940 | | double initialTemperature, double finalTemperature, double coolingRatio, |
1941 | | size_t iterationsPerStep, |
1942 | | CV_OUT double* lastTemperature = NULL, |
1943 | | cv::RNG& rngEnergy = cv::theRNG() |
1944 | | ); |
1945 | | |
1946 | | //! @} ml |
1947 | | |
1948 | | } |
1949 | | } |
1950 | | |
1951 | | #include <opencv2/ml/ml.inl.hpp> |
1952 | | |
1953 | | #endif // __cplusplus |
1954 | | #endif // OPENCV_ML_HPP |
1955 | | |
1956 | | /* End of file. */ |