Пример #1
0
        static void Main(string[] args)
        {
            /*Matrix.Matrix a = new Matrix.Matrix(5, 5);
             * Matrix.Matrix b = new Matrix.Matrix(5, 5);
             *
             * a.RandomizeMatrix(-5, 5);
             * a.DisplayMatrix();
             * b = a.TransposeMatrix();
             * Console.Write('\n');
             * b.DisplayMatrix();*/
            /*NeuralNetwork nn = new NeuralNetwork(3, 2, 1, true);
             * int[] a = new int[3];
             * for (int i = 0; i < 3; ++i)
             *  a[i] = i;
             *
             * Matrix.Matrix output = new Matrix.Matrix(1, 1);
             *
             * output = nn.feedForward(a);
             * output.DisplayMatrix();*/
            /*Matrix.Matrix a = new Matrix.Matrix(3, 3);
             * a.RandomizeMatrix(-3, 3);
             * a.DisplayMatrix();
             * Console.Write('\n');
             * nn.activationFunction(a);
             * a.DisplayMatrix();*/


            /*Matrix.Matrix a = new Matrix.Matrix(2, 1);
             * Matrix.Matrix b = new Matrix.Matrix(1, 2);
             * a.RandomizeMatrix(0, 5);
             * b.RandomizeMatrix(0, 5);
             *
             * a.DisplayMatrix();
             * b.DisplayMatrix();
             *
             *
             * Matrix.Matrix c = a * b;
             * c.DisplayMatrix();*/


            /*int[] a = new int[3];
             * for (int i = 0; i < 3; ++i)
             *  a[i] = i;
             * Console.Write(a.Length);
             * Matrix.Matrix m = new Matrix.Matrix(a, true);
             * m.DisplayMatrix();*/


            // XOR

            /*NeuralNetwork nn = new NeuralNetwork(2, 4, 1, true);
             *
             * int[] input = new int[2];
             * int[] target = new int[1];
             * Random rnd = new Random();
             *
             * for (int i = 0; i < 10000; ++i)
             * {
             *  input[0] = rnd.Next(0, 2);
             *  input[1] = rnd.Next(0, 2);
             *
             *  target[0] = input[0] ^ input[1];
             *
             *  //Console.WriteLine("\ninput0: " + input[0] + " input1: " + input[1] + " target: " + target[0]);
             *  nn.train(input, target);
             * }
             *
             * input[0] = 0;
             * input[1] = 0;
             * target[0] = 0;
             *
             * Matrix.Matrix output = nn.feedForward(input);
             * output.DisplayMatrix();
             * Console.Write('\n');
             *
             * input[0] = 1;
             * input[1] = 1;
             * target[0] = 0;
             *
             * output = nn.feedForward(input);
             * output.DisplayMatrix();
             * Console.Write('\n');
             *
             * input[0] = 0;
             * input[1] = 1;
             * target[0] = 1;
             *
             * output = nn.feedForward(input);
             * output.DisplayMatrix();
             * Console.Write('\n');
             *
             * input[0] = 1;
             * input[1] = 0;
             * target[0] = 1;
             *
             * output = nn.feedForward(input);
             * output.DisplayMatrix();
             * Console.Write('\n');
             */


            //ZADANIE 1

            double[][] data = new double[4][];
            data[0] = new double[] { 1, 0, 0, 0 };
            data[1] = new double[] { 0, 1, 0, 0 };
            data[2] = new double[] { 0, 0, 1, 0 };
            data[3] = new double[] { 0, 0, 0, 1 };

            //NeuralNetwork nn = new NeuralNetwork(4, 3, 4, true);
            int    n   = 0;
            double sum = 0;


            Random rnd = new Random();

            Matrix.Matrix output = new Matrix.Matrix(4, 1);
            int           epochs = 0;
            double        averageSquareOfEpochs = 0;

            for (int i = 0; i < 20; ++i)
            {
                NeuralNetwork nn = new NeuralNetwork(4, 2, 4, true);
                do
                {
                    sum = 0;
                    //trenowanie
                    foreach (int j in Enumerable.Range(0, 4).OrderBy(x => rnd.Next()))
                    {
                        nn.train(data[j], data[j]);
                    }

                    for (int j = 0; j < 4; ++j)
                    {
                        output = nn.feedForward(data[j]);
                        for (int z = 0; z < 4; ++z)
                        {
                            sum += (output.tab[z, 0] - data[j][z]) * (output.tab[z, 0] - data[j][z]);
                        }
                    }
                    ++epochs;
                    // Console.WriteLine("Mean squared error: " + sum / 2);
                } while (sum / 2 > 0.1);

                Console.WriteLine("epochs: " + epochs);
                averageSquareOfEpochs += epochs;
                epochs = 0;
            }
            averageSquareOfEpochs /= 20;
            output.DisplayMatrix();
            Console.WriteLine("averageSquareOfEpochs: " + averageSquareOfEpochs);

            /* for (int i = 0; i < 30000; ++i)
             * {
             *   foreach (int j in Enumerable.Range(0, 4).OrderBy(x => rnd.Next()))
             *   {
             *       nn.train(data[j], data[j]);
             *       //Console.WriteLine(j);
             *   }
             *
             *   sum = 0;
             *
             *
             *   for (int j = 0; j < 4; ++j)
             *   {
             *       output = nn.feedForward(data[j]);
             *       for (int z = 0; z < 4; ++z)
             *       {
             *           //Console.WriteLine("(output.tab[z, 0]: " + (output.tab[z, 0] + " data[j][z]: " + data[j][z]));
             *
             *           sum += (output.tab[z, 0] - data[j][z]) * (output.tab[z, 0] - data[j][z]);
             *       }
             *       //Console.WriteLine("Mean squared error: " + sum / 2);
             *       //sum = 0;
             *   }
             *
             *   Console.WriteLine("Mean squared error: " + sum / 2);
             *
             *
             * }*/



            /*for (int i = 0; i < 4; ++i)
             * {
             *  output = nn.feedForward(data[i]);
             *  output.DisplayMatrix();
             *  Console.Write('\n');
             * }*/


            Console.Read();
        }
