示例#1
0
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)
示例#2
0
文件: models.py 项目: xiaolongma/beat
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)