Ejemplo n.º 1
0
        /// <summary>
        ///  The main training routine
        ///  train a back-prop style NN classifier using learning rate and momentum
        ///  weight decay reduces the magnitude of a weight value over time unless that value
        ///  is constantly increased
        /// </summary>
        /// <param name="trainData"></param>
        /// <param name="testdata"></param>
        /// <param name="maxEpochs"></param>
        /// <param name="learnRate"></param>
        public void train(double[][] trainData, double[][] testData, int maxEpochs, double learnRate, string logFileName)
        {
            GraphData = new MatrixData(maxEpochs, 3);
            GraphData.ChangeHeader(0, "Epoch");
            GraphData.ChangeHeader(1, "Train Accuracy");
            GraphData.ChangeHeader(2, "Test Accuracy");
            // train a back-prop style NN classifier using learning rate and momentum
            // weight decay reduces the magnitude of a weight value over time unless that value
            // is constantly increased
            int epoch = 0;

            double[] xValues = new double[numInput];  // inputs
            double[] tValues = new double[numOutput]; // target values

            int[] sequence = new int[trainData.Length];
            for (int i = 0; i < sequence.Length; i++)
            {
                sequence[i] = i;
            }


            using (StreamWriter writer = File.AppendText(logFileName))
            {
                while (epoch < maxEpochs)
                {
                    //double mse = MeanSquaredError(trainData);
                    //if (mse < 0.020) break; // consider passing value in as parameter

                    Shuffle(sequence); // visit each training data in random order
                    for (int i = 0; i < trainData.Length; i++)
                    {
                        int idx = sequence[i];
                        Array.Copy(trainData[idx], xValues, numInput);
                        Array.Copy(trainData[idx], numInput, tValues, 0, numOutput);
                        ComputeOutputs(xValues);                          // copy xValues in, compute outputs (store them internally)
                        UpdateWeights(tValues, learnRate);                // find better weights
                    } // each training tuple
                    double trainAccuracy = Accuracy(trainData, "") * 100; // *100 to convert to percent
                    double testAccuracy  = Accuracy(testData, "") * 100;
                    double trainMse      = MeanSquaredError(trainData);
                    double testMse       = MeanSquaredError(testData);
                    string linez         = epoch.ToString() + " ";
                    linez = linez + trainMse.ToString() + " " + testMse.ToString() + " ";
                    linez = linez + trainAccuracy.ToString("F2") + "% " + testAccuracy.ToString("F2") + "% ";
                    linez = linez + Environment.NewLine;
                    writer.Write(linez);
                    GraphData[epoch, 0] = epoch;
                    GraphData[epoch, 1] = trainAccuracy;
                    GraphData[epoch, 2] = testAccuracy;

                    epoch++;
                }
            }
        } // Train
Ejemplo n.º 2
0
        public MatrixData GetRightOrWrongMatrix(MatrixData input)
        {
            MatrixData output = new MatrixData(input.NumberOfRows, 4);

            output.ChangeHeader(0, "#");
            output.ChangeHeader(1, "Actual");
            output.ChangeHeader(2, "Predict");
            output.ChangeHeader(3, "Correct?");



            double[][] dataSet = input.Data.ToJagged().ToDoubleArray();
            // percentage correct using winner-takes all
            bool result;
            int  numCorrect = 0;
            int  numWrong   = 0;

            double[] xValues = new double[numInput];  // inputs
            double[] tValues = new double[numOutput]; // targets
            double[] yValues;                         // computed Y
            confusionMatrix = new int[numOutput, numOutput];
            //confusionMatrixCnt = 0;
            for (int i = 0; i < dataSet.Length; ++i)
            {
                Array.Copy(dataSet[i], xValues, numInput); // parse test data into x-values and t-values
                Array.Copy(dataSet[i], numInput, tValues, 0, numOutput);
                yValues = this.ComputeOutputs(xValues);
                int maxIndexOut      = MaxIndex(yValues); // which cell in yValues has largest value?
                int maxIndexExpected = MaxIndex(tValues); // which cell in yValues has largest value?
                if (maxIndexOut == maxIndexExpected)
                {
                    numCorrect++; result = true;
                }
                else
                {
                    numWrong++; result = false;
                }

                output.SetValue(i, 0, input.GetRowName(i));
                output.SetValue(i, 1, maxIndexOut);
                output.SetValue(i, 2, maxIndexExpected);
                output.SetValue(i, 3, (result)? "Y":"N");
            }
            return(output);
        }
