arnaucube
arnaucube/galdricPublic Self-hosted repository
galdric/knn.go
knn.goRaw
 1package main
 2
 3import (
 4	"fmt"
 5	"sort"
 6)
 7
 8func euclideanDist(img1, img2 [][]float64) float64 {
 9	var dist float64
10	for i := 0; i < len(img1); i++ {
11		for j := 0; j < len(img1[i]); j++ {
12			dist += (img1[i][j] - img2[i][j]) * (img1[i][j] - img2[i][j])
13		}
14	}
15
16	return dist
17}
18
19type Neighbour struct {
20	Dist  float64
21	Label string
22}
23
24func isNeighbour(neighbours []Neighbour, dist float64, label string) []Neighbour {
25	var temp []Neighbour
26
27	for i := 0; i < len(neighbours); i++ {
28		temp = append(temp, neighbours[i])
29	}
30	ntemp := Neighbour{dist, label}
31	temp = append(temp, ntemp)
32
33	//now, sort the temp array
34	sort.Slice(temp, func(i, j int) bool {
35		return temp[i].Dist < temp[j].Dist
36	})
37
38	for i := 0; i < len(neighbours); i++ {
39		neighbours[i] = temp[i]
40	}
41
42	return neighbours
43}
44
45func knn(dataset Dataset, input [][]float64) string {
46	k := 3
47	var neighbours []Neighbour
48	//d := euclideanDist(dataset["leopard"][0], input)
49	for i := 0; i < k; i++ {
50		/*neighbours[i].Dist = euclideanDist(dataset["leopard"][0], input)
51		neighbours[i].Label = "leopard"*/
52		neighbours = append(neighbours, Neighbour{euclideanDist(dataset["leopard"][0], input), "leopard"})
53	}
54	for l, v := range dataset {
55		for i := 0; i < len(v); i++ {
56			dNew := euclideanDist(v[i], input)
57			/*if dNew < d {
58				d = dNew
59				label = l
60			}*/
61			neighbours = isNeighbour(neighbours, dNew, l)
62		}
63	}
64	for i := 0; i < len(neighbours); i++ {
65		fmt.Print(neighbours[i].Label + " - ")
66		fmt.Println(neighbours[i].Dist)
67	}
68
69	return neighbours[0].Label
70}