Пример #1
0
        private static void LogAPV(AlgoritamPredictiveValues annPV)
        {
            Console.Out.WriteLine("================================");

            Console.Out.WriteLine($"LEARN PPV:     {annPV.LearnPPV}");
            Console.Out.WriteLine($"LEARN NPV:     {annPV.LearnNPV}");
            Console.Out.WriteLine($"LEARN SPEC:    {annPV.LearnSPEC}");
            Console.Out.WriteLine($"LEARN SENS:    {annPV.LearnSENS}");
            Console.Out.WriteLine($"VALIDATE PPV:  {annPV.ValidatePPV}");
            Console.Out.WriteLine($"VALIDATE NPV:  {annPV.ValidateNPV}");
            Console.Out.WriteLine($"VALIDATE SPEC: {annPV.ValidateSPEC}");
            Console.Out.WriteLine($"VALIDATE SENS: {annPV.ValidateSENS}");
            Console.Out.WriteLine($"TEST PPV:      {annPV.TestPPV}");
            Console.Out.WriteLine($"TEST NPV:      {annPV.TestNPV}");
            Console.Out.WriteLine($"TEST SPEC:     {annPV.TestSPEC}");
            Console.Out.WriteLine($"TEST SENS:     {annPV.TestSENS}");

            Console.Out.WriteLine("================================");
        }
Пример #2
0
        private static Experiment3Output Experiment3(int neuronCount, decimal minAnnPPV, decimal minAnnNPV, int treeCount, decimal minForestPPV, decimal minForestNPV)
        {
            var result = new Experiment3Output();

            result.NeuronCount = neuronCount;

            var metsRecords = LoadDataRecords(TRAINING_DATA_FILE, 0);

            DateTime et = DateTime.Now;

            var currentMinPPV = 0m;
            var currentMinNPV = 0m;

            Data data = null;

            var learningData = new List<AnnLearningRecord>();
            var annPV = new AlgoritamPredictiveValues();
            var forestPV = new AlgoritamPredictiveValues();

            while (currentMinPPV < minAnnPPV || currentMinNPV < minAnnNPV || currentMinPPV <= currentMinNPV || currentMinPPV < minForestPPV || currentMinNPV < minForestNPV)
            {
                var es = DateTime.Now;

                data = CreateData(metsRecords, 0.8, 0.1);

                result.Means = data.Means;
                result.StandardDeviations = data.StandardDeviations;

                Console.Out.WriteLine("================================");
                Console.Out.WriteLine($"    ANN PPV, NC:{neuronCount}");
                Console.Out.WriteLine("================================");

                learningData.Clear();
                annPV = Ann(data, neuronCount, learningData, out var ann);
                currentMinPPV = annPV.TestPPV;
                currentMinNPV = annPV.TestNPV;

                result.Ann = ann;

                LogAPV(annPV);

                LogMessage($"Experiment time: {DateTime.Now - es}, total time {DateTime.Now - et}");
            }

                var experimentPV = new ExperimentPredictiveValues()
                {
                    AnnPpvLearnNPV = annPV.LearnNPV,
                    AnnPpvLearnPPV = annPV.LearnPPV,
                    AnnPpvValidateNPV = annPV.ValidateNPV,
                    AnnPpvValidatePPV = annPV.ValidatePPV,
                    AnnPpvTestNPV = annPV.TestNPV,
                    AnnPpvTestPPV = annPV.TestPPV,
                };

            using (var tw = File.CreateText($"d:\\mets_experiment_3_{neuronCount}_{DateTime.Now:yyyy_MM_dd_hh_mm}_rndfrst.csv"))
            {
                var csv = new CsvHelper.CsvWriter(tw);
                csv.WriteHeader<AnnLearningRecord>();
                csv.NextRecord();
                csv.WriteRecords(learningData);
            }

            using (var tw = File.CreateText($"d:\\mets_experiment_3_PV_{neuronCount}_{DateTime.Now:yyyy_MM_dd_hh_mm}_rndfrst.csv"))
            {
                var csv = new CsvHelper.CsvWriter(tw);
                csv.WriteHeader<ExperimentPredictiveValues>();
                csv.NextRecord();
                csv.WriteRecords(new ExperimentPredictiveValues[] { experimentPV });
            }

            return result;
        }
