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)
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)