Ejemplo n.º 3
0
        public string Task3RightWrong()
        {
            nn.rightOrWrong(_validationData, "valResult.txt");
            _rightWrongData = nn.GetRightOrWrongMatrix(_validationData);
            MatrixData trainWrongData = nn.GetRightOrWrongMatrix(_trainingData);
            int        rows           = _rightWrongData.CountIf(3, MatrixDataExtension.StringEquals, "N") + trainWrongData.CountIf(3, MatrixDataExtension.StringEquals, "N");

            _wrongData = new MatrixData(rows, trainWrongData.NumberOfColumns);

            int wrongDataCounter = 0;

            for (int r = 0; r < _rightWrongData.NumberOfRows; r++)
            {
                if (_rightWrongData[r, 3] == "N")
                {
                    _wrongData.SetValue(wrongDataCounter, 0, _rightWrongData[r, 0]);
                    _wrongData.SetValue(wrongDataCounter, 1, _rightWrongData[r, 1]);
                    _wrongData.SetValue(wrongDataCounter, 2, _rightWrongData[r, 2]);
                    _wrongData.SetValue(wrongDataCounter, 3, _rightWrongData[r, 3]);
                    wrongDataCounter++;
                }
            }

            for (int r = 0; r < trainWrongData.NumberOfRows; r++)
            {
                if (trainWrongData[r, 3] == "N")
                {
                    _wrongData.SetValue(wrongDataCounter, 0, trainWrongData[r, 0]);
                    _wrongData.SetValue(wrongDataCounter, 1, trainWrongData[r, 1]);
                    _wrongData.SetValue(wrongDataCounter, 2, trainWrongData[r, 2]);
                    _wrongData.SetValue(wrongDataCounter, 3, trainWrongData[r, 3]);
                    wrongDataCounter++;
                }
            }
            _wrongData.ChangeHeader(0, "Row Num");
            _wrongData.ChangeHeader(1, "Actual");
            _wrongData.ChangeHeader(2, "Predict");
            _wrongData.ChangeHeader(3, "Correct?");
            _wrongData.WriteCSV(DateTime.Now.Ticks + ".csv");


            return("Saved valResult.txt");
        }
Ejemplo n.º 4
0
        private string updateMatrixHeader(string matrixRef, int colToUpdate, string headerName)
        {
            var md = Value(matrixRef);

            if (md.GetType() == typeof(string))
            {
                return(md.ToString());
            }
            MatrixData m = (MatrixData)md;

            m.ChangeHeader(colToUpdate, headerName);
            return("Updated column " + colToUpdate + " of " + matrixRef + " to " + headerName);
        }
