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}