def estimate_hypers(step, problem): """ Get initial estimates of the hyperparameters """ from beat.sampler.base import iter_parallel_chains, init_stage, \ init_chain_hypers logger.info('... Estimating hyperparameters ...') pc = problem.config.problem_config sc = problem.config.hyper_sampler_config pa = sc.parameters name = problem.outfolder ensuredir(name) stage_handler = TextStage(problem.outfolder) chains, step, update = init_stage( stage_handler=stage_handler, step=step, stage=0, progressbar=sc.progressbar, model=problem.model, rm_flag=pa.rm_flag) # setting stage to 1 otherwise only one sample step.stage = 1 step.n_steps = pa.n_steps with problem.model: mtrace = iter_parallel_chains( draws=pa.n_steps, chains=chains, step=step, stage_path=stage_handler.stage_path(1), progressbar=sc.progressbar, model=problem.model, n_jobs=pa.n_jobs, initializer=init_chain_hypers, initargs=(problem,), buffer_size=sc.buffer_size, chunksize=int(pa.n_chains / pa.n_jobs)) for v, i in pc.hyperparameters.iteritems(): d = mtrace.get_values( v, combine=True, burn=int(pa.n_steps * pa.burn), thin=pa.thin, squeeze=True) lower = num.floor(d.min()) - 2. upper = num.ceil(d.max()) + 2. logger.info('Updating hyperparameter %s from %f, %f to %f, %f' % ( v, i.lower, i.upper, lower, upper)) pc.hyperparameters[v].lower = num.atleast_1d(lower) pc.hyperparameters[v].upper = num.atleast_1d(upper) pc.hyperparameters[v].testvalue = num.atleast_1d((upper + lower) / 2.) config_file_name = 'config_' + pc.mode + '.yaml' conf_out = os.path.join(problem.config.project_dir, config_file_name) problem.config.problem_config = pc bconfig.dump(problem.config, filename=conf_out)
def estimate_hypers(step, problem): """ Get initial estimates of the hyperparameters """ logger.info('... Estimating hyperparameters ...') pc = problem.config.problem_config sc = problem.config.hyper_sampler_config pa = sc.parameters name = problem.outfolder util.ensuredir(name) mtraces = [] for stage in range(pa.n_stages): logger.info('Metropolis stage %i' % stage) if stage == 0: point = {param.name: param.testvalue for param in pc.priors} else: point = {param.name: param.random() for param in pc.priors} problem.outfolder = os.path.join(name, 'stage_%i' % stage) start = {param.name: param.random() for param in \ pc.hyperparameters.itervalues()} if pa.rm_flag: shutil.rmtree(problem.outfolder, ignore_errors=True) if not os.path.exists(problem.outfolder): logger.debug('Sampling ...') problem.update_llks(point) logger with problem.model as model: mtraces.append(pm.sample( draws=pa.n_steps, step=step, trace=pm.backends.Text( name=problem.outfolder, model=problem.model), start=start, model=model, chain=stage * pa.n_jobs, njobs=pa.n_jobs, )) else: logger.debug('Loading existing results!') mtraces.append(pm.backends.text.load( name=problem.outfolder, model=problem.model)) mtrace = pm.backends.base.merge_traces(mtraces) outname = os.path.join(name, 'stage_final') if not os.path.exists(outname): util.ensuredir(outname) pm.backends.text.dump(name=outname, trace=mtrace) n_steps = pa.n_steps for v, i in pc.hyperparameters.iteritems(): d = mtrace.get_values( v, combine=True, burn=int(n_steps * pa.burn), thin=pa.thin, squeeze=True) lower = num.floor(d.min(axis=0)) - 0.5 upper = num.ceil(d.max(axis=0)) + 0.5 logger.info('Updating hyperparameter %s from %f, %f to %f, %f' % ( v, i.lower, i.upper, lower, upper)) pc.hyperparameters[v].lower = lower pc.hyperparameters[v].upper = upper pc.hyperparameters[v].testvalue = (upper + lower) / 2. config_file_name = 'config_' + pc.mode + '.yaml' conf_out = os.path.join(problem.config.project_dir, config_file_name) problem.config.problem_config = pc bconfig.dump(problem.config, filename=conf_out)