def plot_posterior_nodes(nodes, bins=50, lb=None, ub=None): """Plot interpolated posterior of a list of nodes. :Arguments: nodes : list of pymc.Node's List of pymc.Node's to plot the posterior of bins : int (default=50) How many bins to use for computing the histogram. lb : float (default is to infer from data) Lower boundary to use for plotting. ub : float (default is to infer from data) Upper boundary to use for plotting. """ figure() if lb is None: lb = min([min(node.trace()[:]) for node in nodes]) if ub is None: ub = max([max(node.trace()[:]) for node in nodes]) x_data = np.linspace(lb, ub, 300) for node in nodes: trace = node.trace()[:] #hist = interpolate_trace(x_data, trace, range=(trace.min(), trace.max()), bins=bins) hist = interpolate_trace(x_data, trace, range=(lb, ub), bins=bins) plt.plot(x_data, hist, label=node.__name__, lw=2.) leg = plt.legend(loc='best', fancybox=True) leg.get_frame().set_alpha(0.5)
def plot_posterior_nodes(nodes, bins=50, lb=None, ub=None): """Plot interpolated posterior of a list of nodes. :Arguments: nodes : list of pymc.Node's List of pymc.Node's to plot the posterior of. These can be found in model.nodes_db.node.ix['param_name'] bins : int (default=50) How many bins to use for computing the histogram. lb : float (default is to infer from data) Lower boundary to use for plotting. ub : float (default is to infer from data) Upper boundary to use for plotting. """ figure() if lb is None: lb = min([min(node.trace()[:]) for node in nodes]) if ub is None: ub = max([max(node.trace()[:]) for node in nodes]) x_data = np.linspace(lb, ub, 300) for node in nodes: trace = node.trace()[:] #hist = interpolate_trace(x_data, trace, range=(trace.min(), trace.max()), bins=bins) hist = interpolate_trace(x_data, trace, range=(lb, ub), bins=bins) plt.plot(x_data, hist, label=node.__name__, lw=2.) leg = plt.legend(loc='best', fancybox=True) leg.get_frame().set_alpha(0.5)
def group_plot(model, params_to_plot=(), bins=50, samples=5000, save_to=None): def find_min_max(subj_block): # find global min and max for plotting min = np.inf max = -np.inf for name, subj in subj_block.iterrows(): trace = subj['node'].trace() min = np.min([min, np.min(trace)]) max = np.max([max, np.max(trace)]) return min, max assert model.is_group_model, "group plot only works for group models." # select non-observed subject nodes subj_nodes = model.nodes_db[(model.nodes_db['observed'] == False) & (model.nodes_db['subj'] == True)] knode_names = subj_nodes.groupby(['knode_name', 'tag']) for (knode_name, tag), subj_block in knode_names: min, max = find_min_max(subj_block) # plot interpolated subject histograms #create figure print "plotting %s: %s" % (knode_name, tag) sys.stdout.flush() plt.figure() plt.title("%s: %s" % (knode_name, tag)) x = np.linspace(min, max, 100) ############################################ # plot subjects for name, subj_descr in subj_block.iterrows(): trace = subj_descr['node'].trace() height = interpolate_trace(x, trace, range=(min, max), bins=bins) plt.plot(x, height, lw=1., label=str(np.int32(subj_descr['subj_idx']))) ########################################### # plot group distribution node = subj_descr['node'] group_trace = np.empty(samples, dtype=np.float32) for sample in xrange(samples): # set parents to random value from their trace trace_pos = np.random.randint(0, len(node.trace())) for parent in node.extended_parents: parent.value = parent.trace()[trace_pos] group_trace[sample] = node.random() # TODO: What to do in case of deterministic (e.g. transform) node #except AttributeError: # group_trace[sample] = node.parents.items()[0].random() height = interpolate_trace(x, group_trace, range=(min, max), bins=bins) plt.plot(x, height, '--', lw=2., label='group') ########################################## #legend and title leg = plt.legend(loc='best', fancybox=True) leg.get_frame().set_alpha(0.5) plt.gcf().canvas.set_window_title(knode_name) if save_to is not None: plt.savefig(os.path.join(save_to, "group_%s.png" % knode_name)) plt.savefig(os.path.join(save_to, "group_%s.pdf" % knode_name))