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 }