Exemple #1
0
def run_fitting_schemes(model_types, number_of_generators, random_seeds,
                        schemes, mean_data, cov_data, max_fun_eval=100000):
    all_models = def_all_models_dict(schemes, model_types, 
                                     number_of_generators, random_seeds)

    overall_start_time = time.time()
    for (model_type, n_gen, seed, scheme) in [(model_type, n_gen, seed, scheme)
                                              for scheme in schemes
                                              for model_type in model_types 
                                              for n_gen in number_of_generators
                                              for seed in random_seeds]:
        random.seed(seed)
        entry = def_empty_entry_dict()
        erp_model = ERP_Variability_Model_Fit(n_sub=23, n_gen=n_gen)
        parameter_list = prepare_variability_parameter_list(erp_model, 
                                                            model_type, n_gen)
        # If parameter_list is None that means the combination of model_type
        # and number of generators shouldn't be taken into account.
        if parameter_list is None:
            continue
        parameter_list.insert(0,'amplitudes')
        parameter_list.insert(0,'locations and orientations')
        erp_model.set_random_parameters(parameter_list)

        description = 'Fitting scheme: ' + scheme + ', model type: ' +\
                      model_type + ', with ' + str(n_gen) +\
                      ' generator(s) and seed ' + str(seed)
        print(description + '\n' + '=' * len(description))
        
        entry['starting_error_mean'] = error_mean(mean_data, erp_model, [], 
                []) / norm(mean_data, 2)
        entry['starting_error_covariance'] = error_cov(cov_data, erp_model, 
                [], []) / norm(cov_data.reshape((erp_model.n_el**2,1)), 2)
        entry['starting_error_mean_and_covariance'] =\
                error_mean_and_cov(mean_data, cov_data, erp_model, [], [])
        print('Starting error on mean: ' + str(entry['starting_error_mean']))
        print('Starting error on covariance: ' +\
              str(entry['starting_error_covariance']))
        print('Starting error on mean and covariance combined: ' +\
              str(entry['starting_error_mean_and_covariance']) + '\n')
        
        # Simplifying calling of fitting functions to make fitting scheme code
        # clearer and easier to read.
        fit_amplitudes_lambda = lambda erp_model, with_locations:\
                fit_amplitudes(erp_model, n_gen, seed, mean_data,
                               with_locations=with_locations,
                               max_fun_eval=max_fun_eval)
        fit_variability_lambda = lambda erp_model, with_locations:\
                fit_variability(erp_model, model_type, n_gen, seed, cov_data, 
                               with_locations=with_locations,
                               max_fun_eval=max_fun_eval)
        
        if scheme == 'covariance and locations':
            entry['fits'].append(fit_variability_lambda(erp_model, True))
        elif scheme == 'amplitudes, covariance and locations':
            entry['fits'].append(fit_amplitudes_and_variability(erp_model, 
                    model_type, n_gen, seed, mean_data, cov_data,
                    with_locations=True, max_fun_eval=max_fun_eval))
        if scheme == 'amplitudes and locations, then covariance':
            entry['fits'].append(fit_amplitudes_lambda(erp_model, True))
            entry['fits'].append(fit_variability_lambda(erp_model, False))
        if scheme == 'covariance and locations, then amplitudes':
            entry['fits'].append(fit_variability_lambda(erp_model, True))
            entry['fits'].append(fit_amplitudes_lambda(erp_model, False))
        if scheme == 'amplitudes and locations, then covariance and ' +\
                     'locations, multiple times':
            n_repeats = 10
            for i in range(n_repeats):
                entry['fits'].append(fit_amplitudes_lambda(erp_model, True))
                entry['fits'].append(fit_variability_lambda(erp_model, True))

        #if entry['fits'][-1] != None:
        entry['scheme'] = scheme
        entry['erp_model'] = erp_model
        all_models[scheme][model_type][n_gen][seed] = entry

        entry['final_error_mean'] = error_mean(mean_data, erp_model, [], [])\
                / norm(mean_data, 2)
        entry['final_error_covariance'] = error_cov(cov_data, erp_model, [],
                []) / norm(cov_data.reshape((erp_model.n_el**2,1)), 2)
        entry['final_error_mean_and_covariance'] =\
                error_mean_and_cov(mean_data, cov_data, erp_model, [], [])
        print('Final error on mean: ' + str(entry['final_error_mean']))
        print('Final error on covariance: ' +\
              str(entry['final_error_covariance']))
        print('Final error on mean and covariance combined: ' +\
              str(entry['final_error_mean_and_covariance']) + '\n')
        
    print('Overall time elapsed: ' + str(round(time.time() -\
                                               overall_start_time,2)))

    return all_models