Пример #2
0
 public void showHiddenOutputs(Matrix.Matrix a)
 {
     Console.WriteLine("Hidden outputs: ");
     a.DisplayMatrix();
     Console.Write('\n');
 }
Пример #3
0
        private void Form1_Load(object sender, EventArgs e)
        {
            epochs = 1000;
            LoadFromFile(data);

            //plot
            //OxyPlot.WindowsForms.PlotView pv = new PlotView();
            this.Controls.Add(pv);
            PlotModel pm = new PlotModel();

            pv.Model = pm;



            LineSeries punktySerii = new LineSeries
            {
                LineStyle    = LineStyle.None,
                MarkerType   = MarkerType.Diamond,
                MarkerSize   = 2,
                MarkerStroke = OxyColors.Red,
                Title        = "Punkty treningowe"
            };

            LineSeries punktySieci = new LineSeries()
            {
                LineStyle    = LineStyle.None,
                MarkerType   = MarkerType.Plus,
                MarkerSize   = 3,
                MarkerStroke = OxyColors.Blue,
                Title        = "Punkty wyjściowe"
            };

            LineSeries punktyKresek = new LineSeries
            {
                Color           = OxyColors.Blue,
                StrokeThickness = 1
            };

            for (int i = 0; i < inputArray.Length; i++)
            {
                punktySerii.Points.Add(new DataPoint(inputArray[i], targetArray[i]));
            }



            //SIEĆ

            Random        rnd = new Random();
            NeuralNetwork nn  = new NeuralNetwork(1, 10, 1, data);

            for (int i = 0; i < epochs; ++i)
            {
                foreach (int j in Enumerable.Range(0, 81).OrderBy(x => rnd.Next()))
                {
                    double[] inp = new double[1];
                    double[] tar = new double[1];

                    inp[0] = inputArray[j];
                    tar[0] = targetArray[j];


                    nn.Train(inp, tar);
                }
            }

            Matrix.Matrix output = new Matrix.Matrix(1, 1);

            for (int i = 0; i < 81; ++i)
            {
                double[] inp = new double[1];
                double[] d   = new double[1];
                inp[0] = inputArray[i];

                output = nn.FeedForward(inp);

                d[0] = inputArray[i];
                punktySieci.Points.Add(new DataPoint(d[0], output.tab[0, 0]));
            }
            output.DisplayMatrix();

            pm.Series.Add(punktySerii);
            pm.Series.Add(punktySieci);
        }
