Documentation
¶
Overview ¶
Package svm includes Support Vector Machine algorithms.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type BaseLibSVM ¶
type BaseLibSVM struct {
C, Epsilon float64
Kernel interface{} // string or func(a, b []float64) float64
Degree float64
Gamma float64
Coef0 float64
Tol float64
Shrinking bool
CacheSize uint
RandomState base.Source
MaxIter int
Model []*Model
Support [][]int
SupportVectors [][][]float64
}
BaseLibSVM is a base for SVC and SVR
type LinearKernel ¶
type LinearKernel struct{}
LinearKernel is dot product
func (LinearKernel) Func ¶
func (LinearKernel) Func(a, b []float64) (sumprod float64)
Func for LinearKernel
type Model ¶
type Model struct {
X *mat.Dense
Y []float64
KernelFunction func(X1, X2 []float64) float64
B float64
Alphas []float64
Support []int
}
Model for SVM
type PolynomialKernel ¶
type PolynomialKernel struct {
// contains filtered or unexported fields
}
PolynomialKernel ...
func (PolynomialKernel) Func ¶
func (kdata PolynomialKernel) Func(a, b []float64) (sumprod float64)
Func for PolynomialKernel
type SVC ¶
type SVC struct {
BaseLibSVM
Probability bool
ClassWeight []float64
// contains filtered or unexported fields
}
SVC struct
Example ¶
package main
import (
"flag"
"fmt"
"image/color"
"os"
"os/exec"
"time"
"github.com/pa-m/sklearn/metrics"
"github.com/pa-m/sklearn/preprocessing"
"gonum.org/v1/gonum/mat"
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/vg"
"gonum.org/v1/plot/vg/draw"
"gonum.org/v1/plot/vg/vgimg"
)
var visualDebug = flag.Bool("visual", false, "output images for benchmarks and test data")
func main() {
// example adapted from http://scikit-learn.org/stable/auto_examples/svm/plot_svm_kernels.html
X := mat.NewDense(16, 2, []float64{0.4, -0.7, -1.5, -1., -1.4, -0.9, -1.3, -1.2, -1.1, -0.2, -1.2,
-0.4, -0.5, 1.2, -1.5, 2.1, 1., 1., 1.3, 0.8, 1.2, 0.5,
0.2, -2., 0.5, -2.4, 0.2, -2.3, 0., -2.7, 1.3, 2.1})
Y := mat.NewDense(16, 1, []float64{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1})
// rescale Y to -1..1
yscaler := preprocessing.NewMinMaxScaler([]float64{-1, 1})
X1 := X
Y1, _ := yscaler.FitTransform(Y, nil)
plots := [][]*plot.Plot{make([]*plot.Plot, 0, 4)}
var clf *SVC
for _, kernel := range []string{
"linear",
"poly",
"rbf",
} {
clf = NewSVC()
clf.Kernel = kernel
//clf.C = 1.
clf.Gamma = 2.
//clf.Tol = 1.e-3
clf.MaxIter = 20
clf.Fit(X1, Y1)
Ypred := mat.NewDense(16, 1, nil)
clf.Predict(X, Ypred)
fmt.Printf("%s kernel, accuracy:%.3f\n", kernel, metrics.AccuracyScore(Y, Ypred, true, nil))
// Put the result into a color plot
if *visualDebug {
// Plot the decision boundary. For that, we will assign a color to each point in the mesh [x_min, x_max]x[y_min, y_max].
var xmin, xmax = -3., 3.
var ymin, ymax = -3., 3.
h := (ymax - ymin) / 100
// xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
nparange := func(min, max, h float64) []float64 {
c := make([]float64, 0)
for v := min; v <= max; v += h {
c = append(c, v)
}
return c
}
npmeshgrid := func(xrange, yrange []float64) (xx, yy []float64) {
for y := ymin; y <= ymax; y += h {
for x := xmin; x <= xmax; x += h {
xx = append(xx, x)
yy = append(yy, y)
}
}
return
}
npc := func(c ...[]float64) (XZ *mat.Dense) {
XZ = mat.NewDense(len(c[0]), len(c), nil)
for j, src := range c {
XZ.SetCol(j, src)
}
return XZ
}
var xx, yy = npmeshgrid(nparange(xmin, xmax, h), nparange(ymin, ymax, h))
Xgrid := npc(xx, yy)
Z := &mat.Dense{}
clf.Predict(Xgrid, Z)
plt, _ := plot.New()
xys := func(X, Y mat.Matrix, cls int) (xy plotter.XYs) {
imax, _ := Y.Dims()
for i := 0; i < imax; i++ {
if int(Y.At(i, 0)) == cls {
xy = append(xy, struct{ X, Y float64 }{X.At(i, 0), X.At(i, 1)})
}
}
return
}
colors1 := []color.RGBA{{166, 206, 227, 255}, {253, 191, 111, 255}}
for cls := 0; cls <= 1; cls++ {
s, _ := plotter.NewScatter(xys(Xgrid, Z, cls))
s.GlyphStyle.Shape = draw.BoxGlyph{}
c := colors1[cls]
s.Color = c
s.GlyphStyle.Color = c
s.GlyphStyle.Radius = 1
plt.Add(s)
s1, _ := plotter.NewScatter(xys(X, Y, cls))
s1.Color = color.RGBA{0, 0, 0, 255}
s1.GlyphStyle.Shape = draw.CircleGlyph{}
s1.GlyphStyle.Radius = 4
s1.GlyphStyle.Color = colors1[cls]
plt.Add(s1)
//plt.Legend.Add(fmt.Sprintf("class %d", cls), s1)
}
// plt.X.Label.Text = "X0"
// plt.Y.Label.Text = "X1"
plt.Title.Text = kernel
plots[0] = append(plots[0], plt)
}
}
if *visualDebug {
// Save the plot to a PNG file.
pngfile := fmt.Sprintf("/tmp/ExampleSVC.png")
os.Remove(pngfile)
img := vgimg.New(vg.Points(float64(len(plots[0]))*300.), vg.Points(float64(len(plots))*300.))
dc := draw.New(img)
t := draw.Tiles{
Rows: len(plots),
Cols: len(plots[0]),
PadX: vg.Points(2),
PadY: vg.Points(2),
PadTop: vg.Points(2),
PadBottom: vg.Points(2),
PadLeft: vg.Points(2),
PadRight: vg.Points(2),
}
canvases := plot.Align(plots, t, dc)
for j := 0; j < t.Rows; j++ {
for i := 0; i < t.Cols; i++ {
if plots[j][i] != nil {
plots[j][i].Draw(canvases[j][i])
}
}
}
w, err := os.Create(pngfile)
if err != nil {
panic(err)
}
png := vgimg.PngCanvas{Canvas: img}
if _, err := png.WriteTo(w); err != nil {
panic(err)
}
w.Close()
cmd := exec.Command("display", pngfile)
err = cmd.Start()
if err != nil {
fmt.Println(err.Error())
}
time.Sleep(200 * time.Millisecond)
os.Remove(pngfile)
}
}
Output: linear kernel, accuracy:0.938 poly kernel, accuracy:1.000 rbf kernel, accuracy:1.000
func NewSVC ¶
func NewSVC() *SVC
NewSVC ... Kernel: "linear","poly","rbf","sigmoid" default is "rbf" if Gamma<=0 il will be changed to 1/NFeatures Cachesize is in MB. defaults to 200
type SVR ¶
type SVR struct {
BaseLibSVM
ClassWeight []float64
// contains filtered or unexported fields
}
SVR struct
Example ¶
/*
https://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.html#sphx-glr-auto-examples-svm-plot-svm-regression-py
*/
randomState := base.NewLockedSource(7)
// Generate sample data
NSamples, NFeatures, NOutputs := 40, 1, 1
X := mat.NewDense(NSamples, NFeatures, nil)
Y := mat.NewDense(NSamples, NOutputs, nil)
{
rnd := rand.New(base.NewLockedSource(5))
mX := X.RawMatrix()
for sample := 0; sample < mX.Rows; sample++ {
mX.Data[sample] = 5 * rnd.Float64()
}
sort.Float64s(mX.Data)
mY := Y.RawMatrix()
for sample := 0; sample < mY.Rows; sample++ {
mY.Data[sample] = math.Sin(mX.Data[sample])
if sample%5 == 0 {
mY.Data[sample] += (0.5 - rnd.Float64())
}
}
}
// rescale in -1,1
xscaler := preprocessing.NewMinMaxScaler([]float64{-1, 1})
yscaler := preprocessing.NewMinMaxScaler([]float64{-1, 1})
Xsc, _ := xscaler.FitTransform(X, nil)
Ysc, _ := yscaler.FitTransform(Y, nil)
Epsilon := 0.1 * yscaler.Scale.At(0, 0)
// # Fit regression model
Ypred := map[string]*mat.Dense{}
for _, opt := range []struct {
kernel string
C, gamma, coef0, degree float64
}{
{kernel: "rbf", C: 1e3, gamma: .1},
{kernel: "linear", C: 1e3},
{kernel: "poly", gamma: 1, coef0: 1, C: 1e3, degree: 2},
} {
Ypred[opt.kernel] = &mat.Dense{}
svr := NewSVR()
svr.Kernel = opt.kernel
svr.C = opt.C
svr.Epsilon = Epsilon
svr.Gamma = opt.gamma
svr.Coef0 = opt.coef0
svr.Degree = opt.degree
svr.RandomState = randomState
svr.Tol = math.Sqrt(Epsilon)
svr.MaxIter = 5
svr.Fit(Xsc, Ysc)
svr.Predict(Xsc, Ypred[opt.kernel])
Ypred[opt.kernel], _ = yscaler.InverseTransform(Ypred[opt.kernel], nil)
//log.Println(base.MatStr(X, Y, Ypred[opt.kernel]))
}
if *visualDebug {
// Look at the results
pngfile := fmt.Sprintf("/tmp/ExampleSVR.png")
os.Remove(pngfile)
p, _ := plot.New()
p.Title.Text = "Support vector regression"
p.X.Label.Text = "data"
p.Y.Label.Text = "target"
xys := func(X, Y mat.Matrix, dy float64) (xy plotter.XYs) {
imax, _ := Y.Dims()
for i := 0; i < imax; i++ {
xy = append(xy, struct{ X, Y float64 }{X.At(i, 0), Y.At(i, 0) + dy})
}
return
}
s, _ := plotter.NewScatter(xys(X, Y, 0))
s.GlyphStyle.Shape = draw.CircleGlyph{}
s.Color = color.RGBA{0xff, 0x80, 0x00, 0xFF}
p.Add(s)
p.Legend.Add("data", s)
colors := map[string]color.Color{
"rbf": color.RGBA{0, 0, 0xff, 0xff}, //navy,
"linear": color.RGBA{0, 0xff, 0xff, 0xff}, //cyan,
"poly": color.RGBA{0x64, 0x95, 0xed, 0xff}, //cornflower blue
}
labels := map[string]string{
"rbf": "RBF model",
"linear": "Linear model",
"poly": "Polynomial model",
}
for kernel, Yp := range Ypred {
for _, dy := range []float64{-Epsilon, 0, Epsilon} {
s, err := plotter.NewLine(xys(X, Yp, dy))
if err != nil {
panic(err)
}
s.Color = colors[kernel]
if dy != 0 {
s.LineStyle.Dashes = []vg.Length{3, 3}
}
p.Add(s)
if dy == 0 {
p.Legend.Add(labels[kernel], s)
}
}
}
if err := p.Save(6*vg.Inch, 4*vg.Inch, pngfile); err != nil {
panic(err)
}
cmd := exec.Command("display", pngfile)
err := cmd.Start()
if err != nil {
fmt.Println(err.Error())
}
time.Sleep(200 * time.Millisecond)
os.Remove(pngfile)
}
func NewSVR ¶
func NewSVR() *SVR
NewSVR ... Kernel: "linear","poly","rbf","sigmoid" default is "rbf" if Gamma<=0 il will be changed to 1/NFeatures Cachesize is in MB. defaults to 200
type SigmoidKernel ¶
type SigmoidKernel struct {
// contains filtered or unexported fields
}
SigmoidKernel ...
func (SigmoidKernel) Func ¶
func (kdata SigmoidKernel) Func(a, b []float64) (sumprod float64)
Func for SigmoidKernel
Click to show internal directories.
Click to hide internal directories.