@note The following code has been implemented with OpenCV 3.0 classes and functions. An equivalent version of the code
using OpenCV 2.4 can be found in [this page.](http://docs.opencv.org/2.4/doc/tutorials/ml/non_linear_svms/non_linear_svms.html#nonlinearsvms)
-@include cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp
+@add_toggle_cpp
+- **Downloadable code**: Click
+ [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp)
+
+- **Code at glance:**
+ @include samples/cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp
+@end_toggle
+
+@add_toggle_java
+- **Downloadable code**: Click
+ [here](https://github.com/opencv/opencv/tree/master/samples/java/tutorial_code/ml/non_linear_svms/NonLinearSVMsDemo.java)
+
+- **Code at glance:**
+ @include samples/java/tutorial_code/ml/non_linear_svms/NonLinearSVMsDemo.java
+@end_toggle
+
+@add_toggle_python
+- **Downloadable code**: Click
+ [here](https://github.com/opencv/opencv/tree/master/samples/python/tutorial_code/ml/non_linear_svms/non_linear_svms.py)
+
+- **Code at glance:**
+ @include samples/python/tutorial_code/ml/non_linear_svms/non_linear_svms.py
+@end_toggle
Explanation
-----------
--# __Set up the training data__
+- __Set up the training data__
+
+The training data of this exercise is formed by a set of labeled 2D-points that belong to one of
+two different classes. To make the exercise more appealing, the training data is generated
+randomly using a uniform probability density functions (PDFs).
+
+We have divided the generation of the training data into two main parts.
+
+In the first part we generate data for both classes that is linearly separable.
+
+@add_toggle_cpp
+@snippet samples/cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp setup1
+@end_toggle
+
+@add_toggle_java
+@snippet samples/java/tutorial_code/ml/non_linear_svms/NonLinearSVMsDemo.java setup1
+@end_toggle
+
+@add_toggle_python
+@snippet samples/python/tutorial_code/ml/non_linear_svms/non_linear_svms.py setup1
+@end_toggle
+
+In the second part we create data for both classes that is non-linearly separable, data that
+overlaps.
+
+@add_toggle_cpp
+@snippet samples/cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp setup2
+@end_toggle
+
+@add_toggle_java
+@snippet samples/java/tutorial_code/ml/non_linear_svms/NonLinearSVMsDemo.java setup2
+@end_toggle
+
+@add_toggle_python
+@snippet samples/python/tutorial_code/ml/non_linear_svms/non_linear_svms.py setup2
+@end_toggle
+
+- __Set up SVM's parameters__
+
+@note In the previous tutorial @ref tutorial_introduction_to_svm there is an explanation of the
+attributes of the class @ref cv::ml::SVM that we configure here before training the SVM.
+
+@add_toggle_cpp
+@snippet samples/cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp init
+@end_toggle
+
+@add_toggle_java
+@snippet samples/java/tutorial_code/ml/non_linear_svms/NonLinearSVMsDemo.java init
+@end_toggle
+
+@add_toggle_python
+@snippet samples/python/tutorial_code/ml/non_linear_svms/non_linear_svms.py init
+@end_toggle
+
+There are just two differences between the configuration we do here and the one that was done in
+the previous tutorial (@ref tutorial_introduction_to_svm) that we use as reference.
- The training data of this exercise is formed by a set of labeled 2D-points that belong to one of
- two different classes. To make the exercise more appealing, the training data is generated
- randomly using a uniform probability density functions (PDFs).
+- _C_. We chose here a small value of this parameter in order not to punish too much the
+ misclassification errors in the optimization. The idea of doing this stems from the will of
+ obtaining a solution close to the one intuitively expected. However, we recommend to get a
+ better insight of the problem by making adjustments to this parameter.
- We have divided the generation of the training data into two main parts.
+ @note In this case there are just very few points in the overlapping region between classes.
+ By giving a smaller value to __FRAC_LINEAR_SEP__ the density of points can be incremented and the
+ impact of the parameter _C_ explored deeply.
- In the first part we generate data for both classes that is linearly separable.
- @snippet cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp setup1
+- _Termination Criteria of the algorithm_. The maximum number of iterations has to be
+ increased considerably in order to solve correctly a problem with non-linearly separable
+ training data. In particular, we have increased in five orders of magnitude this value.
- In the second part we create data for both classes that is non-linearly separable, data that
- overlaps.
- @snippet cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp setup2
+- __Train the SVM__
--# __Set up SVM's parameters__
+We call the method @ref cv::ml::SVM::train to build the SVM model. Watch out that the training
+process may take a quite long time. Have patiance when your run the program.
- @note In the previous tutorial @ref tutorial_introduction_to_svm there is an explanation of the
- attributes of the class @ref cv::ml::SVM that we configure here before training the SVM.
+@add_toggle_cpp
+@snippet samples/cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp train
+@end_toggle
- @snippet cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp init
+@add_toggle_java
+@snippet samples/java/tutorial_code/ml/non_linear_svms/NonLinearSVMsDemo.java train
+@end_toggle
- There are just two differences between the configuration we do here and the one that was done in
- the previous tutorial (@ref tutorial_introduction_to_svm) that we use as reference.
+@add_toggle_python
+@snippet samples/python/tutorial_code/ml/non_linear_svms/non_linear_svms.py train
+@end_toggle
- - _C_. We chose here a small value of this parameter in order not to punish too much the
- misclassification errors in the optimization. The idea of doing this stems from the will of
- obtaining a solution close to the one intuitively expected. However, we recommend to get a
- better insight of the problem by making adjustments to this parameter.
+- __Show the Decision Regions__
- @note In this case there are just very few points in the overlapping region between classes.
- By giving a smaller value to __FRAC_LINEAR_SEP__ the density of points can be incremented and the
- impact of the parameter _C_ explored deeply.
+The method @ref cv::ml::SVM::predict is used to classify an input sample using a trained SVM. In
+this example we have used this method in order to color the space depending on the prediction done
+by the SVM. In other words, an image is traversed interpreting its pixels as points of the
+Cartesian plane. Each of the points is colored depending on the class predicted by the SVM; in
+dark green if it is the class with label 1 and in dark blue if it is the class with label 2.
- - _Termination Criteria of the algorithm_. The maximum number of iterations has to be
- increased considerably in order to solve correctly a problem with non-linearly separable
- training data. In particular, we have increased in five orders of magnitude this value.
+@add_toggle_cpp
+@snippet samples/cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp show
+@end_toggle
--# __Train the SVM__
+@add_toggle_java
+@snippet samples/java/tutorial_code/ml/non_linear_svms/NonLinearSVMsDemo.java show
+@end_toggle
- We call the method @ref cv::ml::SVM::train to build the SVM model. Watch out that the training
- process may take a quite long time. Have patiance when your run the program.
+@add_toggle_python
+@snippet samples/python/tutorial_code/ml/non_linear_svms/non_linear_svms.py show
+@end_toggle
- @snippet cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp train
+- __Show the training data__
--# __Show the Decision Regions__
+The method @ref cv::circle is used to show the samples that compose the training data. The samples
+of the class labeled with 1 are shown in light green and in light blue the samples of the class
+labeled with 2.
- The method @ref cv::ml::SVM::predict is used to classify an input sample using a trained SVM. In
- this example we have used this method in order to color the space depending on the prediction done
- by the SVM. In other words, an image is traversed interpreting its pixels as points of the
- Cartesian plane. Each of the points is colored depending on the class predicted by the SVM; in
- dark green if it is the class with label 1 and in dark blue if it is the class with label 2.
+@add_toggle_cpp
+@snippet samples/cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp show_data
+@end_toggle
- @snippet cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp show
+@add_toggle_java
+@snippet samples/java/tutorial_code/ml/non_linear_svms/NonLinearSVMsDemo.java show_data
+@end_toggle
--# __Show the training data__
+@add_toggle_python
+@snippet samples/python/tutorial_code/ml/non_linear_svms/non_linear_svms.py show_data
+@end_toggle
- The method @ref cv::circle is used to show the samples that compose the training data. The samples
- of the class labeled with 1 are shown in light green and in light blue the samples of the class
- labeled with 2.
+- __Support vectors__
- @snippet cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp show_data
+We use here a couple of methods to obtain information about the support vectors. The method
+@ref cv::ml::SVM::getSupportVectors obtain all support vectors. We have used this methods here
+to find the training examples that are support vectors and highlight them.
--# __Support vectors__
+@add_toggle_cpp
+@snippet samples/cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp show_vectors
+@end_toggle
- We use here a couple of methods to obtain information about the support vectors. The method
- @ref cv::ml::SVM::getSupportVectors obtain all support vectors. We have used this methods here
- to find the training examples that are support vectors and highlight them.
+@add_toggle_java
+@snippet samples/java/tutorial_code/ml/non_linear_svms/NonLinearSVMsDemo.java show_vectors
+@end_toggle
- @snippet cpp/tutorial_code/ml/non_linear_svms/non_linear_svms.cpp show_vectors
+@add_toggle_python
+@snippet samples/python/tutorial_code/ml/non_linear_svms/non_linear_svms.py show_vectors
+@end_toggle
Results
-------