KmeansTrainResult <T> Training() { var ThisGen = FirstGeneration; for (int Iteration = 0; Iteration < IterationLimit; Iteration++) { ClassifyUntrainedData(ThisGen); var NextGen = GenerateNextIteration(ThisGen); OnIteration?.Invoke(ThisGen, Iteration); float LongestDistance = CalcLongestDistance(ThisGen, NextGen); if (LongestDistance < ConvDistance) { Console.WriteLine("Iteration:{0}, LongestDistance:{1} < {2}, Done", Iteration, LongestDistance, ConvDistance); break; } else { Console.WriteLine("Iteration:{0}, LongestDistance:{1} > {2}, Continue...", Iteration, LongestDistance, ConvDistance); ThisGen = NextGen; } } foreach (var vectorCollection in ThisGen) { vectorCollection.Tag = vectorCollection.GetMostTag(); } var trainResult = new KmeansTrainResult <T>(ThisGen.Select(x => x.Center)); return(trainResult); }
public Kmeans(KmeansTrainResult <T> trainResult) { TrainedResult = trainResult; }