コード例 #1
0
ファイル: Program.cs プロジェクト: femoreti/BCC_PI_5
        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);
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: femoreti/BCC_PI_5
        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
        }