arnaucube
arnaucube/goKNNPublic Self-hosted repository
goKNN/euclideanDistance.go
euclideanDistance.goRaw
 1package main
 2
 3import (
 4	"math"
 5)
 6
 7func euclideanDistance(dataset [][][]int, inputLine []int) [][][]float64 {
 8	var distances [][][]float64
 9
10	for _, datasetLine := range dataset {
11		datasetLineFloat := arrayIntToFloat64(datasetLine[0])
12		resultDatasetLineFloat := arrayIntToFloat64(datasetLine[1])
13		inputLineFloat := arrayIntToFloat64(inputLine)
14		r := calcDistances(inputLineFloat, datasetLineFloat)
15		distance := []float64{r}
16		var newDatasetLine [][]float64
17		newDatasetLine = append(newDatasetLine, datasetLineFloat)
18		newDatasetLine = append(newDatasetLine, resultDatasetLineFloat)
19		newDatasetLine = append(newDatasetLine, distance)
20		distances = append(distances, newDatasetLine)
21		//distances contains: [[datasetLine], [datasetLineResult], [distanceWithInput]]
22	}
23	return distances
24}
25
26func calcDistances(in []float64, ds []float64) float64 {
27	var r float64
28	r = 0
29	for i := 0; i < len(in); i++ {
30		r = r + (in[i] * ds[i])
31	}
32	r = math.Sqrt(r)
33	return r
34}
35
36func getShortestDistance(dist [][][]float64) [][]float64 {
37	//dist contains: [[datasetLine], [datasetLineResult], [distanceWithInput]]
38	minDist := dist[0][2]
39	max := dist[0][2]
40	var datasetNearResult [][]float64
41	for i := 0; i < len(dist); i++ {
42		//fmt.Println(dist[i])
43		if dist[i][2][0] > max[0] {
44			max = dist[i][0]
45		}
46		//fmt.Println(dist[i][2][0])
47		if dist[i][2][0] < minDist[0] {
48			minDist = dist[i][2]
49			datasetNearResult = dist[i]
50		}
51		//fmt.Println(dist[i][1])
52	}
53	/*fmt.Println(min)
54	fmt.Println(max)*/
55	return datasetNearResult
56}