コード例 #1
0
    def testMovingSum(self):

        x = num.arange(5)
        assert numeq(
            trace.moving_sum(x, 3, mode='valid'),
            [3, 6, 9], 0.001)
        assert numeq(
            trace.moving_sum(x, 3, mode='full'),
            [0, 1, 3, 6, 9, 7, 4], 0.001)
コード例 #2
0
    def testMovingSum(self):

        x = num.arange(5)
        assert numeq(
            trace.moving_sum(x, 3, mode='valid'),
            [3, 6, 9], 0.001)
        assert numeq(
            trace.moving_sum(x, 3, mode='full'),
            [0, 1, 3, 6, 9, 7, 4], 0.001)
コード例 #3
0
    def draw_figures(self, environ):
        nwindow = 200
        show_raw_acceptance_rates = False
        optimiser = environ.get_optimiser()
        problem = environ.get_problem()
        history = environ.get_history()
        chains = optimiser.chains(problem, history)
        chains.load()

        acceptance = chains.acceptance_history

        nmodels_rate = history.nmodels - (nwindow - 1)
        if nmodels_rate < 1:
            logger.warning(
                'Cannot create plot acceptance: insufficient number of tested '
                'models.')

            return

        acceptance_rate = num.zeros((history.nchains, nmodels_rate))
        for ichain in range(history.nchains):
            acceptance_rate[ichain, :] = trace.moving_sum(
                acceptance[ichain, :], nwindow, mode='valid') / float(nwindow)

        acceptance_n = num.sum(acceptance, axis=0)

        acceptance_any = num.minimum(acceptance_n, 1)

        acceptance_any_rate = trace.moving_sum(
            acceptance_any, nwindow, mode='valid') / float(nwindow)

        acceptance_p = acceptance_n / float(history.nchains)

        popularity = trace.moving_sum(
            acceptance_p, nwindow, mode='valid') \
            / float(nwindow) / acceptance_any_rate

        mpl_init(fontsize=self.font_size)
        fig = plt.figure(figsize=self.size_inch)
        labelpos = mpl_margins(fig, w=7., h=5., units=self.font_size)

        axes = fig.add_subplot(1, 1, 1)
        labelpos(axes, 2.5, 2.0)

        imodels = num.arange(history.nmodels)

        imodels_rate = imodels[nwindow - 1:]

        axes.plot(acceptance_n / history.nchains * 100.,
                  '.',
                  ms=2.0,
                  color=mpl_color('skyblue2'),
                  label='Popularity of Accepted Models',
                  alpha=0.3)

        if show_raw_acceptance_rates:
            for ichain in range(chains.nchains):
                axes.plot(imodels_rate,
                          acceptance_rate[ichain, :] * 100.,
                          color=mpl_color('scarletred2'),
                          alpha=0.2)

        axes.plot(imodels_rate,
                  popularity * 100.,
                  color=mpl_color('skyblue2'),
                  label='Popularity (moving average)')
        axes.plot(imodels_rate,
                  acceptance_any_rate * 100.,
                  color='black',
                  label='Acceptance Rate (any chain)')

        axes.legend()

        axes.set_xlabel('Iteration')
        axes.set_ylabel('Acceptance Rate, Model Popularity')

        axes.set_ylim(0., 100.)
        axes.set_xlim(0., history.nmodels - 1)
        axes.grid(alpha=.2)
        axes.yaxis.set_major_formatter(FuncFormatter(lambda v, p: '%d%%' % v))

        iiter = 0
        bgcolors = [mpl_color('aluminium1'), mpl_color('aluminium2')]
        for iphase, phase in enumerate(optimiser.sampler_phases):
            axes.axvspan(iiter,
                         iiter + phase.niterations,
                         color=bgcolors[iphase % len(bgcolors)])

            iiter += phase.niterations

        yield (PlotItem(name='acceptance',
                        description=u'''
Acceptance rate (black line) within a moving window of %d iterations.

A model is considered accepted, if it is accepted in at least one chain. The
popularity of accepted models is shown as blue dots. Popularity is defined as
the percentage of chains accepting the model (100%% meaning acceptance in all
chains). A moving average of the popularities is shown as blue line (same
averaging interval as for the acceptance rate). Different background colors
represent different sampler phases.
''' % nwindow), fig)

        mpl_init(fontsize=self.font_size)
        fig = plt.figure(figsize=self.size_inch)
        labelpos = mpl_margins(fig, w=7., h=5., units=self.font_size)

        axes = fig.add_subplot(1, 1, 1)
        labelpos(axes, 2.5, 2.0)

        nwindow2 = max(1, int(history.nmodels / (self.size_inch[1] * 100)))
        nmodels_rate2 = history.nmodels - (nwindow2 - 1)
        acceptance_rate2 = num.zeros((history.nchains, nmodels_rate2))
        for ichain in range(history.nchains):
            acceptance_rate2[ichain, :] = trace.moving_sum(
                acceptance[ichain, :], nwindow2, mode='valid') \
                / float(nwindow2)

        imodels_rate2 = imodels[nwindow2 - 1:]

        axes.pcolormesh(imodels_rate2,
                        num.arange(history.nchains),
                        num.log(0.01 + acceptance_rate2),
                        cmap='GnBu')

        if history.sampler_contexts is not None:
            axes.plot(imodels,
                      history.sampler_contexts[:, 1],
                      '.',
                      ms=2.0,
                      color='black',
                      label='Breeding Chain',
                      alpha=0.3)

        axes.set_xlabel('Iteration')
        axes.set_ylabel('Bootstrap Chain')
        axes.set_xlim(0, history.nmodels - 1)
        axes.set_ylim(0, history.nchains - 1)

        axes.xaxis.grid(alpha=.4)

        yield (PlotItem(name='acceptance_img',
                        description=u'''
Model acceptance per bootstrap chain averaged over %d models (background color,
low to high acceptance as light to dark colors).

Black dots mark the base chains used when sampling new models (directed sampler
phases only).
''' % nwindow2), fig)