Пример #3
0
        private static void Experiment2(int neuronCountPPV, int neuronCountNPV, int repeats)
        {
            var metsRecords = LoadDataRecords(TRAINING_DATA_FILE, 0);

            var results = new List<ExperimentPredictiveValues>();

            DateTime et = DateTime.Now;

            for (int i = 0; i < repeats; i++)
            {
                var es = DateTime.Now;

                var data = CreateData(metsRecords, 0.8, 0.1);

                Console.Out.WriteLine("================================");
                Console.Out.WriteLine($"       EXPERIMENT #{i:000}");
                Console.Out.WriteLine("================================");
                Console.Out.WriteLine();

                Console.Out.WriteLine("================================");
                Console.Out.WriteLine($"    ANN PPV, NC:{neuronCountPPV}");
                Console.Out.WriteLine("================================");

                var ann_PPV_PV = Ann(data, neuronCountPPV, null, out var ann);
                LogAPV(ann_PPV_PV);

                var ann_NPV_PV = new AlgoritamPredictiveValues();
                if (neuronCountNPV != neuronCountPPV)
                {
                    Console.Out.WriteLine("================================");
                    Console.Out.WriteLine($"     ANN NPV, NC:{neuronCountNPV}");
                    Console.Out.WriteLine("================================");

                    ann_NPV_PV = Ann(data, neuronCountNPV, null, out ann);
                    LogAPV(ann_NPV_PV);
                }

                var experimentPV = new ExperimentPredictiveValues()
                {
                    AnnPpvLearnNPV = ann_PPV_PV.LearnNPV,
                    AnnPpvLearnPPV = ann_PPV_PV.LearnPPV,
                    AnnPpvLearnSENS = ann_PPV_PV.LearnSENS,
                    AnnPpvLearnSPEC = ann_PPV_PV.LearnSPEC,
                    AnnPpvValidateNPV = ann_PPV_PV.ValidateNPV,
                    AnnPpvValidatePPV = ann_PPV_PV.ValidatePPV,
                    AnnPpvValidateSENS = ann_PPV_PV.ValidateSENS,
                    AnnPpvValidateSPEC = ann_PPV_PV.ValidateSPEC,
                    AnnPpvTestNPV = ann_PPV_PV.TestNPV,
                    AnnPpvTestPPV = ann_PPV_PV.TestPPV,
                    AnnPpvTestSENS = ann_PPV_PV.TestSENS,
                    AnnPpvTestSPEC = ann_PPV_PV.TestSPEC,

                    AnnNpvLearnNPV = ann_NPV_PV.LearnNPV,
                    AnnNpvLearnPPV = ann_NPV_PV.LearnPPV,
                    AnnNpvLearnSENS = ann_NPV_PV.LearnSENS,
                    AnnNpvLearnSPEC = ann_NPV_PV.LearnSPEC,
                    AnnNpvValidateNPV = ann_NPV_PV.ValidateNPV,
                    AnnNpvValidatePPV = ann_NPV_PV.ValidatePPV,
                    AnnNpvValidateSENS = ann_NPV_PV.ValidateSENS,
                    AnnNpvValidateSPEC = ann_NPV_PV.ValidateSPEC,
                    AnnNpvTestNPV = ann_NPV_PV.TestNPV,
                    AnnNpvTestPPV = ann_NPV_PV.TestPPV,
                    AnnNpvTestSENS = ann_NPV_PV.TestSENS,
                    AnnNpvTestSPEC = ann_NPV_PV.TestSPEC,
                };

                LogEPV(experimentPV);

                results.Add(experimentPV);

                LogMessage($"Experiment time: {DateTime.Now - es}, total time {DateTime.Now - et}");
            }

            LogAvgEPV(results);

            using (var tw = File.CreateText($"d:\\mets_experiment_2_{neuronCountPPV}_{neuronCountNPV}_R{repeats}{DateTime.Now:yyyy_MM_dd_hh_mm}.csv"))
            {
                var csv = new CsvHelper.CsvWriter(tw);
                csv.WriteHeader<ExperimentPredictiveValues>();
                csv.NextRecord();
                csv.WriteRecords(results);
            }
        }
