//Returns a classification for the vector, based on a vector input, using the KNN algorithm. func (KNN *KNNClassifier) Predict(vector *mat.DenseMatrix, K int) (string, []int) { rows := KNN.Data.Rows() rownumbers := make(map[int]float64) labels := make([]string, 0) maxmap := make(map[string]int) for i := 0; i < rows; i++ { row := KNN.Data.GetRowVector(i) eucdistance := KNN.ComputeDistance(row, vector) rownumbers[i] = eucdistance } sorted := util.SortIntMap(rownumbers) values := sorted[:K] for _, elem := range values { labels = append(labels, KNN.Labels[elem]) if _, ok := maxmap[KNN.Labels[elem]]; ok { maxmap[KNN.Labels[elem]] += 1 } else { maxmap[KNN.Labels[elem]] = 1 } } sortedlabels := util.SortStringMap(maxmap) label := sortedlabels[0] return label, values }
//Returns an average of the K nearest labels/variables, based on a vector input. func (KNN *KNNRegressor) Predict(vector *mat.DenseMatrix, K int) (float64, []int) { rows := KNN.Data.Rows() rownumbers := make(map[int]float64) labels := make([]float64, 1) sum := 0.0 for i := 0; i < rows; i++ { row := KNN.Data.GetRowVector(i) eucdistance := KNN.ComputeDistance(row, vector) rownumbers[i] = eucdistance } sorted := util.SortIntMap(rownumbers) values := sorted[:K] for _, elem := range values { value := KNN.Labels[elem] labels = append(labels, value) sum += value } average := sum / float64(K) return average, values }