private static string classify0(Vector inX, Matrix dataset, List<string> labels, int k) { Console.WriteLine("Input"); Console.WriteLine(inX.ToString()); Console.WriteLine("Data"); Console.WriteLine(dataset); Console.WriteLine("Labels"); labels.ForEach(s => Console.Write(s+" ")); // Create difference matrix with same dimensions as the dataset var diffMatrix = new Matrix(dataset.Rows,dataset.Cols); for (int i = 0; i < dataset.Rows; i++) { diffMatrix[i]=inX; } diffMatrix = diffMatrix - dataset; Console.WriteLine("Diff Matrix"); Console.WriteLine(diffMatrix.ToString()); // Square all the items for (int i = 0; i < diffMatrix.Rows; i++) { var v = diffMatrix[i]; v.Each((d)=>Math.Pow(d,2.0)); diffMatrix[i] = v; } // Sum of each row and then square root var sqDistances = diffMatrix.Sum(VectorType.Col); //Why is this a Column Summation? sqDistances.Each(d => Math.Sqrt(d)); Console.WriteLine("Squared distances"); Console.WriteLine(sqDistances.ToString()); // get the sorted indices var sortedIndices = Vector.SortOrder(sqDistances).Reverse().ToVector(); Console.WriteLine("Sorted Indices"); Console.WriteLine(sortedIndices); var classCount = new Dictionary<string, double>(); // Now compare the first 'k' items that are closest for (int i = 0; i < k; i++) { var votelabel = labels[(int)sortedIndices[i]]; if (!classCount.ContainsKey(votelabel)) { classCount.Add(votelabel,1.0); } else { classCount[votelabel] += 1; // Increment count } } // Order by the values descending and return the first Key var orderedCount = classCount.OrderByDescending(kvp => kvp.Value).ToArray(); return orderedCount.First().Key; }