[![Build Status](https://travis-ci.org/titsuki/p6-Algorithm-LibSVM.svg?branch=master)](https://travis-ci.org/titsuki/p6-Algorithm-LibSVM)

NAME
====

Algorithm::LibSVM - A Perl 6 bindings for libsvm

SYNOPSIS
========

EXAMPLE 1
---------

    use Algorithm::LibSVM;
    use Algorithm::LibSVM::Parameter;
    use Algorithm::LibSVM::Problem;
    use Algorithm::LibSVM::Model;

    my $libsvm = Algorithm::LibSVM.new;
    my Algorithm::LibSVM::Parameter $parameter .= new(svm-type => C_SVC,
                                                      kernel-type => RBF);
    my Algorithm::LibSVM::Problem $problem = $libsvm.load-problem('heart_scale');
    my @r = $libsvm.cross-validation($problem, $parameter, 10);
    $libsvm.evaluate($problem.y, @r).say; # {acc => 81.1111111111111, mse => 0.755555555555556, scc => 1.01157627463546}

EXAMPLE 2
---------

    use Algorithm::LibSVM;
    use Algorithm::LibSVM::Parameter;
    use Algorithm::LibSVM::Problem;
    use Algorithm::LibSVM::Model;

    sub gen-train {
        my $max-x = 1;
        my $min-x = -1;
        my $max-y = 1;
        my $min-y = -1;

        do for ^300 {
           my $x = $min-x + rand * ($max-x - $min-x);
           my $y = $min-y + rand * ($max-y - $min-y);

           my $label = do given $x, $y {
              when ($x - 0.5) ** 2 + ($y - 0.5) ** 2 <= 0.2 {
                     1
              }
              when ($x - -0.5) ** 2 + ($y - -0.5) ** 2 <= 0.2 {
                  2
              }
              default { Nil }
        }
        ($label,"1:$x","2:$y") if $label.defined;
      }.sort({ $^a.[0] cmp $^b.[0] })>>.join(" ")
    }

    my Str @train = gen-train;

    my Pair @test = parse-libsvmformat(q:to/END/).head<pairs>.flat;
    1 1:0.5 2:0.5
    END

    my $libsvm = Algorithm::LibSVM.new;
    my Algorithm::LibSVM::Parameter $parameter .= new(svm-type => C_SVC,
                                                      kernel-type => LINEAR);
    my Algorithm::LibSVM::Problem $problem = $libsvm.load-problem(@train);
    my $model = $libsvm.train($problem, $parameter);
    say $model.predict(features => @test)<label> # 1

DESCRIPTION
===========

Algorithm::LibSVM is a Perl 6 bindings for libsvm.

METHODS
-------

### cross-validation

Defined as:

    method cross-validation(Algorithm::LibSVM::Problem $problem, Algorithm::LibSVM::Parameter $param, Int $nr-fold --> List)

Conducts `$nr-fold`-fold cross validation and returns predicted values.

### train

Defined as:

    method train(Algorithm::LibSVM::Problem $problem, Algorithm::LibSVM::Parameter $param --> Algorithm::LibSVM::Model)

Trains a SVM model.

  * `$problem` The instance of Algorithm::LibSVM::Problem.

  * `$param` The instance of Algorithm::LibSVM::Parameter.

### load-problem

Defined as:

    multi method load-problem(\lines --> Algorithm::LibSVM::Problem)
    multi method load-problem(Str $filename --> Algorithm::LibSVM::Problem)

Loads libsvm-format data.

### load-model

Defined as:

    method load-model(Str $filename --> Algorithm::LibSVM::Model)

Loads libsvm model.

### evaluate

Defined as:

    method evaluate(@true-values, @predicted-values --> Hash)

Evaluates the performance of the three metrics (i.e. accuracy, mean squared error and squared correlation coefficient)

  * `@true-values` The array that contains ground-truth values.

  * `@predicted-values` The array that contains predicted values.

### nr-feature

Defined as:

    method nr-feature(--> Int:D)

Returns the maximum index of all the features.

ROUTINES
--------

### parse-libsvmformat

Defined as:

    sub parse-libsvmformat(Str $text --> List) is export

Is a helper routine for handling libsvm-format text.

CAUTION
=======

DON'T USE `PRECOMPUTED` KERNEL
------------------------------

As a workaround for [RT130187](https://rt.perl.org/Public/Bug/Display.html?id=130187), I applied the patch programs (e.g. [src/3.22/svm.cpp.patch](src/3.22/svm.cpp.patch)) for the sake of disabling random access of the problematic array.

Sadly to say, those patches drastically increase the complexity of using `PRECOMPUTED` kernel.

SEE ALSO
========

  * libsvm [https://github.com/cjlin1/libsvm](https://github.com/cjlin1/libsvm)

  * RT130187 [https://rt.perl.org/Public/Bug/Display.html?id=130187](https://rt.perl.org/Public/Bug/Display.html?id=130187)

AUTHOR
======

titsuki <titsuki@cpan.org>

COPYRIGHT AND LICENSE
=====================

Copyright 2016 titsuki

This library is free software; you can redistribute it and/or modify it under the terms of the MIT License.

libsvm ( https://github.com/cjlin1/libsvm ) by Chih-Chung Chang and Chih-Jen Lin is licensed under the BSD 3-Clause License.

