public static int GetKNNVersion(List <List <string> > Dataset, KNNVersion Version) { List <string> DistinctClasses = new List <string>(); foreach (var Item in Dataset) { DistinctClasses.Add(Item.Last()); } // Guarda todas as classes sem repeticao DistinctClasses = DistinctClasses.Distinct().ToList(); int P = DistinctClasses.Count; //Quantidade de Classes int Q = Dataset.Count; //Quantidade de linhas int M = P % 2 == 0 ? P + 1 : P; switch (Version) { case KNNVersion.OneNN: return(1); case KNNVersion.M2NN: { return(M + 2); } case KNNVersion.M10NN: { return(M * 10 + 1); } case KNNVersion.QNN: return((Q / 2) % 2 == 0 ? Q / 2 + 1 : Q / 2); } return(-1); }
public static void TestKNN(string path, KNNVersion KNNVersion) { List <List <string> > TrainingSet, TestingSet, DataSet; List <float> AccuracyRatings = new List <float>(); int StartIndex = 0, KFold = 10, K = 1; KNN kt = new KNN(); DataSet = kt.LoadCSVData(path); //GET KNN VERSION K = GetKNNVersion(DataSet, KNNVersion); List <float> listOfErroAmostral = new List <float>(); // Calcula dataset de traino e teste int etapa = 1; while (StartIndex < DataSet.Count) { StartIndex = kt.PrepareDataset(StartIndex, KFold, ref DataSet, out TestingSet, out TrainingSet); //Gera previsoes List <string> predictions = new List <string>(); // Calcula label da primeira linha do set de teste for (int x = 0; x < TestingSet.Count; x++) { List <LineDistance> neighbors = kt.GetNeighbors(TrainingSet, TestingSet[x], K); string result = kt.getResponses(neighbors); predictions.Add(result); Console.Write("\rKFold {0} / {1}... {2}%", etapa, KFold, Math.Round(((float)(x + 1) / (float)TestingSet.Count) * 100)); } // Calcula precisao da label calculada float acc = kt.getAccuracy(TestingSet, predictions); AccuracyRatings.Add(acc); // Exibe precisao media Console.WriteLine("\nPrecisao Media: " + AccuracyRatings.Average() + "%"); // Guarda erro amostral da linha listOfErroAmostral.Add(CrossValidation.erroAmostral(TestingSet, predictions)); CrossValidation.prepareConfusionMatrix(DataSet, TestingSet, predictions); etapa++; } /*if (CrossValidation.binaryConfusionMatrix.Count > 0) //Se for matriz binaria ira salvar os dados aqui * { * string fileName = path.Split('/').Last().Split('-')[0]; * FileSystem.SaveFileContents(CrossValidation.GeraMatrizBinaria(), @"../../Raw Data/Normalized/output/" + fileName + "/", fileName + "-Matriz-Binaria-Confusao-" + KNNVersion.ToString() +".txt"); * } * if(CrossValidation.multiClassConfusionMatrix.Count > 0) //Se for matriz multi-classe irá salvar aqui * { * string fileName = path.Split('/').Last().Split('-')[0]; * FileSystem.SaveFileContents(CrossValidation.GeraMatrizMultiClasse(), @"../../Raw Data/Normalized/output/" + fileName + "/", fileName + "-Matriz-MultiClasse-Confusao-" + KNNVersion.ToString() + ".txt"); * } * * CrossValidation.erroDeValidacaoCruzada(listOfErroAmostral);*///Verifica a taxa de erro da validacao cruzada }