Ejemplo n.º 5
0
        public string RunIris()
        {
            string output = "";

            _rawData = new MatrixData("iris", false, true, ' ');

            _rawData.ChangeHeader(0, "Speal.Length");
            _rawData.ChangeHeader(1, "Speal.Width");
            _rawData.ChangeHeader(2, "Petal.Length");
            _rawData.ChangeHeader(3, "Petal.Width");
            _rawData.ChangeHeader(4, "Species");

            output += "Raw data:" + Environment.NewLine;
            output += _rawData.Head().ToString(5, 16);
            output += Environment.NewLine + Environment.NewLine;

            output += "Normalizeing columns 1:4..." + Environment.NewLine;
            _rawData.Normalize(0);
            _rawData.Normalize(1);
            _rawData.Normalize(2);
            _rawData.Normalize(3);

            output += "Normalised data:" + Environment.NewLine;
            output += _rawData.Head().ToString(5, 16);
            output += Environment.NewLine + Environment.NewLine;

            _exemplarData = _rawData.GetExemplar(4, 3, 1);

            output += "Exemplar data:" + Environment.NewLine;
            output += _exemplarData.Head().ToString(5, 16);
            output += Environment.NewLine + Environment.NewLine;

            output += "Suffleing data..." + Environment.NewLine;
            _exemplarData.Suffle();
            output += Environment.NewLine;

            output       += "Setting trainig data as first 50 rows of suffled exemplar data..." + Environment.NewLine;
            _trainingData = _exemplarData.CopyData(0, 0, 50);
            output       += "Trainig data:" + Environment.NewLine;
            output       += _trainingData.Head().ToString(5, 16);
            output       += Environment.NewLine + Environment.NewLine;

            output      += "Setting test data as next 50 rows of suffled exemplar data..." + Environment.NewLine;
            _testingData = _exemplarData.CopyData(50, 0, 50);
            output      += "Test data:" + Environment.NewLine;
            output      += _testingData.Head().ToString(5, 16);
            output      += Environment.NewLine + Environment.NewLine;


            output         += "Setting validation data as next 50 rows of suffled exemplar data..." + Environment.NewLine;
            _validationData = _exemplarData.CopyData(100, 0, 50);
            output         += "Validation data:" + Environment.NewLine;
            output         += _validationData.Head().ToString(5, 16);
            output         += Environment.NewLine + Environment.NewLine;


            int    num_inputs  = 4;   // from iris data set
            int    num_hidden  = 1;   // arbitary
            int    num_outputs = 3;   // from iris data set
            int    epochs      = 200; // For tute 3
            double eta         = 0.1; // learning_rate


            output += "Initialising Neural Network with:" + Environment.NewLine;
            output += num_inputs + " inputs, " + num_hidden + " hidden layers, " + num_outputs + " outputs, " + epochs + " epochs, " + eta + " learning eate" + Environment.NewLine;

            Random rnd1 = new Random(102);

            nn = new W4NeuralNetwork(num_inputs, num_hidden, num_outputs, rnd1);
            nn.InitializeWeights(rnd1);

            string dir = "Data\\";

            nn.train(_trainingData.Data.ToJagged().ToDoubleArray(), _testingData.Data.ToJagged().ToDoubleArray(), epochs, eta, dir + "nnlog.txt");
            _graphData = nn.GraphData;

            double trainAcc       = nn.Accuracy(_trainingData.Data.ToJagged().ToDoubleArray(), dir + "trainOut.txt");
            string ConfusionTrain = nn.showConfusion(dir + "trainConfusion.txt");

            _confusionMatrixTrain = nn.GetConfusionMatrix();
            _outputMatrixTrain    = new MatrixData(dir + "trainOut.txt", false, true, ' ');

            double testAcc       = nn.Accuracy(_testingData.Data.ToJagged().ToDoubleArray(), dir + "testOut.txt");
            string ConfusionTest = nn.showConfusion(dir + "testConfusion.txt");

            _confusionMatrixTest = nn.GetConfusionMatrix();
            _outputMatrixTest    = new MatrixData(dir + "testOut.txt", false, true, ' ');

            double valAcc       = nn.Accuracy(_validationData.Data.ToJagged().ToDoubleArray(), dir + "valOut.txt");
            string ConfusionVal = nn.showConfusion(dir + "valConfusion.txt");

            _confusionMatrixVal = nn.GetConfusionMatrix();
            _outputMatrixVal    = new MatrixData(dir + "valOut.txt", false, true, ' ');


            trainAcc = trainAcc * 100;
            testAcc  = testAcc * 100;
            valAcc   = valAcc * 100;
            output  += Environment.NewLine;

            output += "Train accuracy = " + trainAcc.ToString("F2") + Environment.NewLine;
            output += "Test accuracy = " + testAcc.ToString("F2") + Environment.NewLine;
            output += "Val accuracy = " + valAcc.ToString("F2") + Environment.NewLine;
            output += Environment.NewLine;
            output += "Train Confusion matrix \r\n" + ConfusionTrain + Environment.NewLine;
            output += "Test Confusion matrix \r\n" + ConfusionTest + Environment.NewLine;
            output += "Val Confusion matrix \r\n" + ConfusionVal + Environment.NewLine;
            GenerateGraph();
            return(output);
        }