static void Main(string[] args)
        {
            Dataset xnor = new Dataset("./xnor_dataset.csv", 2, 1); // Read the dataset
            // Con esta opcion leemos un archivo .csv con los datos de entrenamiento


            MultiLayerPerceptron p = new MultiLayerPerceptron(new int[3] {
                2, 2, 1
            });                                                                   // Create Multi-Layer Perceptron

            // Con esta opcion se crea un perceptron nuevo


            // MultiLayerPerceptron p = new MultiLayerPerceptron(new int[3]{2,2,1}, "./perceptron.json"); // Create or Read serialized Multi-Layer Perceptron
            // Con esta opcion creamos un perceptron con archivo de volcado, en caso de existir el archivo lo lee y crea el perceptron
            //que ha sido guardado en ese archivo, si no existe el archivo especificado, lo guarda para poder guardar el modelo con la funcion save() de la clase MultiLayerPerceptron

            // p.show_model(); // show the generated model

            p.Learn(xnor, 0.3); // learn xnor rule
            // Con esta funcion entrenas al perceptron para aprender algo
            // El segundo paramentro se llama tasa o factor de aprendizaje, entre mas bajo mas exacto es el modelo pero mas dificil de entrenar se vuelve el trabajo.

            // show all posibilities
            for (int i = 0; i <= 1; i++)
            {
                for (int j = 0; j <= 1; j++)
                {
                    Console.WriteLine("E{0},E{1} = {2} = {3}", i, j, Math.Round(p.stimulate(new double[2] {
                        i, j
                    })[0]), p.stimulate(new double[2] {
                        i, j
                    })[0]);
                }
            }
            // Con este codigo le preguntas al perceptron el condicional XNOR

            // p.save(); // save current perceptron
            //Si has creado un perceptron con un archivo de volcado (Como el segundo ejemplo para crear el percetron) utilizas esta funcion para guardar el modelo actual y poder usarlo sin entrenar la siguinte vez que ejecutes el programa

            // p.save("./mi_perceptron.json");
            // Con esta opcion guardas el modelo actual en el archivo especificado

            // Console.ReadKey(); // wait for close program
        }
        static void Main(string[] args)
        {
            int    interation = 5000;
            double eta        = 0.25;
            int    neurons    = 5;
            var    beta       = 1;
            var    momentum   = 0.9;
            var    inputs     = new double[, ]
            {
                { 0, 0 },
                { 1, 0 },
                { 0, 1 },
                { 1, 1 },
            };
            var xortargets = new double[]
            {
                0, 1, 1, 0
            };
            var ortargets = new double[]
            {
                0, 1, 1, 1
            };
            var andtargets = new double[]
            {
                0, 0, 0, 1
            };

            //=SIN(2*PI()*A10)+COS(4*PI()*A10)*RAND()*0.2
            // where As are numbers from liner space between 0 and 1
            var RandomInputs = new double[, ]
            {
                { 0 },
                { 0.038461538 },
                { 0.076923077 },
                { 0.115384615 },
                { 0.153846154 },
                { 0.192307692 },
                { 0.230769231 },
                { 0.269230769 },
                { 0.307692308 },
                { 0.346153846 },
                { 0.384615385 },
                { 0.423076923 },
                { 0.461538462 },
                { 0.5 },
                { 0.538461538 },
                { 0.576923077 },
                { 0.615384615 },
                { 0.653846154 },
                { 0.692307692 },
                { 0.730769231 },
                { 0.769230769 },
                { 0.807692308 },
                { 0.846153846 },
                { 0.884615385 },
                { 0.923076923 },
                { 0.961538462 },
                { 1 }
            };
            var randomTargets = new double[]
            {
                0.006680055,
                0.265486149,
                0.483279114,
                0.668364274,
                0.763504244,
                0.038461538,
                0.798585083,
                0.845324964,
                0.793562162,
                0.759179583,
                0.686347672,
                0.491122895,
                0.243967266,
                0.019711415,
                -0.137190041,
                -0.44675456,
                -0.642939788,
                -0.883257236,
                -0.970691029,
                -1.076569246,
                -1.083657338,
                -0.975380275,
                -0.872895307,
                -0.64233422,
                -0.363677106,
                -0.063115857,
                0.186050921,
            };
            var randomTargets1 = (double[])randomTargets.Clone();


            var logistic = new Logistic(beta);
            var linear   = new Linear(randomTargets1.Length);

            var gateSoftmax = new Softmax(inputs.GetLength(0));
            var gateLinear  = new Linear(inputs.RowLength());

            var xorPerc    = new MultiLayerPerceptron(inputs, (double[])xortargets.Clone(), neurons, beta, momentum, gateLinear);
            var orPerc     = new MultiLayerPerceptron(inputs, (double[])ortargets.Clone(), neurons, beta, momentum, gateLinear);
            var andPerc    = new MultiLayerPerceptron(inputs, (double[])andtargets.Clone(), neurons, beta, momentum, gateLinear);
            var randomPerc = new MultiLayerPerceptron(RandomInputs, randomTargets, neurons, beta, momentum, linear);

            var tasks = new Task[]
            {
                Task.Factory.StartNew(() => xorPerc.Train(interation, eta)),
                Task.Factory.StartNew(() => orPerc.Train(interation, eta)),
                Task.Factory.StartNew(() => andPerc.Train(interation, eta)),
                Task.Factory.StartNew(() => randomPerc.Train(interation + 40000, eta))
            };

            Console.Out.WriteLine("Start" + Environment.NewLine);
            Task.WaitAll(tasks);
            Console.Out.WriteLine("Stop" + Environment.NewLine);

            xorPerc.Train(interation, eta);

            Console.WriteLine("XOR");
            xorPerc.ConfusionMatrix(inputs, xortargets);
            Console.Out.WriteLine(Environment.NewLine);

            Console.WriteLine("OR");
            orPerc.ConfusionMatrix(inputs, ortargets);
            Console.Out.WriteLine(Environment.NewLine);

            Console.WriteLine("AND");
            andPerc.ConfusionMatrix(inputs, andtargets);
            Console.Out.WriteLine(Environment.NewLine);

            Console.Out.WriteLine("MY random shit function from excel");
            randomPerc.ConfusionMatrix(RandomInputs, randomTargets1);
            Console.Out.WriteLine(Environment.NewLine);

            Console.ReadKey();
        }