|
@@ -0,0 +1,72 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "bufio"
|
|
|
+ "fmt"
|
|
|
+ "log"
|
|
|
+ "os"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+
|
|
|
+ mat "gonum.org/v1/gonum/mat"
|
|
|
+)
|
|
|
+
|
|
|
+func readData(filename string) (dataSet, result []*mat.Dense) {
|
|
|
+ inputFile, err := os.Open(filename)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ defer inputFile.Close()
|
|
|
+
|
|
|
+ scanner := bufio.NewScanner(inputFile)
|
|
|
+ scanner.Split(bufio.ScanLines)
|
|
|
+
|
|
|
+ max := []float64{0.0, 0.0, 0.0, 0.0}
|
|
|
+ for scanner.Scan() {
|
|
|
+ dataLine := scanner.Text()
|
|
|
+ data := strings.Split(dataLine, ",")
|
|
|
+
|
|
|
+ if len(data) < 5 {
|
|
|
+ fmt.Printf("Garbage record: %s\n", dataLine)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ var dataRaw []float64
|
|
|
+ for i := 0; i < 4; i++ {
|
|
|
+ val, err := strconv.ParseFloat(data[i], 64)
|
|
|
+ if err != nil {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ dataRaw = append(dataRaw, val)
|
|
|
+
|
|
|
+ if max[i] < val {
|
|
|
+ max[i] = val
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(dataRaw) < 4 {
|
|
|
+ fmt.Printf("Garbage record: %s\n", dataLine)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ dataSet = append(dataSet, mat.NewDense(4, 1, dataRaw))
|
|
|
+
|
|
|
+ switch data[4] {
|
|
|
+ case "Iris-setosa":
|
|
|
+ result = append(result, mat.NewDense(3, 1, []float64{1.0, 0.0, 0.0}))
|
|
|
+ case "Iris-versicolor":
|
|
|
+ result = append(result, mat.NewDense(3, 1, []float64{0.0, 1.0, 0.0}))
|
|
|
+ case "Iris-virginica":
|
|
|
+ result = append(result, mat.NewDense(3, 1, []float64{0.0, 0.0, 1.0}))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //normalize
|
|
|
+ for i := 0; i < len(dataSet); i++ {
|
|
|
+ dataSet[i].Apply(func(r, _ int, val float64) float64 {
|
|
|
+ return val / max[r]
|
|
|
+ }, dataSet[i])
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|