Пример #4
0
        static void Main(string[] args)
        {
            Program p = new Program();

            p.LoadFromFile();

            Random rnd = new Random();

            NeuralNetwork nn = new NeuralNetwork(4, 4, 3, true);

            /*for (int j = 0; j < 90; ++j)
             * {
             *  Array.Clear(targetArray, 0, 3);
             *  for (int z = 0; z < numberOfInputs; ++z)
             *  {
             *      inputArray[z] = classification_train[j][z];
             *  }
             *  targetArray[(int)classification_train[j][4] - 1] = 1;
             *  Console.WriteLine("inputArray: " + inputArray[0] + " " + inputArray[1] + " targetArray: " + targetArray[0] + " " + targetArray[1] + " " + targetArray[2]);
             * }*/

            double[] second = new double[] { 0, 1, 0 };

            for (int i = 0; i < 1000; ++i)
            {
                foreach (int j in Enumerable.Range(0, 90).OrderBy(x => rnd.Next()))
                {
                    Array.Clear(targetArray, 0, 3);

                    //wypełnianie całej inputArray na początek
                    for (int z = 0; z < numberOfInputs; ++z)
                    {
                        inputArray[z] = classification_train[j][z];
                    }
                    targetArray[(int)classification_train[j][4] - 1] = 1;
                    //Console.WriteLine("inputArray: " + inputArray[0] + " " + inputArray[1]);

                    /*if (classification_train[j][4] == 2)
                     * {
                     *  Console.WriteLine("DWAAAAAAAAAAAAA");
                     *  targetArray = second;
                     * }*/
                    nn.train(inputArray, targetArray);
                }
            }

            Matrix.Matrix output              = new Matrix.Matrix(3, 1);
            Matrix.Matrix confusionMatrix     = new Matrix.Matrix(3, 3);
            double        numberOfCorrect     = 0;
            double        percentOfCorectness = 0;
            int           predictedOutput     = 0;

            for (int i = 0; i < 93; ++i)
            {
                for (int z = 0; z < numberOfInputs; ++z)
                {
                    inputArray[z] = classification_test[i][z];
                }

                output = nn.feedForward(inputArray);
                output = output.TransposeMatrix();

                //POTRZEBNE DO LICZNIEA BŁĘDU ŚREDNIOKWADRATOWEGO

                /*Array.Clear(targetArray, 0, 3);
                 * targetArray[(int)classification_test[i][4] - 1] = 1;
                 * Console.WriteLine(" targetArray: " + targetArray[0] + " " + targetArray[1] + " " + targetArray[2]);*/


                //LICZENIE PROCENTA POPRAWNOŚCI
                if (output.tab[0, 0] > output.tab[0, 1] && output.tab[0, 0] > output.tab[0, 2] && classification_test[i][4] == 1)
                {
                    ++numberOfCorrect;
                }
                else if (output.tab[0, 1] > output.tab[0, 0] && output.tab[0, 1] > output.tab[0, 2] && classification_test[i][4] == 2)
                {
                    ++numberOfCorrect;
                }
                else if (output.tab[0, 2] > output.tab[0, 0] && output.tab[0, 2] > output.tab[0, 1] && classification_test[i][4] == 3)
                {
                    ++numberOfCorrect;
                }

                predictedOutput = 0;
                if (output.tab[0, 0] > output.tab[0, 1] && output.tab[0, 0] > output.tab[0, 2])
                {
                    predictedOutput = 1;
                }
                else if (output.tab[0, 1] > output.tab[0, 0] && output.tab[0, 1] > output.tab[0, 2])
                {
                    predictedOutput = 2;
                }
                else if (output.tab[0, 2] > output.tab[0, 0] && output.tab[0, 2] > output.tab[0, 1])
                {
                    predictedOutput = 3;
                }

                //WYPEŁNIANIE MACIERZY POMYŁEK (confusionMatrix)
                if (predictedOutput > 0)
                {
                    confusionMatrix.tab[(int)classification_test[i][4] - 1, predictedOutput - 1]++;
                }

                output.DisplayMatrix();
            }

            percentOfCorectness  = numberOfCorrect / 93;
            percentOfCorectness *= 100;
            //Console.WriteLine("\nNumber of correct: " + numberOfCorrect);
            Console.WriteLine("\nPercentage of corectness: " + percentOfCorectness);
            Console.WriteLine("\nConfusion matrix: ");
            confusionMatrix.DisplayMatrix();
        }