1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- // Package ml machine learning operations for flow
- package ml
- import (
- "flow/registry"
- "math"
- "math/rand"
- "gonum.org/v1/gonum/mat"
- )
- // Matrix wrapper
- type Matrix = mat.Matrix
- // New registry
- func New() *registry.R {
- r := registry.New()
- registry.Describer(
- r.Add(matNew).Inputs("rows", "columns", "data"),
- r.Add(
- normFloat,
- matMul,
- matTranspose,
- matSigmoid,
- matSigmoidD,
- toFloatArr,
- ),
- ).Description("gonum functions").
- Tags("gonum").
- Extra("style", registry.M{"color": "#953"})
- return r
- }
- func normFloat(n int) []float64 {
- data := make([]float64, n)
- for i := range data {
- data[i] = rand.NormFloat64()
- }
- return data
- }
- func matNew(r, c int, data []float64) Matrix {
- return mat.NewDense(r, c, data)
- }
- func matMul(a Matrix, b Matrix) Matrix {
- var c mat.Dense
- c.Mul(a, b)
- return &c
- }
- func matTranspose(a Matrix) Matrix {
- return a.T()
- }
- func matSigmoid(a Matrix) Matrix {
- // Should be a vector perhaps
- r, c := a.Dims()
- ret := mat.NewDense(r, c, nil)
- for c--; c >= 0; c-- {
- for r--; r >= 0; r-- {
- ret.Set(r, c, activator(a.At(r, c)))
- }
- }
- return ret
- }
- func matSigmoidD(a Matrix) Matrix {
- r, c := a.Dims()
- ret := mat.NewDense(r, c, nil)
- for c--; c >= 0; c-- {
- for r--; r >= 0; r-- {
- ret.Set(r, c, derivative(a.At(r, c)))
- }
- }
- return ret
- }
- func toFloatArr(a Matrix) []float64 {
- r, c := a.Dims()
- ret := make([]float64, r*c)
- for i := 0; i < c; i++ {
- for j := 0; j < r; j++ {
- ret[i*r+j] = a.At(j, i)
- }
- }
- return ret
- }
- func activator(v float64) float64 {
- return 1 / (1 + math.Exp(-v))
- }
- func derivative(v float64) float64 {
- return v * (1 - v)
- }
|