gonumops.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Package ml machine learning operations for flow
  2. package ml
  3. import (
  4. "flow/registry"
  5. "math"
  6. "math/rand"
  7. "gonum.org/v1/gonum/mat"
  8. )
  9. // Matrix wrapper
  10. type Matrix = mat.Matrix
  11. // New registry
  12. func New() *registry.R {
  13. r := registry.New()
  14. registry.Describer(
  15. r.Add(matNew).Inputs("rows", "columns", "data"),
  16. r.Add(
  17. normFloat,
  18. matMul,
  19. matTranspose,
  20. matSigmoid,
  21. matSigmoidD,
  22. toFloatArr,
  23. ),
  24. ).Description("gonum functions").
  25. Tags("gonum").
  26. Extra("style", registry.M{"color": "#953"})
  27. return r
  28. }
  29. func normFloat(n int) []float64 {
  30. data := make([]float64, n)
  31. for i := range data {
  32. data[i] = rand.NormFloat64()
  33. }
  34. return data
  35. }
  36. func matNew(r, c int, data []float64) Matrix {
  37. return mat.NewDense(r, c, data)
  38. }
  39. func matMul(a Matrix, b Matrix) Matrix {
  40. var c mat.Dense
  41. c.Mul(a, b)
  42. return &c
  43. }
  44. func matTranspose(a Matrix) Matrix {
  45. return a.T()
  46. }
  47. func matSigmoid(a Matrix) Matrix {
  48. // Should be a vector perhaps
  49. r, c := a.Dims()
  50. ret := mat.NewDense(r, c, nil)
  51. for c--; c >= 0; c-- {
  52. for r--; r >= 0; r-- {
  53. ret.Set(r, c, activator(a.At(r, c)))
  54. }
  55. }
  56. return ret
  57. }
  58. func matSigmoidD(a Matrix) Matrix {
  59. r, c := a.Dims()
  60. ret := mat.NewDense(r, c, nil)
  61. for c--; c >= 0; c-- {
  62. for r--; r >= 0; r-- {
  63. ret.Set(r, c, derivative(a.At(r, c)))
  64. }
  65. }
  66. return ret
  67. }
  68. func toFloatArr(a Matrix) []float64 {
  69. r, c := a.Dims()
  70. ret := make([]float64, r*c)
  71. for i := 0; i < c; i++ {
  72. for j := 0; j < r; j++ {
  73. ret[i*r+j] = a.At(j, i)
  74. }
  75. }
  76. return ret
  77. }
  78. func activator(v float64) float64 {
  79. return 1 / (1 + math.Exp(-v))
  80. }
  81. func derivative(v float64) float64 {
  82. return v * (1 - v)
  83. }