sklearn-porter

Repository: https://github.com/nok/sklearn-porter

LinearSVC

Documentation: sklearn.svm.LinearSVC


In [1]:
import sys
sys.path.append('../../../../..')

Load data


In [2]:
from sklearn.datasets import load_iris

iris_data = load_iris()

X = iris_data.data
y = iris_data.target

print(X.shape, y.shape)


((150, 4), (150,))

Train classifier


In [3]:
from sklearn import svm

clf = svm.LinearSVC(C=1., random_state=0)
clf.fit(X, y)


/opt/miniconda/envs/sklearn-porter/lib/python2.7/site-packages/sklearn/svm/base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  "the number of iterations.", ConvergenceWarning)
Out[3]:
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
     intercept_scaling=1, loss='squared_hinge', max_iter=1000,
     multi_class='ovr', penalty='l2', random_state=0, tol=0.0001,
     verbose=0)

Transpile classifier


In [4]:
from sklearn_porter import Porter

porter = Porter(clf, language='go')
output = porter.export()

print(output)


package main

import (
	"os"
	"fmt"
	"strconv"
	"math"
)

type LinearSVC struct {
	coefficients [][]float64
	intercepts []float64
}

func (svc LinearSVC) predict(features []float64) int {
	classIdx := 0
	classVal := math.Inf(-1)
	outerCount, innerCount := len(svc.coefficients), len(svc.coefficients[0])
	for i := 0; i < outerCount; i++ {
		var prob float64
		for j := 0; j < innerCount; j++ {
			prob = prob + svc.coefficients[i][j] * features[j]
		}
		if prob + svc.intercepts[i] > classVal {
			classVal = prob + svc.intercepts[i]
			classIdx = i
		}
	}
	return classIdx
}

func main() {

	// Features:
	var features []float64
	for _, arg := range os.Args[1:] {
		if n, err := strconv.ParseFloat(arg, 64); err == nil {
			features = append(features, n)
		}
	}

	// Parameters:
	coefficients := [][]float64{{0.1842387105153816, 0.45123226735416666, -0.8079442418237148, -0.4507120994138801}, {0.05538075463135362, -0.9011091317807134, 0.40964725305179495, -0.9616708418438406}, {-0.8507797840387784, -0.9866797559823655, 1.380978948733964, 1.865367212912733}}
	intercepts := []float64{0.10956037385996253, 1.6860176665898299, -1.7096500573837932}

	// Prediction:
	clf := LinearSVC{coefficients, intercepts}
	estimation := clf.predict(features)
	fmt.Printf("%d\n", estimation)

}