Help language development. Donate to The Perl Foundation

## Algorithm::LibSVM cpan:TITSUKI last updated on 2021-07-23

```[![Actions Status](https://github.com/titsuki/raku-Algorithm-LibSVM/workflows/test/badge.svg)](https://github.com/titsuki/raku-Algorithm-LibSVM/actions)

NAME
====

Algorithm::LibSVM - A Raku 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 @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;

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 \$model = \$libsvm.train(\$problem, \$parameter);
say \$model.predict(features => @test)<label> # 1

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

Algorithm::LibSVM is a Raku 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.

Defined as:

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

Defined as:

### 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.

========

* 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 <[email protected]>