// chooseCentroids picks random centroids based on the min and max values in the matrix // and return a k by m matrix of the centroids. func (c randCentroids) ChooseCentroids(mat *matrix.DenseMatrix, k int) *matrix.DenseMatrix { _, cols := mat.GetSize() centroids := matrix.Zeros(k, cols) for colnum := 0; colnum < cols; colnum++ { r := mat.ColSlice(colnum) minj := float64(0) // min value from column for _, val := range r { minj = math.Min(minj, val) } // max value from column maxj := float64(0) for _, val := range r { maxj = math.Max(maxj, val) } // create a slice of random centroids // based on maxj + minJ * random num to stay in range for h := 0; h < k; h++ { randInRange := ((maxj - minj) * rand.Float64()) + minj centroids.Set(h, colnum, randInRange) } } return centroids }