SVMregression.cpp

#include <Rng/GlobalRng.h>
#include <ReClaM/Svm.h>
#include <ReClaM/MeanSquaredError.h>
#include <iostream>


using namespace std;


double sinc(double x)
{
    if (x == 0.0) return 1.0;
    else return sin(x) / x;
}


int main()
{
    cout << "*** Support Vector Machine example program ***" << endl << endl;
    cout << "The regression training data are sampled from a sinc function" << endl;
    cout << "with additive Gaussian white noise." << endl;
    cout << endl;

    unsigned int e;
    Rng::seed(42);

    double C = 100.0;
    double epsilon = 0.1;
    double sigma = 2.0;
    unsigned int examples = 100;

    // create the sinc problem
    Array<double> x(examples, 1);
    Array<double> t(examples, 1);
    Array<double> y(examples, 1);
    for (e = 0; e < examples; e++)
    {
        x(e, 0) = Rng::uni(-12.0, 12.0);                // point
        t(e, 0) = sinc(x(e, 0));                        // target
        y(e, 0) = t(e, 0) + Rng::gauss(0.0, 0.01);      // label
    }

    // create the SVM for prediction
    double gamma = 0.5 / (sigma * sigma);
    RBFKernel k(gamma);
    SVM svm(&k, false);

    // create a training scheme and an optimizer for learning
    Epsilon_SVM esvm(&svm, C, epsilon);
    SVM_Optimizer SVMopt;
    SVMopt.init(esvm);

    // train the SVM
    cout << "Support Vector Machine training ..." << flush;
    SVMopt.optimize(svm, x, y);
    cout << " done." << endl << endl;

    // compute the mean squared error on the training data:
    MeanSquaredError mse;
    double err = mse.error(svm, x, t);
    cout << "mean squared error on the training data: " << err << endl << endl;

    // lines below are for self-testing this example, please ignore
    if (err <= 0.0015) exit(EXIT_SUCCESS);
    else exit(EXIT_FAILURE);
}