Skip to content

Commit 40329f6

Browse files
committed
Employed kmeans++ initialization algorithm
1 parent 30090d9 commit 40329f6

2 files changed

Lines changed: 40 additions & 7 deletions

File tree

kmeans.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,9 +231,41 @@ func (c *kmeansClusterer) initializeMeansWithData() {
231231
c.m = make([][]float64, c.number)
232232
c.c = make([]HardCluster, c.number)
233233

234-
for i := 0; i < c.number; i++ {
235-
c.m[i] = c.d[rand.Intn(len(c.d)-1)]
234+
rand.Seed(time.Now().UTC().Unix())
235+
236+
var (
237+
k int
238+
s, t, l, f float64
239+
d []float64 = make([]float64, len(c.d))
240+
)
241+
242+
c.m[0] = c.d[rand.Intn(len(c.d)-1)]
243+
244+
for i := 1; i < c.number; i++ {
245+
s = 0
246+
t = 0
247+
for j := 0; j < len(c.d); j++ {
248+
249+
l = c.distance(c.m[0], c.d[j])
250+
for g := 1; g < i; g++ {
251+
if f = c.distance(c.m[g], c.d[j]); f < l {
252+
l = f
253+
}
254+
}
255+
256+
d[j] = math.Pow(l, 2)
257+
s += d[j]
258+
}
259+
260+
t = rand.Float64() * s
261+
k = 0
262+
for s = d[0]; s < t; s += d[k] {
263+
k++
264+
}
265+
266+
c.m[i] = c.d[k]
236267
}
268+
237269
}
238270

239271
func (c *kmeansClusterer) initializeMeans() {

util.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package clusters
22

3+
import (
4+
"gonum.org/v1/gonum/floats"
5+
"math"
6+
)
7+
38
func squaredDistance(a, b []float64) float64 {
4-
var s float64
5-
for i := range a {
6-
s += (a[i] - b[i]) * (a[i] - b[i])
7-
}
8-
return s
9+
return math.Pow(floats.Distance(a, b, 2), 2)
910
}

0 commit comments

Comments
 (0)