Пример #4
0
        private static AlgoritamPredictiveValues Ann(Data data, int neuronCount, List<AnnLearningRecord> learningData, out ActivationNetwork resultAnn)
        {
            // za aktivacionu funkciju uzimamo standardnu sigmoidnu
            var activationFunction = new SigmoidFunction();

            // kreiramo neuronsku mrežu sa 6 neurona u ulazniom sloju i jednim u izlaznom
            // broj skrivenih neurona je određen parametrom neuronCount
            var ann = new ActivationNetwork(activationFunction, INPUT_COUNT, neuronCount, OUTPUT_COUNT);

            // postavljanje inicijalnih težinski faktora
            new NguyenWidrow(ann).Randomize();

            // algoritam za obučavanje
            var teacher = new LevenbergMarquardtLearning(ann);

            teacher.LearningRate = 0.001;

            // uključujemo regularizaciju
            teacher.UseRegularization = true;

            double err;
            int count = 0;
            int failCount = 0;
            PredictiveValues lastPredictiveValues = null;
            int epochCounter = 1;
            while (true)
            {
                err = teacher.RunEpoch(data.LearnInputs, data.LearnOutputs);

                // izracunavamo prediktivne vrednosti
                var pv = CalculatePredictiveValues(ann, data);

                LogMessage($"Epoch #{count + 1:000}, PPV: {pv.PPV,10:#0.000000}, NPV: {pv.NPV,10:#0.000000}, SPEC: {pv.SPEC,10:#0.000000}, SENS: {pv.SENS,10:#0.000000}");

                if (learningData != null)
                {
                    learningData.Add(new AnnLearningRecord()
                    {
                        EpochNumber = epochCounter++,
                        NPV = pv.NPV,
                        PPV = pv.PPV,
                        N_FN = pv.N_FN,
                        N_FP = pv.N_FP,
                        N_TN = pv.N_TN,
                        N_TP = pv.N_TP
                    });
                }

                if (lastPredictiveValues != null)
                {
                    // proveravamo da li se performansa poboljsala ili ne
                    if (lastPredictiveValues.PPV >= pv.PPV && lastPredictiveValues.NPV >= pv.NPV)
                    {
                        failCount++;
                        // obuka se prekida ukoliko do poboljsanja nije doslo u poslednjih 10 epoha
                        if (failCount >= 10)
                            break;
                    }
                    else
                        failCount = 0;
                }

                lastPredictiveValues = pv;

                count++;
                if (count >= 500)
                    break;

            }

            // izracunavanje izlaza
            double[][] AnnCompute(double[][] inputs, double[][] outputs)
            {
                var res = new double[inputs.Length][];

                for (int i = 0; i < inputs.Length; i++)
                {
                    var annr = ann.Compute(inputs[i])[0];
                    var to = Math.Round(outputs[i][0], 0);
                    var anno = Math.Round(annr, 0);

                    res[i] = new double[] { anno };
                }

                return res;
            }

            var learnOutputs = AnnCompute(data.LearnInputs, data.LearnOutputs);
            var validateOutputs = AnnCompute(data.ValidateInputs, data.ValidateOutputs);
            var testOutputs = AnnCompute(data.TestInputs, data.TestOutputs);

            var learnPV = CalculatePredictiveValues(data.LearnOutputs, learnOutputs);
            var validatePV = CalculatePredictiveValues(data.ValidateOutputs, validateOutputs);
            var testPV = CalculatePredictiveValues(data.TestOutputs, testOutputs);

            var result = new AlgoritamPredictiveValues()
            {
                LearnNPV = learnPV.NPV,
                LearnPPV = learnPV.PPV,
                LearnSENS = learnPV.SENS,
                LearnSPEC = learnPV.SPEC,

                ValidateNPV = validatePV.NPV,
                ValidatePPV = validatePV.PPV,
                ValidateSENS = validatePV.SENS,
                ValidateSPEC = validatePV.SPEC,

                TestNPV = testPV.NPV,
                TestPPV = testPV.PPV,
                TestSENS = testPV.SENS,
                TestSPEC = testPV.SPEC,
            };

            resultAnn = ann;

            return result;
        }