-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkmeans_test.go
102 lines (92 loc) · 1.95 KB
/
kmeans_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package kmeans
import(
"fmt"
"io/ioutil"
"log"
"path/filepath"
"strconv"
"strings"
"testing"
)
func TestKmeans(t *testing.T) {
filePath, err := filepath.Abs("data/iris.csv")
if err != nil {
log.Fatal(err)
}
content, err := ioutil.ReadFile(filePath)
if err != nil {
log.Fatal(err)
}
// Best Distance for Iris is Canberra Distance
k := New(3, CanberraDistance, 0.1)
lines := strings.Split(string(content), "\n")
seed := make([]Node, 3)
for i, line := range lines[:3] {
vector := strings.Split(line, ",")
// label := vector[len(vector)-1]
vector = vector[:len(vector)-1]
n := make([]float64, len(vector))
for jj := range vector {
n[jj], err = strconv.ParseFloat(vector[jj], 64)
}
seed[i] = n
}
k.Seed(seed)
for _, line := range lines[3:] {
if line == "" {
break
}
vector := strings.Split(line, ",")
// label := vector[len(vector)-1]
vector = vector[:len(vector)-1]
n := make([]float64, len(vector))
for jj := range vector {
n[jj], err = strconv.ParseFloat(vector[jj], 64)
}
k.Addf(n)
}
// Check
c := map[string][]Node{}
for _, line := range lines {
if line == "" {
break
}
vector := strings.Split(line, ",")
label := vector[len(vector)-1]
vector = vector[:len(vector)-1]
n := make([]float64, len(vector))
for jj := range vector {
n[jj], err = strconv.ParseFloat(vector[jj], 64)
}
c[label] = append(c[label], n)
}
for _, nodes := range c {
n := make([]float64, len(nodes[0]))
for i := 0; i<len(nodes[0]); i++ {
for j := 0; j<len(nodes); j++ {
n[i] += nodes[j][i]
}
n[i] = n[i]/float64(len(nodes))
}
fmt.Println(n)
}
fmt.Println(k)
/* labels := Kmeans(irisData, 3, CanberraDistance, threshold)
misclassifiedOnes := 0
for ii, jj := range labels {
if ii < 50 {
if jj != 2 {
misclassifiedOnes++
}
} else if ii < 100 {
if jj != 1 {
misclassifiedOnes++
}
} else {
if jj != 0 {
misclassifiedOnes++
}
}
}
fmt.Println(misclassifiedOnes)*/
}