Esempio n. 1
0
        /// <summary>
        ///   Searches for the best combination of parameters that results in the most accurate model.
        /// </summary>
        ///
        /// <param name="bestParameters">The best combination of parameters found by the grid search.</param>
        /// <param name="error">The minimum error of the best model found by the grid search.</param>
        /// <returns>The best model found during the grid search.</returns>
        ///
        public TModel Compute(out GridSearchParameterCollection bestParameters, out double error)
        {
            var result = Compute();

            bestParameters = result.Parameter;
            error          = result.Error;
            return(result.Model);
        }
Esempio n. 2
0
        /// <summary>
        ///   Searches for the best combination of parameters that results in the most accurate model.
        /// </summary>
        ///
        /// <returns>The results found during the grid search.</returns>
        ///
        public GridSearchResult <TModel> Compute()
        {
            // Get the total number of different parameters
            var values = new GridSearchParameter[ranges.Count][];

            for (int i = 0; i < values.Length; i++)
            {
                values[i] = ranges[i].GetParameters();
            }


            // Generate the Cartesian product between all parameters
            GridSearchParameter[][] grid = Matrix.CartesianProduct(values);


            // Initialize the search
            var parameters = new GridSearchParameterCollection[grid.Length];
            var models     = new TModel[grid.Length];
            var errors     = new double[grid.Length];
            var msgs       = new string[grid.Length];

            // Search the grid for the optimal parameters
            Parallel.For(0, grid.Length, i =>
            {
                // Get the current parameters for the current point
                parameters[i] = new GridSearchParameterCollection(grid[i]);

                try
                {
                    // Try to fit a model using the parameters
                    models[i] = Fitting(parameters[i], out errors[i]);
                }
                catch (ConvergenceException ex)
                {
                    errors[i] = Double.PositiveInfinity;
                    msgs[i]   = ex.Message;
                }
            });


            // Select the minimum error
            int best; errors.Min(out best);

            // Return the best model found.
            return(new GridSearchResult <TModel>(grid.Length,
                                                 parameters, models, errors, best));
        }