public override PatternResult Train(List <Pattern> patterns, int iterations)
        {
            double error = 0.0;

            if (patterns.Count == 0)
            {
                return(null);
            }

            foreach (string c in charsSet)
            {
                DoubleVectorList inputs  = new DoubleVectorList();
                DoubleVectorList outputs = new DoubleVectorList();

                foreach (Pattern p in patterns)
                {
                    // Add every item. The solution is either "yes this is a letter X" or "no this is not a letter X"
                    inputs.Add(p.Inputs.Scale());
                    if (GetOutputCharacter(p.Outputs) == c)
                    {
                        DoubleVector v = new DoubleVector(1);
                        v[0] = 0.99;
                        outputs.Add(v);
                    }
                    else
                    {
                        DoubleVector v = new DoubleVector(1);
                        v[0] = 0.01;
                        outputs.Add(v);
                    }
                }

                // Train only if we have patters for this letter in our character set
                if (inputs.Count > 0)
                {
                    // Get the specialized neural network for this specific letter
                    error += sann.Where(nn => nn.Solution == c).ToList()[0].NeuralNet.Train(inputs, outputs, iterations);
                }
            }

            return(new PatternResult(error));
        }
        public override PatternResult Train(List <Pattern> patterns, int iterations)
        {
            if (patterns.Count == 0)
            {
                return(null);
            }

            DoubleVectorList inputs  = new DoubleVectorList();
            DoubleVectorList outputs = new DoubleVectorList();

            foreach (Pattern p in patterns)
            {
                inputs.Add(p.Inputs.Scale(0.02, 0.98));
                outputs.Add(p.Outputs);
            }

            double error = sann.Train(inputs, outputs, iterations);

            return(new PatternResult(error));
        }
        /// <summary>
        /// Train the network on a single input vector. Returns the sum of the mean square error of the sets.
        /// </summary>
        /// <param name="inputs">The input vectors to train on</param>
        /// <param name="targets">The target output vectors</param>
        /// <param name="iterations">The number of iterations to train on these inputs</param>
        public double Train(DoubleVectorList inputs, DoubleVectorList targets, int iterations)
        {
            // Make sure all input vectors have a matching output vector
            if (inputs.Count != targets.Count)
            {
                throw new Exception("You must provide a desired output vector for each input vector!");
            }

            double error = 0.0;
            int progress;

            Random r = new Random();

            for (int i = 0; i < iterations; i++)
            {
                // The error for this iteration
                error = 0.0;

                // Create a list of indexes and mix it up so that we don't train on the sets sequentially
                List<int> indices = new List<int>();
                for (int n = 0; n < inputs.Count; n++)
                {
                    indices.Insert(r.Next(n), n);
                }

                // Train for one iteration on this set
                for (int s = 0; s < inputs.Count; s++)
                {
                    error += Train(inputs[indices[s]], targets[indices[s]], 1);

                    // Report Progress
                    progress = (int)(((double)i * 100 / (double)iterations) + (((double)s * 100) / (double)inputs.Count) / (double)iterations);
                    if (OnTrainingProgressChange != null)
                    {
                        OnTrainingProgressChange(this, new OnTrainingProgressChangeEventArgs(progress, (error / (double)s) * (double)inputs.Count));
                    }
                }

                // Lower the learning rate
                learningRate *= _learningRateDescent;
            }

            // Return error of most recent iteration
            return error;
        }
        public override PatternResult Train(List<Pattern> patterns, int iterations)
        {
            double error = 0.0;

            if (patterns.Count == 0)
            {
                return null;
            }

            foreach (string c in charsSet)
            {
                DoubleVectorList inputs = new DoubleVectorList();
                DoubleVectorList outputs = new DoubleVectorList();

                foreach (Pattern p in patterns)
                {
                    // Add every item. The solution is either "yes this is a letter X" or "no this is not a letter X"
                    inputs.Add(p.Inputs.Scale());
                    if (GetOutputCharacter(p.Outputs) == c)
                    {
                        DoubleVector v = new DoubleVector(1);
                        v[0] = 0.99;
                        outputs.Add(v);
                    }
                    else
                    {
                        DoubleVector v = new DoubleVector(1);
                        v[0] = 0.01;
                        outputs.Add(v);
                    }
                }

                // Train only if we have patters for this letter in our character set
                if (inputs.Count > 0)
                {
                    // Get the specialized neural network for this specific letter
                    error += sann.Where(nn => nn.Solution == c).ToList()[0].NeuralNet.Train(inputs, outputs, iterations);
                }
            }

            return new PatternResult(error);
        }
        public override PatternResult Train(List<Pattern> patterns, int iterations)
        {
            if (patterns.Count == 0)
            {
                return null;
            }

            DoubleVectorList inputs = new DoubleVectorList();
            DoubleVectorList outputs = new DoubleVectorList();

            foreach (Pattern p in patterns)
            {
                inputs.Add(p.Inputs.Scale(0.02, 0.98));
                outputs.Add(p.Outputs);
            }

            double error = sann.Train(inputs, outputs, iterations);

            return new PatternResult(error);
        }