Add ultility function for loading and saving compatible(Gonum) csv.

This commit is contained in:
Yashwant
2020-06-14 10:15:35 +05:30
parent 694d460748
commit 4464ba0be9
4 changed files with 147 additions and 20 deletions
-4
View File
@@ -19,10 +19,6 @@ if (GO_EXECUTABLE)
endif()
endif()
if (NOT GO_EXECUTABLE)
unset(BUILD_GO_BINDINGS CACHE)
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
Go
+6 -16
View File
@@ -15,7 +15,8 @@ and @ref julia_quickstart "Julia".
@section go_quickstart_install Installing mlpack
Installing the mlpack bindings for Go is somewhat ticker; you can download
Installing the mlpack bindings for Go is somewhat time-consuming as the library
must be built; you can run the following code:
@code{.sh}
go get -d mlpack.org/v1/mlpack
@@ -53,16 +54,10 @@ func main() {
// Extract/Unzip the dataset.
mlpack.UnZip("data.csv.gz", "data.csv")
f1, _ := os.Open("data.csv")
defer f1.Close()
data := mlpack.NewReader(f1)
dataset, _ := data.ReadAll()
dataset, _ := mlpack.Load("data.csv")
mlpack.UnZip("labels.csv.gz", "labels.csv")
f2, _ := os.Open("labels.csv")
defer f2.Close()
labels_data := mlpack.NewReader(f2)
labels, _ := labels_data.ReadAll()
labels, _ := mlpack.Load("labels.csv")
// Split the dataset using mlpack.
params := mlpack.PreprocessSplitOptions()
@@ -154,11 +149,7 @@ func main() {
// Extract dataset.
mlpack.UnZip("ratings-only.csv.gz", "ratings-only.csv")
f1, _ := os.Open("ratings-only.csv")
defer f1.Close()
data := mlpack.NewReader(f1)
_, _ = data.ReadHeading()
ratings, _ := data.ReadAll()
ratings, _ := mlpack.Load("ratings-only.csv")
mlpack.UnZip("movies.csv.gz", "movies.csv")
table, _ := csv.NewTable(csv.FromFile("movies.csv"), csv.LoadHeaders())
@@ -168,8 +159,7 @@ func main() {
params := mlpack.PreprocessSplitOptions()
params.TestRatio = 0.1
params.Verbose = true
ratings_test, _, ratings_train, _ :=
mlpack.PreprocessSplit(ratings, params)
ratings_test, _, ratings_train, _ := mlpack.PreprocessSplit(ratings, params)
// Train the model. Change the rank to increase/decrease the complexity of the
// model.
+6
View File
@@ -1,4 +1,9 @@
if (BUILD_GO_BINDINGS)
if (NOT GO_EXECUTABLE)
unset(BUILD_GO_BINDINGS CACHE)
endif()
## We need to check here if Golang is even available. Although actually
## technically, I'm not sure if we even need to know! For the tests though we
## do. So it's probably a good idea to check.
@@ -61,6 +66,7 @@ if (BUILD_GO_SHLIB)
mlpack/arma_util.go
mlpack/cli_util.go
mlpack/doc.go
mlpack/numcsv.go
)
# These are all the files we need to compile Go bindings for mlpack that are
+135
View File
@@ -0,0 +1,135 @@
package mlpack
import (
"encoding/csv"
"io"
"os"
"strconv"
"net/http"
"compress/gzip"
"gonum.org/v1/gonum/mat"
)
// Load reads all of the numeric records from the CSV.
func Load(filename string) (*mat.Dense, error) {
var elements int
var rows int
var numbers []float64
// Open the file
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
lines, err := csv.NewReader(file).ReadAll()
if err != nil {
return nil, err
}
var str_err error
for _, args := range lines[0:] {
for _, arg := range args {
n, err := strconv.ParseFloat(arg, 64)
str_err = err
if err == nil {
numbers = append(numbers, n)
elements = elements + 1
}
}
if str_err == nil {
rows = rows + 1
}
}
data := numbers[:elements]
columns := elements/rows
output := mat.NewDense(rows , columns, data)
return output, nil
}
// Save writes all of the records to the CSV.
func Save(filename string, mat *mat.Dense) error {
// Create the file
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
if mat != nil {
rows, cols := mat.Dims()
for i := 0; i < rows; i++ {
var strings []string
for j := 0; j < cols; j++ {
s := strconv.FormatFloat(mat.At(i,j), 'e', 16, 64)
strings = append(strings, s)
}
err := writer.Write(strings)
if err != nil {
return err
}
}
}
return nil
}
// Unizp unzips the given input to the given the output file.
func UnZip(input string, output string) error {
// Create the file
out, err := os.Create(output)
if err != nil {
return err
}
defer out.Close()
// Open the file
in, err := os.Open(input)
if err != nil {
return err
}
defer in.Close()
// Unzip the data
resp, err := gzip.NewReader(in)
if err != nil {
return err
}
defer resp.Close()
// Write the body to file
_, err = io.Copy(out, resp)
if err != nil {
return err
}
return nil
}
// DownloadFile downloads the file from the given url and save it to the given filename.
func DownloadFile (url string, filename string) error {
// Create the file
out, err := os.Create(filename)
if err != nil {
return err
}
defer out.Close()
// Get the data
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// Write the body to file
_, err = io.Copy(out, resp.Body)
if err != nil {
return err
}
return nil
}