datareader.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strconv"
  8. "strings"
  9. mat "gonum.org/v1/gonum/mat"
  10. )
  11. func readData(filename string) (dataSet, result []*mat.Dense) {
  12. inputFile, err := os.Open(filename)
  13. if err != nil {
  14. log.Fatal(err)
  15. }
  16. defer inputFile.Close()
  17. scanner := bufio.NewScanner(inputFile)
  18. scanner.Split(bufio.ScanLines)
  19. max := []float64{0.0, 0.0, 0.0, 0.0}
  20. for scanner.Scan() {
  21. dataLine := scanner.Text()
  22. data := strings.Split(dataLine, ",")
  23. if len(data) < 5 {
  24. fmt.Printf("Garbage record: %s\n", dataLine)
  25. continue
  26. }
  27. var dataRaw []float64
  28. for i := 0; i < 4; i++ {
  29. val, err := strconv.ParseFloat(data[i], 64)
  30. if err != nil {
  31. break
  32. }
  33. dataRaw = append(dataRaw, val)
  34. if max[i] < val {
  35. max[i] = val
  36. }
  37. }
  38. if len(dataRaw) < 4 {
  39. fmt.Printf("Garbage record: %s\n", dataLine)
  40. continue
  41. }
  42. dataSet = append(dataSet, mat.NewDense(4, 1, dataRaw))
  43. switch data[4] {
  44. case "Iris-setosa":
  45. result = append(result, mat.NewDense(3, 1, []float64{1.0, 0.0, 0.0}))
  46. case "Iris-versicolor":
  47. result = append(result, mat.NewDense(3, 1, []float64{0.0, 1.0, 0.0}))
  48. case "Iris-virginica":
  49. result = append(result, mat.NewDense(3, 1, []float64{0.0, 0.0, 1.0}))
  50. }
  51. }
  52. //normalize
  53. for i := 0; i < len(dataSet); i++ {
  54. dataSet[i].Apply(func(r, _ int, val float64) float64 {
  55. return val / max[r]
  56. }, dataSet[i])
  57. }
  58. return
  59. }